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

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

to make it work on nexen.net

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