2 /*****************************************************************
5 * Version : 1.3.2 Base Edition ( Decembre 2003 ) build 1
7 * Address : http://vtemplate.sourceforge.net
10 * + THIEBAUT Jean-Baptiste(J.Baptiste@leweby.com) - http://www.leweby.com .
11 * + CAMPANA François (fc@netouaibe.com).
17 *****************************************************************/
19 if ( !isset($DEFINE_VTEMPLATE) ){
21 define("VARTAG","{#"); // Tag d'ouverture des variables : vous pouvez changer ce paramètre.
22 define("VTEMPLATE_VERSION","1.3.1");
23 define("VTEMPLATE_TYPE","BA");
24 define("VTEMPLATE_BUILD","6");
31 function error($errno,$arg="",$code=0,$disp=0, $method=__METHOD__,$line=__LINE__){
32 // Gestion des erreurs
35 $infos = "{ ".print_r($arg,true)." } ";
44 $this->titre="$method - Erreur $errno de session n° $code - ligne $line";
45 $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>" ;
48 $this->titre="$method - Erreur $errno de session n° $code - ligne $line";
49 $this->msg = "Vous tentez de fermer une session de la zone $arg[1] alors qu'aucune session pour cette zone n'existe.Pour ouvrir une session, utilisez la fonction addSession().<br>";
52 $this->titre="$method - Erreur $errno de session n° $code - ligne $line";
55 $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>";
58 $this->titre="$method - Erreur $errno de session n° $code - ligne $line";
61 $this->msg = "La variable $var que vous souhaitez valoriser n'existe pas dans la zone $zone.<br>";
64 $this->titre="$method - Erreur $errno de parsing n° $code - ligne $line";
65 $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>";
68 $this->titre="$method - Erreur $errno de parsing n° $code - ligne $line";
69 $this->msg = "Vous ne pouvez pas utiliser le même nom ($arg)de zone plusieurs fois.<br>";
72 $this->titre="$method - Erreur $errno de parsing n° $code - ligne $line";
73 $this->msg = "Vous avez oublié de fermer la zone $arg.<br>";
76 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
77 $this->msg = "Le fichier template $arg est introuvable.<br>";
80 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
81 $this->msg = "Impossible d'ouvrir le fichier $arg.Vérifiez les droits de ce fichier.<br>";
84 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
85 $this->msg = "Impossible de lire le fichier template $arg.<br>";
88 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
89 $this->msg = "La zone $arg est introuvable.Vérifiez la syntaxe de cette zone.<br>";
92 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
93 $this->msg = "La variable $arg est introuvable .Vérifiez la syntaxe de la variable.<br>";
96 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
97 $this->msg = "L'identifiant de fichier spécifié n'existe pas.Vérifiez les fonctions Open() de votre script.<br>";
100 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
103 $this->msg = "La variable $var dans le fichier $file est introuvable.Vérifiez la syntaxe de la variable.<br>";
106 $this->titre="$method - Erreur $errno de traitement n° $code - ligne $line";
110 $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>";
113 $this->titre = "$method - Erreur $errno inconnue $code - ligne $line";
114 $this->msg = "Veuillez le rapporter aux auteurs de la classe.";
116 $this->titre .= ": <br>";
118 // $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>";
119 // echo "<font face=verdana size=2 color=red><u>$this->titre</u><i>$this->msg</i>$web<br><br></font>";
120 echo "<font face=verdana size=2 color=red><u>$this->titre</u><i>$this->msg</i>$infos<br><br></font>";
127 class Session extends err{
129 var $name; // Name of the session
130 var $globalvar = array(); // List of global variable of the session
131 var $varlist = array(); // List of var in this session
132 var $subzone = array(); // list of sub-zone
133 var $temp; // Generated code for the current session
134 var $generated = NULL; // The final code
135 var $source; // Source code
136 var $used=0; // Indicates if the session contain used variable
137 var $stored; // Give the filename were is stored the session
139 function Session($name,$source,$stored){
141 $this->source = $source;
142 $this->stored = $stored;
146 function parseVar_orig(){
147 // Récupération des noms des variables
148 $regle = "|".VARTAG."(.*)}|sU";
149 preg_match_all ($regle,$this->source,$var1);
150 // Création du tableau de variable à partir de la liste parsée.
151 $this->varlist=@array_merge($var[1],$var1[1]);
155 // la fonction parseVar a été reécrire ( voir l'origin parseVar_orig )
156 // car des prblèmes se présentaient avec array_merge quand la classe
157 // était utilisée avec php5 ( bogue dans php5beta4 ? )
159 // Récupération des noms des variables
160 $regle = "|".VARTAG."(.*)}|sU";
161 $var1 = array(); $var1[1] = array();
162 preg_match_all ($regle,$this->source,$var1);
163 /* Création du tableau de variable à partir de la liste parsée. */
164 foreach ($var1[1] as $v)
166 $this->varlist[] = $v;
172 if($this->used) return $this->error(1,array($this->stored,$this->name),"SESSION1",1,"init",__LINE__);
173 // Reset generated code
174 $this->temp = $this->source;
177 function closeSession(){
178 // Check if the zone has been used.
179 if(!$this->used) return $this->error(2,array($this->stored,$this->name),"SESSION2",1,"closeSession",__LINE__);
181 $this->generateCode();
188 $this->generated = NULL;
192 function addSubZone(&$subzone){
193 $this->subzone[$subzone->name] = &$subzone;
197 function setVar($varname,$value){
198 if (!$this->used) return $this->error(3,array($this->stored,$this->name,$varname),"SESSION3",1,"setVar",__LINE__);
199 if (!in_array($varname,$this->varlist)) return $this->error(4,array($this->name,$varname),"SESSION4",1,"setVar",__LINE__);
200 $regle = "(\\".VARTAG."$varname\})";
201 $this->temp = preg_replace($regle,$value,$this->temp);
207 function message ($text)
209 $t = ereg_replace("\n", "", $text);
210 if (defined("FICHIER_MESSAGES_DEBUG"))
212 $fichier = FICHIER_MESSAGES_DEBUG;
216 // le fichier destination n'est pas défini
218 $fichier = "/var/log/janus.log";
220 error_log(date("d/m/Y H:i:s > ")."$t\n",3,$fichier);
225 echo "Liste variables de $this->name:<br>";
226 foreach ( $this->varlist as $vars )
230 function setGlobalVar($varname,$value){
232 if (in_array($varname,$this->varlist)){
233 // Replace the var into this session
234 $this->globalvar[$varname]=$value;
237 // Replace the var into sub zones
238 foreach(array_keys($this->subzone) as $subzone){
239 $set = $this->subzone[$subzone]->setGlobalVar($varname,$value) || $set;
244 function replaceGlobalVar(){
245 if ( count($this->globalvar) )
246 foreach($this->globalvar as $varname => $value){
247 $regle = "(\\".VARTAG."$varname\})";
248 $this->temp = preg_replace($regle,$value,$this->temp);
253 function generateCode(){
254 if ($this->used == 0) return $this->generated;
255 // Replace global var.
256 if ( count($this->globalvar) ) $this->replaceGlobalVar();
257 // Replace all unused variable by ""
258 $regle = "|\\".VARTAG."([^}]*)\}|";
259 $this->temp = preg_replace($regle,"",$this->temp);
260 // Generate the subzone(s) code
261 if(count($this->subzone)){
262 foreach(array_keys($this->subzone) as $subzone){
263 $text = ($this->subzone[$subzone]->used) ? $this->subzone[$subzone]->generateCode() : $this->subzone[$subzone]->generated;
264 $this->temp = preg_replace("(\|$subzone\|)",$text,$this->temp);
265 $this->subzone[$subzone]->reset();
268 $this->generated .= $this->temp;
269 return $this->generated;
272 function inVarList($varname){
273 return in_array($varname,$this->varlist);
279 class VTemplate_Private extends Err{
280 /****************************************
282 * ***************************************/
284 var $sources=array(); // Sources des zones issues de la premiere partie du parsing.
285 var $sessions=array(); // Tableau de sessions
286 var $v_global=array(); // Globla var array.
288 /****************************************************************
289 Parsing Functions for Template files. ( PF 1.0 )
290 ****************************************************************/
292 function getNom($code){
293 // Retourne le premier nom de zone qu'il trouve dans le code
295 preg_match("(<!--VTP_([^()]+)-->)sU",$code,$reg);
297 // Tester la présence des caratère invalides dans le nom ( | et {});
298 if (@count(explode("|",$reg[1]))>1 || @count(explode("{",$reg[1]))>1 || @count(explode("}",$reg[1]))>1) exit($this->error(5,$reg[1],"PARSE1",1,"getNom",__LINE__));
303 function endTag($code,$nom){
304 // Renvoie TRUE(1) si le tag de fermeture est présent.
306 preg_match("(<!--/VTP_$nom-->)sU",$code,$reg);
308 return ($reg[0]!="<!--/VTP_$nom-->") ? 0 : 1;
311 function getSource($code,$nom,$type=0){
312 // Retourne le source de la zone de nom $nom
314 preg_match_all ("(<!--VTP_$nom-->(.*)<!--/VTP_$nom-->)sU",$code,$reg);
316 return $reg[$type][0];
319 function parseZone($code_source,$nom_zone="|root|"){
320 // Fonction récursive de parsing du fichier template
321 // Vérification que la zone n'existe pas
322 if (isset($this->sources[$nom_zone])) exit($this->error(6,$nom_zone,"PARSE2",1,"parseZone",__LINE__));
324 // Enregistrement du code source
325 $this->sources[$nom_zone]["source"]=$code_source;
327 // Rappel de la fonction pour chaque fils.
328 while($nom_fils=$this->getNom($this->sources[$nom_zone]["source"])){
330 // Vérification que le tag de fin est présent.
331 if (!$this->endTag($code_source,$nom_fils)) exit($this->error(7,$nom_fils,"PARSE3",1,"parseZone",__LINE__));
334 $this->parseZone($this->getSource($this->sources[$nom_zone]["source"],$nom_fils,1),$nom_fils);
336 // Enregistre le nom du fils dans la liste des fils
337 $this->sources[$nom_zone]["fils"][]=$nom_fils;
339 // Remplace le code du fils dans le source du père
340 $this->sources[$nom_zone]["source"]=str_replace(
341 $this->getSource($this->sources[$nom_zone]["source"],$nom_fils,0),
343 $this->sources[$nom_zone]["source"]
345 // Teste si la zone $nom_fils n'existe pas plusieurs fois dans la zone $nom_zone
346 if (count(explode("|$nom_fils|",$this->sources[$nom_zone]["source"]))>2) exit($this->error(6,$nom_fils,"PARSE4",1,"parseZone",__LINE__));
352 /****************************************************************
353 Session Management functions ( SMF 1.0 )
354 ****************************************************************/
356 function createSession($handle,$zone = "|root|"){
357 // Create a new session of the zone
358 $this->sessions[$handle][$zone] = new Session($zone,$this->sources[$zone]["source"],$this->file_name[$handle]);
361 if (@count($this->sources[$zone]["fils"])){
362 foreach($this->sources[$zone]["fils"] as $subzone){
363 $this->createSession($handle,$subzone);
364 $this->sessions[$handle][$zone]->addSubZone($this->sessions[$handle][$subzone]);
372 /****************************************************************
373 Global Variable Management Functions ( GVMF 1.0 )
374 ****************************************************************/
376 function setGZone($handle,$zone,$var,$value){
377 // Define Global var for $zone and its sub-zone.
378 // Set global value to $zone vars.
379 return $this->sessions[$handle][$zone]->setGlobalVar($var,$value);
382 function setGFile($handle,$var,$value) {
383 return $this->sessions[$handle]["|root|"]->setGlobalVar($var,$value);
386 function setGAll($var,$value){
388 $this->v_global[$var]=$value;
389 if (is_array($this->sessions)){
390 foreach($this->sessions as $handle => $v){
391 $declare = $this->setGFile($handle,$var,$value) || $declare;
397 function setGOpened($handle){
398 // Set Global var into the opened file
399 foreach($this->v_global as $name => $val){
400 $this->setGFile($handle,$name,$val);
405 // Fin VTemplate_Private
409 class VTemplate extends VTemplate_Private{
410 /****************************************
412 * ***************************************/
415 /****************************************************************
417 *****************************************************************/
420 function Open($nomfichier){
421 // Ouverture d'un fichier source et retourne le handle de ce fichier
422 // Création du handle:
423 $handle = "{".count($this->sessions)."}" ;
426 // Récupération du source à parser
427 if (!@file_exists($nomfichier)) return $this->error(8,$nomfichier,"TTT1",1,"Open",__LINE__);
428 if (!$f_id=@fopen($nomfichier,"r")) return $this->error(9,$nomfichier,"TTT2",1,"Open",__LINE__);
429 if (!$source=@fread($f_id, filesize($nomfichier))) return $this->error(10,$nomfichier,"TTT3",1,"Open",__LINE__);
433 // Store the filename
434 $this->file_name[$handle]=$nomfichier;
437 $this->parseZone($source);
439 // Création du tableau de session
440 $this->createSession($handle);
442 //Nettoyage des variables temporaires
446 $this->setGOpened($handle);
448 $this->addSession($handle);
452 function newSession($handle="{0}",$nom_zone = "|root|"){
453 if ( $this->sessions[$handle][$nom_zone]->used ) $this->closeSession($handle,$nom_zone);
454 $this->addSession($handle,$nom_zone,$cache,$time,$num_session);
458 function addSession($handle="{0}",$nom_zone = "|root|"){
459 // Does the zone exist ?
460 if(!isset($this->sessions[$handle][$nom_zone])) return $this->error(11,array($nom_zone,$this->file_name[$handle]),"TTT4",1,"addSession",__LINE__);
461 $this->sessions[$handle][$nom_zone]->init();
465 function closeSession($handle="{0}",$nom_zone = "|root|"){
466 // Close the current session and all his sub-session
467 // Check if the zone exists.
468 if(!isset($this->sessions[$handle][$nom_zone])) return $this->error(11,array($nom_zone,$this->file_name[$handle]),"TTT5",1,"closeSession",__LINE__);
470 $this->sessions[$handle][$nom_zone]->closeSession();
474 function setGlobalVar($arg1,$arg2,$arg3){
476 if (!$this->setGAll($arg2,$arg3)) return $this->error(12,$arg2,"TTT6",1,"setGlobalVar",__LINE__);
479 if (!isset($this->sessions[$arg1])) return $this->error(13,$arg1,"TTT7",1,"setGlobalVar",__LINE__);
480 $tab=explode(".",$arg2);
482 if (!$this->setGFile($arg1,$arg2,$arg3)) return $this->error(14,array($this->file_name[$arg1],$arg2),"TTT8",1,"setGlobalVar",__LINE__);
484 else if (count($tab==2)){
485 if (!isset($this->sessions[$arg1][$tab[0]])) return $this->error(11,array($tab[0],$this->file_name[$arg1],"TTT9",1),"setGlobalVar",__LINE__);
486 if (!$this->setGZone($arg1,$tab[0],$tab[1],$arg3)) return $this->error(15,array($this->file_name[$arg1],$tab[0],$tab[1]),"TTT10",1,"setGlobalVar",__LINE__);
491 function setVar($handle,$zone_var,$val){
493 $tab=explode(".",$zone_var);
504 // Teste l'existence de la zone dans la liste
505 if (!isset($this->sessions[$handle][$zone])) return $this->error(11,array($this->file_name[$handle],$zone),"TTT11",1,"setVar",__LINE__);
507 //Enregistre la variable
508 return $this->sessions[$handle][$zone]->setVar($var,$val);
511 function Parse($handle_dest,$zone_var_dest,$handle_source,$zone_source="|root|"){
512 if($this->sessions[$handle_source][$zone_source]->used == 1) $this->closeSession($handle_source,$zone_source);
513 $this->setVar($handle_dest,$zone_var_dest, $this->sessions[$handle_source][$zone_source]->generated);
516 function setVarF($handle,$zone_var,$file){
517 // Fonction qui ouvre le fichier file et copie ce qu'il y a dedans dans une variable.
518 $tab=explode(".",$zone_var);
520 // Récupération nom de la zone et de la variable.
530 // Teste l'existence de la zone dans la liste
531 if (!is_object($this->sessions[$handle][$zone])) return $this->error(11,array($handle,$zone),"TTT12",1,"setVarF",__LINE__);
533 // Récupération du source à lire
534 if (!@file_exists($file)) return $this->error(8,$file,"TTT13",1,"setVarF",__LINE__);
535 if (!$f_id=@fopen($file,"r")) return $this->error(9,$file,"TTT14",1,"setVarF",__LINE__);
536 if (!$val=@fread($f_id, filesize($file))) return $this->error(10,$file,"TTT15",1,"setVarF",__LINE__);
540 //Enregistre la variable
541 return $this->sessions[$handle][$zone]->setVar($var,$val);
548 function isZone($handle, $zone="|root|")
550 return isset($this->sessions[$handle][$zone]) ;
553 function Display($handle="{0}",$display=1,$zone="|root|"){
554 $this->closeSession($handle,$zone);
555 $c_genere = $this->sessions[$handle][$zone]->generated;
557 if ($display) echo $c_genere; else return ($c_genere);
559 //fonction complementaire version BETA
564 - SetVarTab($array): tout les couples clef/valeur sont valorisées
565 - SetVarTab($array,$index) seuls les couples clef/valeur dont la clef est dans le tableau index ou dont la valeur == $index (si pas tableau)
566 Si $index contient ou est une clef de type zone.clef, la clef sera extraite du texte est servira d'index pour $array
571 function setVarTab($handle,$zones,$index = array()){
572 if (is_array($index))
577 while (list (, $key) = each ($index))
579 $tab=explode(".",$key);
587 setVar($handle,$key,$zones[$var]);
593 while (list ($key, $val) = each ($zones))
595 setVar($handle,$key,$val);
601 setVar($handle,$index,$zones[$index]);
605 function setGlobalVarTab($handle,$zones,$index = array()){
607 if (is_array($index))
612 while (list (, $key) = each ($index))
614 $tab=explode(".",$key);
622 setGlobalVar($handle,$key,$zones[$var]);
628 while (list ($key, $val) = each ($zones))
630 GlobalVar($handle,$key,$val);
636 setBlobalVar($handle,$index,$zones[$index]);
647 $DEFINE_VTEMPLATE = 1;