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

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

* empty log message *

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.6 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) ){
20define("ALL",1);
21define("VARTAG","{#"); // Tag d'ouverture des variables : vous pouvez changer ce paramètre.
22define("VTEMPLATE_VERSION","1.3.1");
23define("VTEMPLATE_TYPE","BA");
24define("VTEMPLATE_BUILD","6");
25
26
27class Err {
28var $msg;
29var $titre;
30
31function error($errno,$arg="",$code=0,$disp=0){
32// Gestion des erreurs
33switch($errno){
34  case 1:
35    $this->titre="Erreur de session n° $code";
36    $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>"   ;
37  break;
38  case 2:
39    $this->titre="Erreur de session n° $code";
40    $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>";
41  break;
42  case 3:
43    $this->titre="Erreur de session n° $code";
44        $var = $arg[1];
45        $zone = $arg[0];
46    $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>";
47  break;
48  case 4:
49    $this->titre="Erreur de session n° $code";
50        $var = $arg[1];
51        $zone = $arg[0];
52    $this->msg = "La variable $var que vous souhaitez valoriser n'existe pas dans la zone $zone.<br>";
53  break;
54  case 5:
55    $this->titre="Erreur de parsing n° $code";
56    $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>";
57  break;
58  case 6:
59    $this->titre="Erreur de parsing n° $code";
60    $this->msg = "Vous ne pouvez pas utiliser le même nom ($arg)de zone plusieurs fois.<br>";
61  break;
62  case 7:
63    $this->titre="Erreur de parsing n° $code";
64    $this->msg = "Vous avez oublié de fermer la zone $arg.<br>";
65  break;
66  case 8:
67    $this->titre="Erreur de traitement n° $code";
68    $this->msg = "Le fichier template $arg est introuvable.<br>";
69  break;
70  case 9:
71    $this->titre="Erreur de traitement n° $code";
72    $this->msg = "Impossible d'ouvrir le fichier $arg.Vérifiez les droits de ce fichier.<br>";
73  break;
74  case 10:
75    $this->titre="Erreur de traitement n° $code";
76    $this->msg = "Impossible de lire le fichier template $arg.<br>";   
77  break;
78  case 11:
79    $this->titre="Erreur de traitement n° $code";
80    $this->msg = "La zone $arg est introuvable.Vérifiez la syntaxe de cette zone.<br>"; 
81  break;
82  case 12: 
83    $this->titre="Erreur de traitement n° $code";
84    $this->msg = "La variable $arg est introuvable .Vérifiez la syntaxe de la variable.<br>";   
85  break;
86  case 13:
87    $this->titre="Erreur de traitement n° $code";
88    $this->msg = "L'identifiant de fichier spécifié n'existe pas.Vérifiez les fonctions Open() de votre script.<br>";
89  break; 
90  case 14:
91    $this->titre="Erreur de traitement n° $code";
92        $var = $arg[1];
93        $file = $arg[0];
94    $this->msg = "La variable $var dans le fichier $file est introuvable.Vérifiez la syntaxe de la variable.<br>";     
95  break; 
96  case 15:
97    $this->titre="Erreur de traitement n° $code";
98        $var = $arg[2];
99        $zone = $arg[1];
100        $fichier = $arg[0];
101    $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>";       
102  break; 
103  default:
104         $this->titre = "Erreur inconnue $code";         
105     $this->msg = "Veuillez le rapporter aux auteurs de la classe.";
106}
107$this->titre .= ": <br>";
108if ($disp){
109        $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>";
110        echo "<font face=verdana size=2 color=red><u>$this->titre</u><i>$this->msg</i>$web<br><br></font>";
111} 
112return -1;
113}
114// Fin classe
115}
116
117class Session extends err{
118
119var $name;              // Name of the session
120var $globalvar = array();  // List of global variable of the session
121var $varlist = array();  // List of var in this session
122var $subzone = array(); // list of sub-zone
123var $temp; // Generated code for the current session
124var $generated = NULL; // The final code
125var $source; // Source code
126var $used=0; // Indicates if the session contain used variable
127var $stored; // Give the filename were is stored the session
128
129function Session($name,$source,$stored){
130 $this->name = $name;
131 $this->source = $source;
132 $this->stored = $stored;
133 $this->parseVar();
134}
135
136function parseVar(){
137 // Récupération des noms des variables
138 $regle = "|".VARTAG."(.*)}|sU"; 
139 preg_match_all ($regle,$this->source,$var1);
140 // Création du tableau de variable  à partir de la liste parsée.
141 $this->varlist=@array_merge($var[1],$var1[1]);
142return 1;
143} 
144
145function init(){
146if($this->used) return $this->error(1,array($this->stored,$this->name),"SESSION1",1);
147// Reset generated code
148$this->temp = $this->source;
149$this->used = 1;
150}
151function closeSession(){
152// Check if the zone has been used.   
153if(!$this->used) return $this->error(2,array($this->stored,$this->name),"SESSION2",1);
154// Set Globals vars.
155$this->generateCode();
156$this->used=0;
157return 1;
158}
159
160function reset(){
161$this->used = 0;
162$this->generated = NULL;
163return 1;
164}
165
166function addSubZone(&$subzone){
167$this->subzone[$subzone->name] = &$subzone;
168return 1;
169}
170
171function setVar($varname,$value){
172if (!$this->used) return $this->error(3,array($this->stored,$this->name,$varname),"SESSION3",1);
173if (!in_array($varname,$this->varlist)) return $this->error(4,array($this->name,$varname),"SESSION4",1);
174$regle = "(\\".VARTAG."$varname\})";
175$this->temp = preg_replace($regle,$value,$this->temp);
176return 1;
177}
178
179function dispVar(){
180 echo "Liste variables de $this->name:<br>";
181 foreach ( $this->varlist as $vars )
182    echo "$vars <br>";
183}
184
185function setGlobalVar($varname,$value){
186$set = 0;
187if (in_array($varname,$this->varlist)){
188  // Replace the var into this session
189  $this->globalvar[$varname]=$value;   
190  $set = 1;
191}
192  // Replace the var into sub zones
193  foreach(array_keys($this->subzone) as $subzone){
194      $set = $this->subzone[$subzone]->setGlobalVar($varname,$value) || $set;
195  }
196  return $set;
197}
198
199function replaceGlobalVar(){
200if ( count($this->globalvar) )
201foreach($this->globalvar as $varname => $value){
202  $regle = "(\\".VARTAG."$varname\})";
203  $this->temp = preg_replace($regle,$value,$this->temp);
204}
205}
206
207
208function generateCode(){
209    if ($this->used == 0) return $this->generated;
210    // Replace global var.
211        if ( count($this->globalvar) ) $this->replaceGlobalVar();
212        // Replace all unused variable by ""
213    $regle = "|\\".VARTAG."([^}]*)\}|";
214        $this->temp = preg_replace($regle,"",$this->temp);
215        // Generate the subzone(s) code
216        if(count($this->subzone)){
217          foreach(array_keys($this->subzone) as $subzone){
218                $text = ($this->subzone[$subzone]->used) ? $this->subzone[$subzone]->generateCode() : $this->subzone[$subzone]->generated;
219                $this->temp = preg_replace("(\|$subzone\|)",$text,$this->temp);         
220                $this->subzone[$subzone]->reset();
221          }
222    }
223$this->generated .= $this->temp;
224return $this->generated;
225}
226
227function inVarList($varname){
228return in_array($varname,$this->varlist);
229}
230
231// Fin classe
232}
233
234class VTemplate_Private extends Err{
235/****************************************
236*          Private Class.               *
237* ***************************************/
238
239var $sources=array(); // Sources des zones issues de la premiere partie du parsing.
240var $sessions=array(); // Tableau de sessions
241var $v_global=array(); // Globla var array.
242
243/****************************************************************
244            Parsing Functions for Template files.  ( PF 1.0 )
245 ****************************************************************/
246
247function getNom($code){
248// Retourne le premier nom de zone qu'il trouve dans le code
249
250   preg_match("(<!--VTP_([^()]+)-->)sU",$code,$reg);
251   
252   // Tester la présence des caratère invalides dans le nom ( | et {});
253   if (@count(explode("|",$reg[1]))>1 || @count(explode("{",$reg[1]))>1 || @count(explode("}",$reg[1]))>1) exit($this->error(5,$reg[1],"PARSE1",1));
254   
255   return @$reg[1];
256}
257
258function endTag($code,$nom){
259// Renvoie TRUE(1) si le tag de fermeture est présent.
260
261   preg_match("(<!--/VTP_$nom-->)sU",$code,$reg);
262
263return ($reg[0]!="<!--/VTP_$nom-->") ? 0 : 1;
264}
265
266function getSource($code,$nom,$type=0){
267// Retourne le source de la zone de nom $nom
268
269   preg_match_all ("(<!--VTP_$nom-->(.*)<!--/VTP_$nom-->)sU",$code,$reg);
270
271return $reg[$type][0];
272}
273
274function parseZone($code_source,$nom_zone="|root|"){
275// Fonction récursive de parsing du fichier template
276   // Vérification que la zone n'existe pas
277   if (isset($this->sources[$nom_zone])) exit($this->error(6,$nom_zone,"PARSE2",1));
278
279   // Enregistrement du code source
280   $this->sources[$nom_zone]["source"]=$code_source;
281
282   // Rappel de la fonction pour chaque fils.
283   while($nom_fils=$this->getNom($this->sources[$nom_zone]["source"])){
284
285     // Vérification que le tag de fin est présent.
286     if (!$this->endTag($code_source,$nom_fils)) exit($this->error(7,$nom_fils,"PARSE3",1));
287
288     // Parse le fils
289     $this->parseZone($this->getSource($this->sources[$nom_zone]["source"],$nom_fils,1),$nom_fils);
290
291     // Enregistre le nom du fils dans la liste des fils
292     $this->sources[$nom_zone]["fils"][]=$nom_fils;
293
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                                     );
300     // Teste si la zone $nom_fils n'existe pas plusieurs fois dans la zone $nom_zone
301     if (count(explode("|$nom_fils|",$this->sources[$nom_zone]["source"]))>2) exit($this->error(6,$nom_fils,"PARSE4",1));
302   }// fin While
303
304return 1;
305}
306
307/****************************************************************
308            Session Management functions ( SMF 1.0 )
309 ****************************************************************/
310
311function 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
315// Create sub-zone
316if (@count($this->sources[$zone]["fils"])){
317   foreach($this->sources[$zone]["fils"] as $subzone){   
318    $this->createSession($handle,$subzone);
319    $this->sessions[$handle][$zone]->addSubZone($this->sessions[$handle][$subzone]);
320   }
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
337function setGFile($handle,$var,$value) {
338  return $this->sessions[$handle]["|root|"]->setGlobalVar($var,$value);
339}
340
341function setGAll($var,$value){
342$declare = 0;
343$this->v_global[$var]=$value;
344if (is_array($this->sessions)){
345    foreach($this->sessions as $handle => $v){
346                $declare = $this->setGFile($handle,$var,$value) || $declare;
347                }       
348  } 
349return $declare;
350}
351
352function setGOpened($handle){
353// Set Global var into the opened file
354foreach($this->v_global as $name => $val){
355  $this->setGFile($handle,$name,$val);
356}
357return 1;
358}
359 
360// Fin VTemplate_Private
361}
362
363
364class VTemplate extends VTemplate_Private{
365/****************************************
366*          Public Class.                *
367* ***************************************/
368
369
370/****************************************************************
371            Core Functions
372*****************************************************************/
373
374
375function 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
382if (!@file_exists($nomfichier)) return $this->error(8,$nomfichier,"TTT1",1);
383if (!$f_id=@fopen($nomfichier,"r")) return $this->error(9,$nomfichier,"TTT2",1);
384if (!$source=@fread($f_id, filesize($nomfichier))) return $this->error(10,$nomfichier,"TTT3",1);
385clearstatcache();
386fclose($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);
404return $handle;
405}
406
407function newSession($handle="{0}",$nom_zone = "|root|"){
408if ( $this->sessions[$handle][$nom_zone]->used ) $this->closeSession($handle,$nom_zone);
409$this->addSession($handle,$nom_zone,$cache,$time,$num_session);
410return 1;
411}
412
413function 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
420function 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
429function setGlobalVar($arg1,$arg2,$arg3){
430if ($arg1 == 1){
431  if (!$this->setGAll($arg2,$arg3)) return $this->error(12,$arg2,"TTT6",1);
432  return 1; 
433}
434if (!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 }
443return 1;
444}
445
446function 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
466function 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
471function 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
489if (!@file_exists($file)) return $this->error(8,$file,"TTT13",1);
490if (!$f_id=@fopen($file,"r")) return $this->error(9,$file,"TTT14",1);
491if (!$val=@fread($f_id, filesize($file))) return $this->error(10,$file,"TTT15",1);
492clearstatcache();
493fclose($f_id);
494
495//Enregistre la variable
496return $this->sessions[$handle][$zone]->setVar($var,$val);
497}
498
499
500
501
502
503function isZone($handle, $zone="|root|") 
504{ 
505return isset($this->sessions[$handle][$zone]) ; 
506} 
507
508function 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*
518On 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
526function 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
560function setGlobalVarTab($handle,$zones,$index = array()){ 
561
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){ 
571                                        $var=$tab[1]; 
572                                } 
573                                else 
574                                { 
575                                        $var=$tab[0]; 
576                                } 
577                                setGlobalVar($handle,$key,$zones[$var]); 
578                        } 
579                } 
580                else 
581                { 
582                        reset($zones); 
583                        while (list ($key, $val) = each ($zones)) 
584                        {
585                                GlobalVar($handle,$key,$val); 
586                        } 
587                } 
588        } 
589        else 
590        { 
591                setBlobalVar($handle,$index,$zones[$index]); 
592        } 
593} 
594
595
596
597
598
599
600// End VTemplate
601}
602$DEFINE_VTEMPLATE = 1;
603}
604?>
Note: See TracBrowser for help on using the repository browser.