source: trunk/include/vtemplate.class.php @ 2

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

Initial revision

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