source: branches/1.3/include/vtemplate.class.php @ 6493

Last change on this file since 6493 was 546, checked in by z0rglub, 20 years ago

bug 50 : PHP 5.x incompatibility

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