source: tags/release-1_3beta/include/vtemplate.class.php @ 4108

Last change on this file since 4108 was 63, checked in by z0rglub, 21 years ago

indention of PHP code improved : file becomes more readable :-)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.9 KB
Line 
1<?php
2/*****************************************************************
3 *                      VIRTUAL-TEMPLATE
4 *
5 * Version : 1.3.2 Base Edition ( Decembre 2003 ) build 1
6 *
7 * Address : http://vtemplate.sourceforge.net
8 *
9 * Authors:
10 *   + THIEBAUT Jean-Baptiste(J.Baptiste@leweby.com)  -  http://www.leweby.com .
11 *   + CAMPANA François (fc@netouaibe.com).
12 * Licence: GPL.
13 *
14 *
15 *
16 *                       
17 *****************************************************************/ 
18
19if ( !isset( $DEFINE_VTEMPLATE ) )
20{
21  define("ALL",1);
22  // Tag d'ouverture des variables : vous pouvez changer ce paramètre.
23  define("VARTAG","{#");
24  define("VTEMPLATE_VERSION","1.3.1");
25  define("VTEMPLATE_TYPE","BA");
26  define("VTEMPLATE_BUILD","6");
27 
28  class Err {
29    var $msg;
30    var $titre;
31
32    function error( $errno, $arg = "", $code = 0, $disp = 0 ) {
33      // Gestion des erreurs
34      switch ( $errno )
35      {
36      case 1:
37        $this->titre="Erreur de session n° $code";
38        $this->msg = "La zone $arg est déjà ouverte.Avant d'ajouter une session sur cette zone, vous devez la fermer à l'aide de la fonction closeSession().<br>"       ;
39        break;
40      case 2:
41        $this->titre="Erreur de session n° $code";
42        $this->msg = "Vous tentez de fermer une session de la zone $arg alors qu'aucune session pour cette zone n'existe.Pour ouvrir une session, utilisez la fonction addSession().<br>";
43        break;
44      case 3:
45        $this->titre="Erreur de session n° $code";
46        $var = $arg[1];
47        $zone = $arg[0];
48        $this->msg = "Vous essayez de valoriser la variable $var sans avoir créer de session de la zone $zone.Utilisez la fonction addSession() pour créer une session, puis setVar pour valoriser une variable.<br>";
49        break;
50      case 4:
51        $this->titre="Erreur de session n° $code";
52        $var = $arg[1];
53        $zone = $arg[0];
54        $this->msg = "La variable $var que vous souhaitez valoriser n'existe pas dans la zone $zone.<br>";
55        break;
56      case 5:
57        $this->titre="Erreur de parsing n° $code";
58        $this->msg = "Vous utilisez des caractère non autorisés pour déclarer vos zones.Vous pouvez utiliser tous les caractères à l'exception de \'{\' , \'#\' \'}\' et \'|\'.<br>";
59        break;
60      case 6:
61        $this->titre="Erreur de parsing n° $code";
62        $this->msg = "Vous ne pouvez pas utiliser le même nom ($arg)de zone plusieurs fois.<br>";
63        break;
64      case 7:
65        $this->titre="Erreur de parsing n° $code";
66        $this->msg = "Vous avez oublié de fermer la zone $arg.<br>";
67        break;
68      case 8:
69        $this->titre="Erreur de traitement n° $code";
70        $this->msg = "Le fichier template $arg est introuvable.<br>";
71        break;
72      case 9:
73        $this->titre="Erreur de traitement n° $code";
74        $this->msg = "Impossible d'ouvrir le fichier $arg.Vérifiez les droits de ce fichier.<br>";
75        break;
76      case 10:
77        $this->titre="Erreur de traitement n° $code";
78        $this->msg = "Impossible de lire le fichier template $arg.<br>";
79        break;
80      case 11:
81        $this->titre="Erreur de traitement n° $code";
82        $this->msg = "La zone $arg est introuvable.Vérifiez la syntaxe de cette zone.<br>"; 
83        break;
84      case 12: 
85        $this->titre="Erreur de traitement n° $code";
86        $this->msg = "La variable $arg est introuvable .Vérifiez la syntaxe de la variable.<br>";       
87        break;
88      case 13:
89        $this->titre="Erreur de traitement n° $code";
90        $this->msg = "L'identifiant de fichier spécifié n'existe pas.Vérifiez les fonctions Open() de votre script.<br>";
91        break; 
92      case 14:
93        $this->titre="Erreur de traitement n° $code";
94        $var = $arg[1];
95        $file = $arg[0];
96        $this->msg = "La variable $var dans le fichier $file est introuvable.Vérifiez la syntaxe de la variable.<br>"; 
97        break; 
98      case 15:
99        $this->titre="Erreur de traitement n° $code";
100        $var = $arg[2];
101        $zone = $arg[1];
102        $fichier = $arg[0];
103        $this->msg = "La variable $var dans la zone $zone du fichier $fichier est introuvable.Vérifiez la syntaxe de la variable et du nom de la zone.<br>";
104        break; 
105      default:
106        $this->titre = "Erreur inconnue $code"; 
107        $this->msg = "Veuillez le rapporter aux auteurs de la classe.";
108      }
109      $this->titre .= ": <br>";
110      if ( $disp )
111      {
112        $web = "Pour plus d'informations, consultez la <a href=\"http://www.virtual-solution.net/vtemplate/docs/debug-mod.php?version=".VTEMPLATE_VERSION."&build=".VTEMPLATE_BUILD."&type=".VTEMPLATE_TYPE."&error=$code\" target=\"_blank\">doc en ligne</a>";
113        echo "<font face=verdana size=2 color=red><u>$this->titre</u><i>$this->msg</i>$web<br><br></font>";
114      }
115      return -1;
116    }
117  } // Fin classe
118
119  class Session extends err {
120    var $name;          // Name of the session
121    var $globalvar = array();  // List of global variable of the session
122    var $varlist = array();  // List of var in this session
123    var $subzone = array(); // list of sub-zone
124    var $temp; // Generated code for the current session
125    var $generated = NULL; // The final code
126    var $source; // Source code
127    var $used=0; // Indicates if the session contain used variable
128    var $stored; // Give the filename were is stored the session
129
130    function Session( $name, $source, $stored ) {
131      $this->name = $name;
132      $this->source = $source;
133      $this->stored = $stored;
134      $this->parseVar();
135    }
136
137    function parseVar(){
138      // Récupération des noms des variables
139      $regle = "|".VARTAG."(.*)}|sU"; 
140      preg_match_all ($regle,$this->source,$var1);
141      // Création du tableau de variable  à partir de la liste parsée.
142      $this->varlist=@array_merge($var[1],$var1[1]);
143      return 1;
144    }
145
146    function init(){
147      if ( $this->used )
148        return $this->error(1,array($this->stored,$this->name),"SESSION1",1);
149      // Reset generated code
150      $this->temp = $this->source;
151      $this->used = 1;
152    }
153
154    function closeSession(){
155      // Check if the zone has been used.   
156      if ( !$this->used )
157        return $this->error(2,array($this->stored,$this->name),"SESSION2",1);
158      // Set Globals vars.
159      $this->generateCode();
160      $this->used=0;
161      return 1;
162    }
163
164    function reset(){
165      $this->used = 0;
166      $this->generated = NULL;
167      return 1;
168    }
169
170    function addSubZone( &$subzone ) {
171      $this->subzone[$subzone->name] = &$subzone;
172      return 1;
173    }
174
175    function setVar($varname,$value){
176      if ( !$this->used )
177        return $this->error(3,array($this->stored,$this->name,$varname),
178                            "SESSION3",1);
179      if (!in_array($varname,$this->varlist))
180        return $this->error(4,array($this->name,$varname),"SESSION4",1);
181      $regle = "(\\".VARTAG."$varname\})";
182      $this->temp = preg_replace($regle,$value,$this->temp);
183      return 1;
184    }
185
186    function dispVar(){
187      echo "Liste variables de $this->name:<br>";
188      foreach ( $this->varlist as $vars ) echo "$vars <br>";
189    }
190
191    function setGlobalVar($varname,$value){
192      $set = 0;
193      if (in_array($varname,$this->varlist ) )
194      {
195        // Replace the var into this session
196        $this->globalvar[$varname]=$value;   
197        $set = 1;
198      }
199      // Replace the var into sub zones
200      foreach(array_keys($this->subzone) as $subzone){
201        $set = $this->subzone[$subzone]->setGlobalVar($varname,$value) || $set;
202      }
203      return $set;
204    }
205
206    function replaceGlobalVar(){
207      if ( count($this->globalvar) )
208      {
209        foreach($this->globalvar as $varname => $value) {
210          $regle = "(\\".VARTAG."$varname\})";
211          $this->temp = preg_replace($regle,$value,$this->temp);
212        }
213      }
214    }
215
216
217    function generateCode(){
218      if ($this->used == 0) return $this->generated;
219      // Replace global var.
220      if ( count($this->globalvar) ) $this->replaceGlobalVar();
221      // Replace all unused variable by ""
222      $regle = "|\\".VARTAG."([^}]*)\}|";
223      $this->temp = preg_replace($regle,"",$this->temp);
224      // Generate the subzone(s) code
225      if(count($this->subzone)){
226        foreach(array_keys($this->subzone) as $subzone){
227          $text = ($this->subzone[$subzone]->used) ? $this->subzone[$subzone]->generateCode() : $this->subzone[$subzone]->generated;
228          $this->temp = preg_replace("(\|$subzone\|)",$text,$this->temp);       
229          $this->subzone[$subzone]->reset();
230        }
231      }
232      $this->generated .= $this->temp;
233      return $this->generated;
234    }
235
236    function inVarList($varname){
237      return in_array($varname,$this->varlist);
238    }
239  } // Fin classe
240
241  class VTemplate_Private extends Err{
242    /****************************************
243     *          Private Class.              *
244     ****************************************/
245
246    var $sources=array(); // Sources des zones issues
247                          // de la premiere partie du parsing.
248    var $sessions=array(); // Tableau de sessions
249    var $v_global=array(); // Globla var array.
250
251/****************************************************************
252            Parsing Functions for Template files.  ( PF 1.0 )
253 ****************************************************************/
254
255    function getNom($code){
256      // Retourne le premier nom de zone qu'il trouve dans le code
257      preg_match("(<!--VTP_([^()]+)-->)sU",$code,$reg);   
258      // Tester la présence des caratère invalides dans le nom ( | et {});
259      if ( @count( explode("|",$reg[1]))>1
260           || @count(explode("{",$reg[1]))>1
261           || @count(explode("}",$reg[1]))>1 )
262        exit($this->error(5,$reg[1],"PARSE1",1));
263      return @$reg[1];
264    }
265
266    function endTag($code,$nom){
267      // Renvoie TRUE(1) si le tag de fermeture est présent.
268      preg_match("(<!--/VTP_$nom-->)sU",$code,$reg);
269      return ($reg[0]!="<!--/VTP_$nom-->") ? 0 : 1;
270    }
271
272    function getSource($code,$nom,$type=0){
273      // Retourne le source de la zone de nom $nom
274      preg_match_all ("(<!--VTP_$nom-->(.*)<!--/VTP_$nom-->)sU",$code,$reg);
275      return $reg[$type][0];
276    }
277
278    function parseZone($code_source,$nom_zone="|root|"){
279      // Fonction récursive de parsing du fichier template
280      // Vérification que la zone n'existe pas
281      if (isset($this->sources[$nom_zone]))
282        exit($this->error(6,$nom_zone,"PARSE2",1));
283      // Enregistrement du code source
284      $this->sources[$nom_zone]["source"]=$code_source;
285      // Rappel de la fonction pour chaque fils.
286      while ($nom_fils=$this->getNom($this->sources[$nom_zone]["source"]) ) {
287        // Vérification que le tag de fin est présent.
288        if (!$this->endTag($code_source,$nom_fils))
289          exit($this->error(7,$nom_fils,"PARSE3",1));
290        // Parse le fils
291        $this->parseZone($this->getSource($this->sources[$nom_zone]["source"],$nom_fils,1),$nom_fils);
292        // Enregistre le nom du fils dans la liste des fils
293        $this->sources[$nom_zone]["fils"][]=$nom_fils;
294        // Remplace le code du fils dans le source du père
295        $this->sources[$nom_zone]["source"]=str_replace(
296          $this->getSource($this->sources[$nom_zone]["source"],$nom_fils,0),
297          "|$nom_fils|",
298          $this->sources[$nom_zone]["source"]);
299        // Teste si la zone $nom_fils n'existe pas plusieurs fois
300        // dans la zone $nom_zone
301        if (count(explode("|$nom_fils|",$this->sources[$nom_zone]["source"]))>2)
302          exit($this->error(6,$nom_fils,"PARSE4",1));
303      } // fin While
304      return 1;
305    }
306
307/****************************************************************
308            Session Management functions ( SMF 1.0 )
309 ****************************************************************/
310
311    function createSession($handle,$zone = "|root|"){
312      // Create a new session of the zone
313      $this->sessions[$handle][$zone] = new Session($zone,$this->sources[$zone]["source"],$this->file_name[$handle]);
314      // Create sub-zone
315      if (@count($this->sources[$zone]["fils"])){
316        foreach($this->sources[$zone]["fils"] as $subzone){       
317          $this->createSession($handle,$subzone);
318          $this->sessions[$handle][$zone]->addSubZone($this->sessions[$handle][$subzone]);
319        }
320      }
321      //end createSession
322    }
323
324
325/****************************************************************
326            Global Variable Management Functions ( GVMF 1.0 )
327 ****************************************************************/
328
329    function setGZone($handle,$zone,$var,$value){
330      // Define Global var for $zone and its sub-zone.
331      // Set global value to $zone vars.
332      return $this->sessions[$handle][$zone]->setGlobalVar($var,$value);
333    }
334
335    function setGFile($handle,$var,$value) {
336      return $this->sessions[$handle]["|root|"]->setGlobalVar($var,$value);
337    }
338
339    function setGAll($var,$value){
340      $declare = 0;
341      $this->v_global[$var]=$value;
342      if (is_array($this->sessions)){
343        foreach($this->sessions as $handle => $v){
344          $declare = $this->setGFile($handle,$var,$value) || $declare;
345        }       
346      } 
347      return $declare;
348    }
349
350    function setGOpened($handle){
351// Set Global var into the opened file
352      foreach($this->v_global as $name => $val){
353        $this->setGFile($handle,$name,$val);
354      }
355      return 1;
356    }
357 
358// Fin VTemplate_Private
359  }
360
361
362  class VTemplate extends VTemplate_Private{
363/****************************************
364 *         Public Class.                *
365 * ***************************************/
366
367
368/****************************************************************
369            Core Functions
370*****************************************************************/
371
372
373    function Open($nomfichier){
374// Ouverture d'un fichier source et retourne le handle de ce fichier
375// Création du handle:
376      $handle =  "{".count($this->sessions)."}" ;
377
378
379// Récupération du source à parser
380      if (!@file_exists($nomfichier)) return $this->error(8,$nomfichier,"TTT1",1);
381      if (!$f_id=@fopen($nomfichier,"r")) return $this->error(9,$nomfichier,"TTT2",1);
382      if (!$source=@fread($f_id, filesize($nomfichier))) return $this->error(10,$nomfichier,"TTT3",1);
383      clearstatcache();
384      fclose($f_id);
385
386// Store the filename
387      $this->file_name[$handle]=$nomfichier;
388
389// Parse les zones
390      $this->parseZone($source);
391
392// Création du tableau de session
393      $this->createSession($handle);
394
395//Nettoyage des variables temporaires
396      $this->sources=NULL;
397
398// Set global var.
399      $this->setGOpened($handle);
400
401      $this->addSession($handle);
402      return $handle;
403    }
404
405    function newSession($handle="{0}",$nom_zone = "|root|"){
406      if ( $this->sessions[$handle][$nom_zone]->used ) $this->closeSession($handle,$nom_zone);
407      $this->addSession($handle,$nom_zone,$cache,$time,$num_session);
408      return 1;
409    }
410
411    function addSession($handle="{0}",$nom_zone = "|root|"){
412      // Does the zone exist ?
413      if(!isset($this->sessions[$handle][$nom_zone])) return $this->error(11,array($nom_zone,$this->file_name[$handle]),"TTT4",1);   
414      $this->sessions[$handle][$nom_zone]->init();
415      return 1;
416    }
417
418    function closeSession($handle="{0}",$nom_zone = "|root|"){ 
419// Close the current session and all his sub-session
420      // Check if the zone exists.
421      if(!isset($this->sessions[$handle][$nom_zone])) return $this->error(11,array($nom_zone,$this->file_name[$handle]),"TTT5",1);
422      // Closing sub-zone
423      $this->sessions[$handle][$nom_zone]->closeSession();     
424      return 1;
425    }
426
427    function setGlobalVar($arg1,$arg2,$arg3){
428      if ($arg1 == 1){
429        if (!$this->setGAll($arg2,$arg3)) return $this->error(12,$arg2,"TTT6",1);
430        return 1; 
431      }
432      if (!isset($this->sessions[$arg1])) return $this->error(13,$arg1,"TTT7",1);
433      $tab=explode(".",$arg2);
434      if (count($tab)==1){
435        if (!$this->setGFile($arg1,$arg2,$arg3)) return $this->error(14,array($this->file_name[$arg1],$arg2),"TTT8",1);
436      }
437      else if (count($tab==2)){
438        if (!isset($this->sessions[$arg1][$tab[0]])) return $this->error(11,array($tab[0],$this->file_name[$arg1],"TTT9",1));
439        if (!$this->setGZone($arg1,$tab[0],$tab[1],$arg3)) return $this->error(15,array($this->file_name[$arg1],$tab[0],$tab[1]),"TTT10",1);
440      }
441      return 1;
442    }
443
444    function setVar($handle,$zone_var,$val){
445      // Fill the variable
446      $tab=explode(".",$zone_var);
447      if(count($tab)==2){
448        $zone=$tab[0];
449        $var=$tab[1];
450      }
451      else
452      {
453        $zone="|root|";
454        $var=$tab[0];
455      }
456
457      // Teste l'existence de la zone dans la liste
458      if (!isset($this->sessions[$handle][$zone])) return $this->error(11,array($this->file_name[$handle],$zone),"TTT11",1);
459
460      //Enregistre la variable
461      return $this->sessions[$handle][$zone]->setVar($var,$val);
462    }
463
464    function Parse($handle_dest,$zone_var_dest,$handle_source,$zone_source="|root|"){
465      if($this->sessions[$handle_source][$zone_source]->used == 1) $this->closeSession($handle_source,$zone_source);
466      $this->setVar($handle_dest,$zone_var_dest, $this->sessions[$handle_source][$zone_source]->generated);
467    }
468
469    function setVarF($handle,$zone_var,$file){
470// Fonction qui ouvre le fichier file et copie ce qu'il y a dedans dans une variable.
471      $tab=explode(".",$zone_var);
472
473// Récupération nom de la zone et de la variable.
474      if(count($tab)==2){
475        $zone=$tab[0];
476        $var=$tab[1];
477      }
478      else
479      {
480        $zone="|root|";
481        $var=$tab[0];
482      }
483// Teste l'existence de la zone dans la liste
484      if (!is_object($this->sessions[$handle][$zone])) return $this->error(11,array($handle,$zone),"TTT12",1);
485
486      // Récupération du source à lire
487      if (!@file_exists($file)) return $this->error(8,$file,"TTT13",1);
488      if (!$f_id=@fopen($file,"r")) return $this->error(9,$file,"TTT14",1);
489      if (!$val=@fread($f_id, filesize($file))) return $this->error(10,$file,"TTT15",1);
490      clearstatcache();
491      fclose($f_id);
492
493//Enregistre la variable
494      return $this->sessions[$handle][$zone]->setVar($var,$val);
495    }
496
497
498
499
500
501    function isZone($handle, $zone="|root|") 
502      { 
503        return isset($this->sessions[$handle][$zone]) ; 
504      } 
505
506    function Display($handle="{0}",$display=1,$zone="|root|"){
507      $this->closeSession($handle,$zone);
508      $c_genere = $this->sessions[$handle][$zone]->generated; 
509       
510      if ($display) echo $c_genere; else return ($c_genere);
511    }
512//fonction complementaire version BETA
513
514/*
515 *
516 On peut l'utiliser :
517- SetVarTab($array): tout les couples clef/valeur sont valorisées
518- SetVarTab($array,$index) seuls les couples clef/valeur dont la clef est dans le tableau index ou dont la valeur == $index (si pas tableau)
519Si $index contient ou est une clef de type zone.clef, la clef sera extraite du texte est servira d'index pour $array
520
521Vincent
522*/
523
524    function setVarTab($handle,$zones,$index = array()){ 
525      if (is_array($index)) 
526      { 
527        if (count($index)>0) 
528        { 
529          reset($index); 
530          while (list (, $key) = each ($index)) 
531          { 
532            $tab=explode(".",$key); 
533            if(count($tab)==2){ 
534              $var=$tab[1]; 
535            } 
536            else 
537            { 
538              $var=$tab[0]; 
539            } 
540            setVar($handle,$key,$zones[$var]); 
541          } 
542        } 
543        else 
544        { 
545          reset($zones); 
546          while (list ($key, $val) = each ($zones)) 
547          { 
548            setVar($handle,$key,$val); 
549          } 
550        } 
551      } 
552      else 
553      { 
554        setVar($handle,$index,$zones[$index]); 
555      } 
556    } 
557
558    function setGlobalVarTab($handle,$zones,$index = array()){ 
559      if (is_array($index)) 
560      { 
561        if (count($index)>0) 
562        { 
563          reset($index); 
564          while (list (, $key) = each ($index)) 
565          { 
566            $tab=explode(".",$key); 
567            if ( count( $tab ) == 2 ) $var=$tab[1]; 
568            else                      $var=$tab[0]; 
569            setGlobalVar( $handle, $key, $zones[$var] );
570          } 
571        } 
572        else 
573        { 
574          reset($zones); 
575          while (list ($key, $val) = each ($zones)) 
576          {
577            GlobalVar($handle,$key,$val); 
578          } 
579        } 
580      } 
581      else 
582      {
583        setBlobalVar($handle,$index,$zones[$index]); 
584      } 
585    } 
586    // End VTemplate
587  }
588  $DEFINE_VTEMPLATE = 1;
589}
590?>
Note: See TracBrowser for help on using the repository browser.