begin process at 2012 05 27 17:56:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > [PHP4] MOTEUR DE TEMPLATE

[PHP4] MOTEUR DE TEMPLATE


 Information sur la source

Note :
Aucune note
Catégorie :Astuces Classé sous :template, moteur, php4, engine, separation Niveau :Débutant Date de création :19/08/2006 Date de mise à jour :28/08/2006 14:35:17 Vu / téléchargé :8 037 / 309

Auteur : jean84

Ecrire un message privé
Site perso
Commentaire sur cette source (42)
Ajouter un commentaire et/ou une note

 Description

C'est un classique moteur de template. Realise en php4, le code tiens dans un seul fichier a inclure au debut de vos pages pour pouvoir en profiter. Ce n'est pas le code du siecle mais sa peut toujours servir pour une premiere approche dans le cadre d'une utilisation futur d'un moteur plus pousse  (commerciale ou gratuit peu importe) genre phplib par exemple...
Pour ceux qui ne le savent pas, un moteur de template est en fait un code permettant la separation de la partie php et html d'une page web garce a des balises specifiques supporte par le moteur.
Voici la liste des fonctions proposees :
- SetImg() pour les images
- SetBlock() pour les blocks
- SetCss() pour les feuilles de styles
- SetVar() pour les variables
- SetFile() pour l'inclusion de fichier
- ReadFile() pour lire et renvoye le contenu d'un fichier

et 2/3 trucs en plus

Source

  • <?php
  • /*
  • Engine Template : V1.0.1
  • Auteur : IoNAce
  • E-Mail : ionace@c4.fr
  • Fonctionnement du moteur :
  • La creation d'une nouvelle classe passe par le constructeur. Ce constructeur prend en parametre le fichier modele
  • sur lequel travailler. Un fichier modele est un fichier html (ou autre) comportant des balises specifiques au moteur.
  • C'est le fichier qui effectue la mise en place des elements sur une page (le plus souvent) de facon generique.
  • Le deuxieme parametre est le chemin et le nom complet du fichier log. Ce fichier comporte toutes les erreurs internes
  • du moteur. La date, l'heure, la fonction qui a renvoye l'erreur et le type de l'erreur sont consignes par ecrit. Par
  • defaut, le constructeur surcharge ce parametre pour eviter d'en avoir a se preocuper. ATTENTION ! Le fichier log est
  • creer a l'endroit meme ou est le fichier engine.php !!
  • Une fois le modele charge, toutes les fonctions du moteur agiront sur la copie en memoire. Il est donc important
  • d'appeller la fonction Display() afin d'affiche le resultat. On peut donc utiliser plusieurs fois la meme fonction,
  • le resultat ne sera disponible qu'a la fin.
  • */
  • class Template
  • {
  • var $ContenuModele;
  • var $EngineStatus;
  • var $FichierLog;
  • var $HandleLog;
  • var $TableauOfBlock;
  • var $DelTmpBlock;
  • /*
  • Constructeur. Lit le fichier modele est le fichier place en memoire. Le 3e param permet d'effacer les
  • fichiers temporaires crees par la methode SetBlock()
  • */
  • function Template($Modele='', $ErrorLog='error.log', $DeleteTmpBlock=false)
  • {
  • // Initialisation de cette variable pour eviter les surprises
  • $this->EngineStatus = false;
  • // Indique a la classe quel est le nom du fichier log
  • $this->FichierLog = $ErrorLog;
  • // Indique a la classe qu'elle doit effacer les fichiers temporaires
  • $this->DelTmpBlock = $DeleteTmpBlock;
  • // Pour eviter les erreurs inutiles, on verifie que tous les parametres sont transmis
  • if ( empty($Modele) )
  • die($this->SetLog('Template->Constructeur', 'Le fichier servant de modele n\'a pas ete indique. Il est impossible de continuer l\'execution sans ce fichier !'));
  • // On verifie que le fichier existe
  • if ( !file_exists($Modele) )
  • die($this->SetLog('Template->Constructeur', 'Le fichier indique servant de modele n\'existe pas !'));
  • // On charge d'abord le modele puis on le lit integralement
  • $HandleModele = @fopen($Modele, 'rb')
  • or die($this->SetLog('Template->Constructeur', 'Erreur lors de l\'ouverture du fichier \''.$Modele.'\'.'));
  • $this->ContenuModele = @fread($HandleModele, @filesize($Modele))
  • or die($this->SetLog('Template->Constructeur', 'Erreur lors de la lecture du fichier \''.$Modele.'\'.'));
  • $this->TableauOfBlock = array();
  • // Si on en est la c'est bon le chargement est reussi
  • $this->EngineStatus = true;
  • }
  • /*
  • Gere les variables a partir du fichier modele place en memoire par le contructeur.
  • Pour definir une variable -> <engine:var name="nom_de la variable" /> (attention aux guillemets !)
  • */
  • function SetVAr($NameOfVar='', $Value='')
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->SetVAr()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // Valeur de la balise a rempalcer
  • $this->ContenuModele = str_replace('<engine:var name="'.$NameOfVar.'" />', $Value, $this->ContenuModele);
  • }
  • /*
  • Gere les blocks. Balise => <engine:block name="nom_du_block">donnees</engine:block:nom_du_block>
  • "Donnees" correspond au code present entre ces balises. On met les variables a traites dans des crochet []
  • Le 3e parametre ($MiseEnCache) sert a ecrire dans un fichier le modele du block afin d'eviter de le recharger
  • et d'aller plus vite.
  • */
  • function SetBlock($NameOfBlock='', $Pointer='', $MiseEnCache=false)
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->SetBlock()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // On regarde si le block n'est pas mis en cache
  • $CachedBlock = md5($NameOfBlock);
  • // Si on veut mettre le block en cache
  • if ( $MiseEnCache )
  • {
  • // On essaye d'ouvrir le fichier cache
  • $Handle = @fopen($CachedBlock, 'wb+')
  • or die($this->SetLog('Template->SetBlock()', 'Le fichier temporaire pour le block "'.$NameOfBlock.'" ayant pour signature numerique '.$CachedBlock.' n\' a pas pu etre creer.'));
  • $SizeOfFile = @filesize($CachedBlock);
  • // Si le fichier contient du texte
  • if ( $SizeOfFile ) {
  • $ModeleBlock = @fread($Handle, filesize($CacheBlock));
  • }
  • // Si le fichier est vide
  • else
  • {
  • // Heu complique a expliquer la... :p On extrait le block du modele
  • $First = stristr($this->ContenuModele, '<engine:block name="'.$NameOfBlock.'">');
  • $ModeleBlock = strrev(stristr(strrev($First), strrev('</engine:block:'.$NameOfBlock.'>')));
  • // On met en cache le block
  • fputs($Handle, $ModeleBlock, strlen($ModeleBlock))
  • or die($this->SetLog('Template->SetBlock', 'Impossible d\'ecrire dans le fichier cache.'));
  • }
  • fclose($Handle);
  • }
  • else {
  • // Heu complique a expliquer la... :p On extrait le block du modele
  • $First = stristr($this->ContenuModele, '<engine:block name="'.$NameOfBlock.'">');
  • $ModeleBlock = strrev(stristr(strrev($First), strrev('</engine:block:'.$NameOfBlock.'>')));
  • }
  • // Remplacement
  • foreach ( $Pointer as $Index => $Value )
  • $ModeleBlock = str_replace('['.$Index.']', $Value, $ModeleBlock);
  • // Ajout au tableau general
  • if ( empty($this->TableauOfBlock[$NameOfBlock]) )
  • $this->TableauOfBlock[$NameOfBlock] = $ModeleBlock;
  • else
  • $this->TableauOfBlock[$NameOfBlock] .= $ModeleBlock;
  • }
  • /*
  • Gere les images. Parametres : 1 - nom de la balise devant etre remplacee
  • 2 - nom de l'image a mettre
  • 3 - nom d'une classe pour eventuellement rajouter une feuille de style a l'image
  • 4 - (FACULTATIF) largeur de l'image
  • 5 - (FACULTATIF) hauteur de l'image
  • Si les 2 derniers parametres ne sont pas transmis, la fonction va essayer de determiner elle meme la largeur et
  • la hauteur de l'image. Si seul un des deux parametres est transmis, la fonction va chercher a calculer l'autre
  • parametre en fonction de celui transmis (calcul du ratio entre les deux)
  • Type de balise : <engine:img name="nom_de_l_image_a_afficher" />
  • */
  • function SetImg($NameOfBalise='', $Img='', $Class='', $X=0, $Y=0)
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->SetImg()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // Verfiie les parametres concernant les dimensiosn de l'images
  • if ( !$X and !$Y )
  • $Action = 1; // calcul automatique
  • else if ( $X and !$Y )
  • $Action = 2; // on calculera y
  • else if ( !$X and $Y )
  • $Action = 3; // on calculera x
  • else
  • $Action = 0; // tous les parametres ont ete transmis
  • // Si un calcul est necessaire, on prepare deja les v aleurs essentielles
  • if ( $Action )
  • {
  • // Recupere la largeur et la ahuteur de l'image
  • $Values = @getimagesize($Img)
  • or die($this->SetLog('Template->SetImg()', 'L\'obtention des dimensions de l\'image '.$Img.' a echouee.'));
  • // X / Y = ratio de l'image
  • $Ratio = $Values[0] / $Values[1];
  • // Calcul de tous les ratios
  • switch ( $Action )
  • {
  • case 2: // calcul de y en fonction de x => y = X / Ratio
  • $Y = @round(($X/$Ratio), 0)
  • or die($this->SetLog('Template->SetImg()', 'Division par zero ! Instruction : case ratio_x. $X = '.$X.'; $Ratio = '.$Ratio.';'));
  • break;
  • case 3: // calcul de x en fonction de y => x = Y * Ratio
  • $X = @round(($Y*$Ratio), 0)
  • or die($this->SetLog('Template->SetImg()', 'Division par zero ! Instruction : case ratio_y. $Y = '.$Y.'; $Ratio = '.$Ratio.';'));
  • break;
  • case 1: // simple, on recupere les valeurs du tableau renvoye par getimagesize() :p
  • $X = $Values[0];
  • $Y = $Values[1];
  • break;
  • default:
  • die($this->SetLog('Template->SetImg()', 'L\'instruction switch( $Action ){} n\'a pas pu aboutir, la variable $Action a une valeur non-prise en charge.'));
  • }
  • }
  • // Travail :p
  • $this->ContenuModele = str_replace(
  • '<engine:img name="'.$NameOfBalise.'" />',
  • '<img src="'.$Img.'" width="'.$X.'" height="'.$Y.'" class="'.$Class.'" />',
  • $this->ContenuModele
  • );
  • }
  • /*
  • Gere les feuilles de styles. Balise : <engine:css />
  • */
  • function SetCss()
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->SetCss()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // Sinon, on recupere tous ces arguments dans un tableau
  • $Args = @func_get_args();
  • // Variable recueillant toues les feuilles de styles pour la mise en cache
  • $Css = '';
  • // On parcours le tableau
  • for ( $i=0; $i<@func_num_args(); $i++ ) {
  • // Details de l'implantation
  • $Css .= '<link media="all" rel="stylesheet" type="text/css" href="'.$Args[$i].'" />';
  • }
  • // Ajout des feuilles de styles
  • $this->ContenuModele = str_replace('<engine:css />', $Css, $this->ContenuModele);;
  • }
  • /*
  • Charge un fichier et remplace la balise <engine:file name="nom_du_fichier_a_mettre" /> par le contenu de celui-ci
  • */
  • function SetFile()
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->SetFile()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // On cherche les balises FILE
  • $Regex = '!<engine:file name="(.+)" />!i';
  • // Recherche des expressions
  • preg_match($Regex, $this->ContenuModele, $Out);
  • // Travail
  • for ( $i=0; $i<count($Out[0]); $i++ )
  • {
  • // On nettoie le resultat pour n'obtenir que le nom du fichier demande
  • $Fichier = str_replace('<engine:file name="', '', $Out[0][$i]);
  • $Fichier = str_replace('" />', '', $Fichier);
  • // Probleme : quand il n'y a qu'une seule balise, le deuxieme parametre est toujours egale a 0 donc sa plante.
  • // Pour eviter ce soucis, on regarde si la valeur n'est pas NULL a un moment
  • if ( !empty($Fichier) )
  • {
  • // On ouvre le fichier demande
  • $Handle = @fopen($Fichier, 'rb')
  • or die($this->SetLog('Template->SetFile()', 'Impossible d\'ouvrir le fichier \''.$Fichier.'\'.'));
  • // On lit tout le fichier et on renvoi son contenu
  • $Contenu = @fread($Handle, @filesize($Fichier))
  • or die($this->SetLog('Template->SetFile()', 'Impossible de lire le fichier \''.$Fichier.'\'.'));
  • // Preparation de la balise
  • $Balise = '<engine:file name="'.$Fichier.'" />';
  • // Remplacement
  • $this->ContenuModele = str_replace($Balise, $Contenu, $this->ContenuModele);
  • }
  • }
  • }
  • /*
  • Ecris dans un fichier log les eventuelles erreurs d'execution
  • */
  • function SetLog($NameOfFonction='', $ErrorValue='')
  • {
  • // Ouverture du fichier
  • $HandleLog = @fopen($this->FichierLog, 'ab') or die('Impossible d\'ouvrir le fichier log.<br>');
  • // Preparation du texte a ecrire (le \r\r\n permet de sauter une ligne dans un fichier sous Windows)
  • $Date = date('\[\l\e d/m/Y\ \à H\h:i\m:s\s]');
  • $Log = $Date."\r\r\n".'La fonction '.$NameOfFonction.' a renvoye une erreur : '.$ErrorValue;
  • $Log .= "\r\r\n".'Adresse IP de la connexion : '.$_SERVER['REMOTE_ADDR']."\r\r\n";
  • $Log .= '_________________'."\r\r\n\r\r\n";
  • // Ecriture dans le fichier
  • @fputs($HandleLog, $Log) or die('Imossible d\'ecrire dans le fichier log.<br>');
  • // Fermetture du fichier
  • @fclose($HandleLog);
  • // On informe l'utilisateur qu'il y a eu une erreur
  • return '[ERREUR INTERNE] - Il y a eu une erreur. Consultez le fichier log pour en conna&icirc;tre la raison.<br>Date : '.$Date;
  • }
  • /*
  • Lit un fichier et renvoi son contenu. Peut etre utilise pour la fonction SetBloc()
  • => SetVar('nom_du_bloc', ReadFile('fichier_a_lire'));
  • */
  • function ReadFile($FileToRead='')
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->ReadFile()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // On ouvre le fichier demande
  • $Handle = @fopen($FileToRead, 'rb')
  • or die($this->SetLog('Template->ReadFile()', 'Impossible d\'ouvrir le fichier \''.$FileToRead.'\'.'));
  • // On lit tout le fichier et on renvoi son contenu
  • $Contenu = @fread($Handle, @filesize($FileToRead))
  • or die($this->SetLog('Template->ReadFile()', 'Impossible de lire le fichier \''.$FileToRead.'\'.'));
  • return $Contenu;
  • }
  • /*
  • Fonction gerant le BBCode. Peut etre pas super utile a premiere vue mais peut toujours depanner :-)
  • Si une variable est transmise, la fonction va activer le bbcode sur le contenu de cette variable sinon, elle le
  • fera sur le fichier modele.
  • */
  • function SetBBCode($Value='')
  • {
  • // Si le moteur n'a pas ete demarre correctement
  • if ( !$this->EngineStatus )
  • die($this->SetLog('Template->SetBBCode()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
  • // Si une variables n'a pas ete transmise, on considere $Value comme une reference a $ContenuModele
  • if ( !$Value ) {
  • $Value = &$this->ContenuModele;
  • $Reference = true;
  • }
  • else {
  • $Reference = false;
  • }
  • /* On remplace toutes les balises pouvant etre enleve sans regex */
  • // Saut de ligne
  • $Value = str_replace('[br]', '<br />', $Value);
  • // Italique
  • $Value = str_replace('[i]', '<i>', $Value);
  • $Value = str_replace('[/i]', '</i>', $Value);
  • // Gras
  • $Value = str_replace('[b]', '<b>', $Value);
  • $Value = str_replace('[/b]', '</b>', $Value);
  • // Souligne
  • $Value = str_replace('[u]', '<u>', $Value);
  • $Value = str_replace('[/u]', '</u>', $Value);
  • // Liste
  • $Value = str_replace('[list]', '<ul>', $Value);
  • $Value = str_replace('[/list]', '</ul>', $Value);
  • // Puce dans liste
  • $Value = str_replace('[li]', '<li>', $Value);
  • $Value = str_replace('[/li]', '</li>', $Value);
  • // Toutes les balises fermees qui utilisent des regex pour leurs balises ouvertes
  • $Value = str_replace('[/size]', '</span>', $Value);
  • $Value = str_replace('[/align]', '</div>', $Value);
  • $Value = str_replace('[/color]', '</span>', $Value);
  • $Value = str_replace('[/citation]', '</span></fieldset><br>', $Value);
  • // Tabulation
  • $Value = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $Value);
  • /* On attaque les regex :p */
  • // Les images
  • $Value = preg_replace(
  • '!\[img\=(http|news|ftp|https){1}(://){1}([a-z0-9]+[a-z0-9/.-]*\.)(gif|bmp|png|jpg|jpeg)\]!i',
  • '<img src="\\1\\2\\3\\4" />',
  • $Value
  • );
  • // Les liens vers des sites
  • $Value = preg_replace(
  • '!(http|news|ftp|https){1}(://){1}([a-z0-9]+[a-z0-9/.-]*[a-z]+)!i',
  • '<a title="Aller vers \\3" target="_blank" href="\\1\\2\\3">\\1\\2\\3</a>',
  • $Value
  • );
  • // Les mails
  • $Value = preg_replace(
  • '!([a-z09][a-z0-9._-]*[a-z09]@{1}[a-z09][a-z0-9._-]*[a-z09]\.{1}[a-z]{2,4})!',
  • '<a title="Envoyer un email à \\1" href="mailto:\\1">\\1</a>',
  • $Value
  • );
  • // La couleur du texte
  • $Value = preg_replace(
  • '!\[color=([a-z#0-9]+)\]!i',
  • '<span style="color:\\1;">', $Value
  • );
  • // Taille du texte
  • $Value = preg_replace(
  • '!\[size=([0-9]+)\]!i',
  • '<span style="font-size:\\1px;">',
  • $Value
  • );
  • // Alignement du texte
  • $Value = preg_replace(
  • '!\[align=(center|justify|left|right)\]!i',
  • '<div align="\\1">',
  • $Value
  • );
  • // Citation
  • $Value = preg_replace(
  • '!\[citation=(.+)\]!i',
  • '<br><fieldset style="background-color:#00CCFF;width:400px;text-align:justify;"><legend><b>\\1 a dit </b></legend><span style="color:#000000;font-size:12px;">',
  • $Value
  • );
  • if ( !$Reference )
  • return $Value;
  • }
  • /*
  • Cette fonction affiche le modele en memoire. N'appeller cette fonction qu'a la fin du traitement !
  • */
  • function Display()
  • {
  • // On affiche les blocks
  • foreach ( $this->TableauOfBlock as $Indice => $Value )
  • {
  • $Regex = '!<engine:block name="'.$Indice.'">.*</engine:block:'.$Indice.'>!iUms';
  • $this->ContenuModele = @preg_replace($Regex, $Value, $this->ContenuModele)
  • or die($this->SetLog('Template->Display()', 'Evaluation de l\'expression '.$Regex.' impossible.'));
  • // On efface les derniers blocks ...
  • $this->ContenuModele = str_replace('<engine:block name="'.$Indice.'">', '', $this->ContenuModele);
  • $this->ContenuModele = str_replace('</engine:block:'.$Indice.'>', '', $this->ContenuModele);
  • // ... ainsi que leurs fichiers temporaire
  • if ( $this->DelTmpBlock )
  • @unlink(md5($Indice));
  • }
  • // On affiche le contenu du fichier modele
  • echo $this->ContenuModele;
  • }
  • }
  • ?>
<?php
	/*
	
		Engine Template : V1.0.1
		Auteur : IoNAce
		E-Mail : ionace@c4.fr
			
		Fonctionnement du moteur :
			La creation d'une nouvelle classe passe par le constructeur. Ce constructeur prend en parametre le fichier modele
		sur lequel travailler. Un fichier modele est un fichier html (ou autre) comportant des balises specifiques au moteur.
		C'est le fichier qui effectue la mise en place des elements sur une page (le plus souvent) de facon generique.
		Le deuxieme parametre est le chemin et le nom complet du fichier log. Ce fichier comporte toutes les erreurs internes
		du moteur. La date, l'heure, la fonction qui a renvoye l'erreur et le type de l'erreur sont consignes par ecrit. Par 
		defaut, le constructeur surcharge ce parametre pour eviter d'en avoir a se preocuper. ATTENTION ! Le fichier log est 
		creer a l'endroit meme ou est le fichier engine.php !! 
			Une fois le modele charge, toutes les fonctions du moteur agiront sur la copie en memoire. Il est donc important 
		d'appeller la fonction Display() afin d'affiche le resultat. On peut donc utiliser plusieurs fois la meme fonction, 
		le resultat ne sera	disponible qu'a la fin. 
		
	*/
	
	class Template
	{
		var $ContenuModele;
		var $EngineStatus;
		var $FichierLog;
		var $HandleLog;
		var $TableauOfBlock;
		var $DelTmpBlock;
		
		/*
			Constructeur. Lit le fichier modele est le fichier place en memoire. Le 3e param permet d'effacer les 
			fichiers temporaires crees par la methode SetBlock()
		*/
		function Template($Modele='', $ErrorLog='error.log', $DeleteTmpBlock=false)
		{
			// Initialisation de cette variable pour eviter les surprises
			$this->EngineStatus = false;
			
			// Indique a la classe quel est le nom du fichier log
			$this->FichierLog = $ErrorLog;
			
			// Indique a la classe qu'elle doit effacer les fichiers temporaires
			$this->DelTmpBlock = $DeleteTmpBlock;
			
			// Pour eviter les erreurs inutiles, on verifie que tous les parametres sont transmis
			if ( empty($Modele) )
				die($this->SetLog('Template->Constructeur', 'Le fichier servant de modele n\'a pas ete indique. Il est impossible de continuer l\'execution sans ce fichier !'));
			
			// On verifie que le fichier existe
			if ( !file_exists($Modele) )
				die($this->SetLog('Template->Constructeur', 'Le fichier indique servant de modele n\'existe pas !'));
				
			// On charge d'abord le modele puis on le lit integralement
			$HandleModele = @fopen($Modele, 'rb') 
			  or die($this->SetLog('Template->Constructeur', 'Erreur lors de l\'ouverture du fichier \''.$Modele.'\'.'));
			$this->ContenuModele = @fread($HandleModele, @filesize($Modele)) 
			  or die($this->SetLog('Template->Constructeur', 'Erreur lors de la lecture du fichier \''.$Modele.'\'.'));

			$this->TableauOfBlock = array();

			// Si on en est la c'est bon le chargement est reussi
			$this->EngineStatus = true;
		}
		
		/*
			Gere les variables a partir du fichier modele place en memoire par le contructeur.
		 	Pour definir une variable -> <engine:var name="nom_de la variable" />  (attention aux guillemets !)
		*/
		function SetVAr($NameOfVar='', $Value='') 
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->SetVAr()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
				
			// Valeur de la balise a rempalcer
			$this->ContenuModele = str_replace('<engine:var name="'.$NameOfVar.'" />', $Value, $this->ContenuModele);
		}
		
		/*
			Gere les blocks. Balise =>  <engine:block name="nom_du_block">donnees</engine:block:nom_du_block>
			"Donnees" correspond au code present entre ces balises. On met les variables a traites dans des crochet []
			Le 3e parametre ($MiseEnCache) sert a ecrire dans un fichier le modele du block afin d'eviter de le recharger
			et d'aller plus vite.
		*/
		function SetBlock($NameOfBlock='', $Pointer='', $MiseEnCache=false) 
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->SetBlock()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
			
			// On regarde si le block n'est pas mis en cache
			$CachedBlock = md5($NameOfBlock);
			
			// Si on veut mettre le block en cache
			if ( $MiseEnCache )
			{
				// On essaye d'ouvrir le fichier cache
				$Handle = @fopen($CachedBlock, 'wb+')
				  or die($this->SetLog('Template->SetBlock()', 'Le fichier temporaire pour le block "'.$NameOfBlock.'" ayant pour signature numerique '.$CachedBlock.' n\' a pas pu etre creer.'));
				$SizeOfFile = @filesize($CachedBlock);
				
				// Si le fichier contient du texte
				if ( $SizeOfFile ) {
					$ModeleBlock = 	@fread($Handle, filesize($CacheBlock));								
				}
				// Si le fichier est vide
				else 
				{
					// Heu complique a expliquer la... :p On extrait le block du modele
					$First = stristr($this->ContenuModele, '<engine:block name="'.$NameOfBlock.'">');
					$ModeleBlock = strrev(stristr(strrev($First), strrev('</engine:block:'.$NameOfBlock.'>')));
					
					// On met en cache le block
					fputs($Handle, $ModeleBlock, strlen($ModeleBlock))
					  or die($this->SetLog('Template->SetBlock', 'Impossible d\'ecrire dans le fichier cache.'));
				}
				fclose($Handle);
			}
			else {
				// Heu complique a expliquer la... :p On extrait le block du modele
				$First = stristr($this->ContenuModele, '<engine:block name="'.$NameOfBlock.'">');
				$ModeleBlock = strrev(stristr(strrev($First), strrev('</engine:block:'.$NameOfBlock.'>')));
			}

			// Remplacement
			foreach ( $Pointer as $Index => $Value )
				$ModeleBlock = str_replace('['.$Index.']', $Value, $ModeleBlock);

			// Ajout au tableau general
			if ( empty($this->TableauOfBlock[$NameOfBlock]) )
				$this->TableauOfBlock[$NameOfBlock] = $ModeleBlock;
			else
				$this->TableauOfBlock[$NameOfBlock] .= $ModeleBlock;	
		}
		
		/*
			Gere les images. Parametres : 1 - nom de la balise devant etre remplacee
										  2 - nom de l'image a mettre
										  3 - nom d'une classe pour eventuellement rajouter une feuille de style a l'image
										  4 - (FACULTATIF) largeur de l'image
										  5 - (FACULTATIF) hauteur de l'image
										  
			Si les 2 derniers parametres ne sont pas transmis, la fonction va essayer de determiner elle meme la largeur et 
			la hauteur de l'image. Si seul un des deux parametres est transmis, la fonction va chercher a calculer l'autre 
			parametre en fonction de celui transmis (calcul du ratio entre les deux)
			
			Type de balise : <engine:img name="nom_de_l_image_a_afficher" />
 		*/
		function SetImg($NameOfBalise='', $Img='', $Class='', $X=0, $Y=0)
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->SetImg()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));

			// Verfiie les parametres concernant les dimensiosn de l'images
			if ( !$X and !$Y )
				$Action = 1;  // calcul automatique
			else if ( $X and !$Y ) 
				$Action = 2;  // on calculera y
			else if ( !$X and $Y )
				$Action = 3;  // on calculera x
			else
				$Action = 0;  // tous les parametres ont ete transmis
				
			// Si un calcul est necessaire, on prepare deja les v aleurs essentielles
			if ( $Action ) 
			{
				// Recupere la largeur et la ahuteur de l'image
				$Values = @getimagesize($Img) 
			      or die($this->SetLog('Template->SetImg()', 'L\'obtention des dimensions de l\'image '.$Img.' a echouee.'));
				
				// X / Y = ratio de l'image
				$Ratio = $Values[0] / $Values[1];
				  
				// Calcul de tous les ratios
				switch ( $Action )
				{
					case 2:  // calcul de y en fonction de x => y = X / Ratio
						$Y = @round(($X/$Ratio), 0) 
						  or die($this->SetLog('Template->SetImg()', 'Division par zero ! Instruction : case ratio_x. $X = '.$X.'; $Ratio = '.$Ratio.';'));
						break;
						
					case 3:  // calcul de x en fonction de y => x = Y * Ratio
						$X = @round(($Y*$Ratio), 0)
						  or die($this->SetLog('Template->SetImg()', 'Division par zero ! Instruction : case ratio_y. $Y = '.$Y.'; $Ratio = '.$Ratio.';'));
						break;
						
					case 1:  // simple, on recupere les valeurs du tableau renvoye par getimagesize() :p
						$X = $Values[0];
						$Y = $Values[1];
						break;
						
					default:
						die($this->SetLog('Template->SetImg()', 'L\'instruction switch( $Action ){} n\'a pas pu aboutir, la variable $Action a une valeur non-prise en charge.'));
				}
			}

			// Travail :p
			$this->ContenuModele = str_replace(
			  '<engine:img name="'.$NameOfBalise.'" />', 
			  '<img src="'.$Img.'" width="'.$X.'" height="'.$Y.'" class="'.$Class.'" />', 
			  $this->ContenuModele
			);
		}
		
		/*
			Gere les feuilles de styles. Balise : <engine:css />
		*/
		function SetCss()
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->SetCss()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
				
			// Sinon, on recupere tous ces arguments dans un tableau
			$Args = @func_get_args();

			// Variable recueillant toues les feuilles de styles pour la mise en cache			
			$Css = '';
			
			// On parcours le tableau
			for ( $i=0; $i<@func_num_args(); $i++ ) {
				// Details de l'implantation
				$Css .= '<link media="all" rel="stylesheet" type="text/css"  href="'.$Args[$i].'" />';
			}
			
			// Ajout des feuilles de styles
			$this->ContenuModele = str_replace('<engine:css />', $Css, $this->ContenuModele);;
		}
		
		/*
			Charge un fichier et remplace la balise <engine:file name="nom_du_fichier_a_mettre" /> par le contenu de celui-ci
		*/
		function SetFile()
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->SetFile()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
			
			// On cherche les balises FILE
			$Regex = '!<engine:file name="(.+)" />!i';
			
			// Recherche des expressions
			preg_match($Regex, $this->ContenuModele, $Out);

			// Travail
			for ( $i=0; $i<count($Out[0]); $i++ )
			{
				// On nettoie le resultat pour n'obtenir que le nom du fichier demande
				$Fichier = str_replace('<engine:file name="', '', $Out[0][$i]);
				$Fichier = str_replace('" />', '', $Fichier);
				
				// Probleme : quand il n'y a qu'une seule balise, le deuxieme parametre est toujours egale a 0 donc sa plante.
				// Pour eviter ce soucis, on regarde si la valeur n'est pas NULL a un moment
				if ( !empty($Fichier) )
				{
					// On ouvre le fichier demande
					$Handle = @fopen($Fichier, 'rb') 
					  or die($this->SetLog('Template->SetFile()', 'Impossible d\'ouvrir le fichier \''.$Fichier.'\'.'));	
				
					// On lit tout le fichier et on renvoi son contenu
					$Contenu =  @fread($Handle, @filesize($Fichier))
					  or die($this->SetLog('Template->SetFile()', 'Impossible de lire le fichier \''.$Fichier.'\'.'));
	
					// Preparation de la balise
					$Balise = '<engine:file name="'.$Fichier.'" />';
	
					// Remplacement
					$this->ContenuModele = str_replace($Balise, $Contenu, $this->ContenuModele);
				}
			}
		}
		
		/*
			Ecris dans un fichier log les eventuelles erreurs d'execution
		*/
		function SetLog($NameOfFonction='', $ErrorValue='')
		{
			// Ouverture du fichier
			$HandleLog = @fopen($this->FichierLog, 'ab') or die('Impossible d\'ouvrir le fichier log.<br>');
			
			// Preparation du texte a ecrire (le \r\r\n permet de sauter une ligne dans un fichier sous Windows)
			$Date = date('\[\l\e d/m/Y\ \à H\h:i\m:s\s]'); 
			$Log = $Date."\r\r\n".'La fonction '.$NameOfFonction.' a renvoye une erreur : '.$ErrorValue;
			$Log .= "\r\r\n".'Adresse IP de la connexion : '.$_SERVER['REMOTE_ADDR']."\r\r\n";
			$Log .= '_________________'."\r\r\n\r\r\n";
			
			// Ecriture dans le fichier
			@fputs($HandleLog, $Log) or die('Imossible d\'ecrire dans le fichier log.<br>');
			
			// Fermetture du fichier
			@fclose($HandleLog);
			
			// On informe l'utilisateur qu'il y a eu une erreur
			return '[ERREUR INTERNE] - Il y a eu une erreur. Consultez le fichier log pour en conna&icirc;tre la raison.<br>Date : '.$Date;
		}
		
		/*
			Lit un fichier et renvoi son contenu. Peut etre utilise pour la fonction SetBloc()
			=> SetVar('nom_du_bloc', ReadFile('fichier_a_lire'));
		*/
		function ReadFile($FileToRead='')
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->ReadFile()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
			
			// On ouvre le fichier demande
			$Handle = @fopen($FileToRead, 'rb') 
			  or die($this->SetLog('Template->ReadFile()', 'Impossible d\'ouvrir le fichier \''.$FileToRead.'\'.'));	
			
			// On lit tout le fichier et on renvoi son contenu
			$Contenu =  @fread($Handle, @filesize($FileToRead))
			  or die($this->SetLog('Template->ReadFile()', 'Impossible de lire le fichier \''.$FileToRead.'\'.'));
			  
			return $Contenu;
		}
		
		/*
			Fonction gerant le BBCode. Peut etre pas super utile a premiere vue mais peut toujours depanner :-)
			Si une variable est transmise, la fonction va activer le bbcode sur le contenu de cette variable sinon, elle le 
			fera sur le fichier modele.
		*/
		function SetBBCode($Value='')
		{
			// Si le moteur n'a pas ete demarre correctement
			if ( !$this->EngineStatus )
				die($this->SetLog('Template->SetBBCode()', 'Le moteur n\'a pas ete demarre avant d\'etre utilise !'));
			
			// Si une variables n'a pas ete transmise, on considere $Value comme une reference a $ContenuModele
			if ( !$Value ) {
				$Value = &$this->ContenuModele;
				$Reference = true;
			} 
			else {
				$Reference = false;
			}
			
			/* On remplace toutes les balises pouvant etre enleve sans regex */
			
			// Saut de ligne
			$Value = str_replace('[br]', '<br />', $Value);
			
			// Italique
			$Value = str_replace('[i]', '<i>', $Value);
			$Value = str_replace('[/i]', '</i>', $Value);
			
			// Gras
			$Value = str_replace('[b]', '<b>', $Value);
			$Value = str_replace('[/b]', '</b>', $Value);
			
			// Souligne
			$Value = str_replace('[u]', '<u>', $Value);
			$Value = str_replace('[/u]', '</u>', $Value);	
			
			// Liste
			$Value = str_replace('[list]', '<ul>', $Value);
			$Value = str_replace('[/list]', '</ul>', $Value);
			
			// Puce dans liste
			$Value = str_replace('[li]', '<li>', $Value);
			$Value = str_replace('[/li]', '</li>', $Value);
						
			// Toutes les balises fermees qui utilisent des regex pour leurs balises ouvertes			
			$Value = str_replace('[/size]', '</span>', $Value);
			$Value = str_replace('[/align]', '</div>', $Value);
			$Value = str_replace('[/color]', '</span>', $Value);
			$Value = str_replace('[/citation]', '</span></fieldset><br>', $Value);
			
			// Tabulation
			$Value = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $Value);
			
			/* On attaque les regex :p */			
			
			// Les images 
			$Value = preg_replace(
				'!\[img\=(http|news|ftp|https){1}(://){1}([a-z0-9]+[a-z0-9/.-]*\.)(gif|bmp|png|jpg|jpeg)\]!i', 
			  	'<img src="\\1\\2\\3\\4" />', 
			 	$Value
			);
			
			// Les liens vers des sites 
			$Value = preg_replace(
				'!(http|news|ftp|https){1}(://){1}([a-z0-9]+[a-z0-9/.-]*[a-z]+)!i', 
			  	'<a title="Aller vers \\3" target="_blank" href="\\1\\2\\3">\\1\\2\\3</a>', 
				$Value
			);
			
			// Les mails 
			$Value = preg_replace(
				'!([a-z09][a-z0-9._-]*[a-z09]@{1}[a-z09][a-z0-9._-]*[a-z09]\.{1}[a-z]{2,4})!', 
			  	'<a title="Envoyer un email à \\1" href="mailto:\\1">\\1</a>', 
				$Value
			);
			 
			// La couleur du texte 
			$Value = preg_replace(
				'!\[color=([a-z#0-9]+)\]!i', 
				'<span style="color:\\1;">', $Value
			);
			
			// Taille du texte 
			$Value = preg_replace(
				'!\[size=([0-9]+)\]!i', 
				'<span style="font-size:\\1px;">', 
				$Value
			);
			
			// Alignement du texte 
			$Value = preg_replace(
				'!\[align=(center|justify|left|right)\]!i', 
				'<div align="\\1">', 
				$Value
			);
			
			// Citation 
			$Value = preg_replace(
				'!\[citation=(.+)\]!i', 
			  	'<br><fieldset style="background-color:#00CCFF;width:400px;text-align:justify;"><legend><b>\\1 a dit </b></legend><span style="color:#000000;font-size:12px;">', 
				$Value
			);
			
			if ( !$Reference )
				return $Value;
		}
		
		/*
			Cette fonction affiche le modele en memoire. N'appeller cette fonction qu'a la fin du traitement !
		*/
		function Display() 
		{
			// On affiche les blocks 
			foreach ( $this->TableauOfBlock as $Indice => $Value )
			{
				$Regex = '!<engine:block name="'.$Indice.'">.*</engine:block:'.$Indice.'>!iUms';
				$this->ContenuModele = @preg_replace($Regex, $Value, $this->ContenuModele)
				  or die($this->SetLog('Template->Display()', 'Evaluation de l\'expression '.$Regex.' impossible.'));
				
				// On efface les derniers blocks ...
				$this->ContenuModele = str_replace('<engine:block name="'.$Indice.'">', '', $this->ContenuModele);
				$this->ContenuModele = str_replace('</engine:block:'.$Indice.'>', '', $this->ContenuModele);
				
				// ... ainsi que leurs fichiers temporaire
				if ( $this->DelTmpBlock )
					@unlink(md5($Indice));
			}
			
			// On affiche le contenu du fichier modele
			echo $this->ContenuModele;
		}
	}
?>

 Conclusion

Voila le niveau n'est pas extreme mais il y quelques suptilites, sa sera a vous de juger.
Derniere chose, pour ceux qui se demandent pourquoi j'ai realise une classe en php4 alors que php5 est super, tout simplement parce que mon hebergeur est toujours en php4 ... de toute facon le portage du code en php5 n'est pas d'une difficulte enorme, y a 3 trucs a changer et sa tourne ^^ (mais bon pour ceux qui veulent je peut faire un petit effort et le mettre en zip en php5... ;-) )

En esperant que sa vous plaira

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 août 2006 14:35:18 :
- Rectification du code visant a enlever plusieurs die() et autres @ (par contre il en reste un bon paquet :p) - J'ai essaye de virer le maximum d'expression reguliere quit a etre un peu plus complique (surtout dans les blocks) - Mis en cache des blocks afin d'acceler le temps de chargement. Possibililte de laisser les fichiers temporaires ou non (voir le constructeur de la classe) - Gestion (imparfaite) des blocks imbriques. Il reste encore des erreurs mais je travail dessus.

 Sources du même auteur

CHIFFRE DE CESAR
Source avec Zip [PHP5 - DOM - XPATH] CLASSE DE PRE-FILTRAGE DE TEXTE
Source avec Zip [PHP4.3.X-DOMXML]-CREATION D'UN MOTEUR DE TEMPLATE GRACE A D...
Source avec Zip [PHP5/DOM] CLASSE DE CREATION DE FLUX RSS VIA UN FICHIER XML
Source avec Zip Source avec une capture [PHP4/MYSQL]ALBUM PHOTO + PARTIE ADMIN AVEC BDD

 Sources de la même categorie

AFFICHÉ SUR UN TABLEAU AVEC PAGINATION ET BASE DE DONNÉES par stormxp
Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000

 Sources en rapport avec celle ci

Source avec Zip MOTEUR DE TEMPLATE PHPBB3 SIMPLIFIÉ EN PHP5 par gagah1
Source avec Zip TEMPLATE ENGINE SIMPLE ET PUISSANT. EXTENTION DE FONCTIONS P... par BlackWizzard
CLASS MOTEUR DE TEMPLATE PHP5 par choy
Source avec Zip MOTEUR DE TEMPLATE par FaustXVI
Source avec Zip Source avec une capture GALERIE PHOTO DYNAMIQUE GÉRÉE PAR MOTEUR TEMPLATE par darknessneo

Commentaires et avis

Commentaire de jean84 le 19/08/2006 23:24:15

Merci de ùe laisser des commentaires ;-)

@++

Commentaire de Alain Proviste le 20/08/2006 01:07:44 administrateur CS

c'est pas un peu dommage de faire des templates à l'heure de php5 ?

enfin moi je dis ça, php c'est pas ma prédilection...

Commentaire de pcgpegase le 20/08/2006 01:29:22

Bonsoir,

Je n'arrive pas à comprendre l'utilisation de cette source (sûrement parce que je ne connais pas le système de templates...), peux-tu fournir un petit peu plus d'aide ? :)

Merci !

Commentaire de xeonarno le 20/08/2006 03:05:23

Bonjour à tous,

En ce qui concerne ton code sympa au premier coup d'oeil. J'en avais fait un moi à partir de sources provenant de développez.com. Mais en un seul fichier bravo.
Par contre pour répondre à Alain, l'intérêt vient du faite que la quasi totalité des codes qui marchent sur Php4 vont sur Php5 et que tout le monde à le 4 alors que tout le monde n'a pas encore installé le 5. Question de compatibilité.
Pour PCGPEGASE, les templates signifie que pour un millier de pages voir plus tu vas utiliser le même modèle graphique et ergonomique de page web. Ainsi si tu veux changer la couleur de l'avant dernière case du tableau en bas à gauche tu n'as pas besoin d'ouvrir les milles pages. Juste le modèle ou template(ça veut dire patron en anglais, comme pour la couture).

Cordialement,

Xeonarno

Commentaire de malalam le 20/08/2006 11:10:21 administrateur CS

hello,

ce n'est pas ce qu'a dit Alain Proviste ;-) Il a dit qu'il était un peu dommage d'écrire un moteur de template à l'heure du PHP5; il ne t'a pas demandé pourquoi tu avais utilisé php4 pour écrire ton moteur de template. Et je suis plutôt d'accord avec lui.
Il y a de nos jours tout un tas d'autres possiblités. Ne serait-ce que simplement XML/XSLT. Un sacré moteur de template, ça...le plus puissant que je connaisse.

Par curiosité, tu as benché ton moteur ? parce qu'à mon avis, ça doit pas mal ramer : bcp d'expressions régulières quand même. Au passage, pourquoi ne pas avoir fait 1 str_replace avec des tableaux en paramètres? Je regarde pas en détail, parce que vraiment un truc me saute aux yeux : tu devrais te pencher sur son optimisation. A mon avis, j'insiste, il rame...

Commentaire de jean84 le 20/08/2006 21:45:12

Merci pour vos commentaires !
2/3 trucs :

Alain Proviste > Pourquoi un moteur de template ? Parce qu'on m'a demander d'en faire un et je trouve sa beaucoup plus pratique et qu'en plus, je ne connaissait que les moteurs de template et pas les templates tout cours... je vais faire une recherche pour voir

malalam > tu parles sans savoir => "Par curiosité, tu as benché ton moteur ? parce qu'à mon avis, ça doit pas mal ramer" tu pars d'une imrpession et puis tu derives vers "A mon avis, j'insiste, il rame..." ... cool sa.. et tout sa en regardant le code  10 secs ? "Je regarde pas en détail, parce que vraiment un truc me saute aux yeux : tu devrais te pencher sur son optimisation"... je suis d'accord pour l'optimisation m'enfin des commentaires dans ce genre.... et pour XML/XSLT, bah pour avoir regarder sa a l'air cool mais a ce moment la je te dirais de relire mon commentaire du debut a savoir => "Ce n'est pas le code du siecle mais sa peut toujours servir pour une premiere approche dans le cadre d'une utilisation futur d'un moteur plus pousse" ... une premiere approche ^^ simple non ? suffisait de lire !
Par contre tu vois XML/XSLT je connaissais pas et apres avoir lu un tuto dessus, je vais m'y interesse de pres ... merci pour l'info

pcgpegase > ok je te fait un exemple des que je peux

@++

Commentaire de malalam le 21/08/2006 08:17:29 administrateur CS

Jean84 -> je parle sans savoir ? Donc, si je résume, tu es d'accord avec moi, mais je parles sans savoir, et ça te vexe que je dise ça après 10sec à mater ton code ?

décidément, les commentaires sont difficiles à faire. J'ai dit "as-tu benché"..."parce qu'à mon avis"...si encore j'avais dit : "pardonne-moi mais ton code, c'est de la merde, il rame grave", j'aurais compris ta réaction.

Commence à me fatiguer ces réactions...

T'as pas envie qu'on discute de ton code, soit, moi, je dégage de ce post.

Commentaire de cyrphp le 21/08/2006 11:59:32

bonjour,

malalm -> dommage que tu quitte le post, ce code est interessant pour moi sous plein d'aspect (le principe du template  ...et  je suis un vrai debutant ) et tru semble avoir des choses interessantes a dire :)

D'un autre coté je ne comprends pas encore trop l'interet du xml/xslt  dans l'utilisation d'un template pour un site .
Il me semble bien que ça ne passe pas partout, xml 1.0 pour FF et IE , mais opera en zappe une bonne partie (pour le rendue du template ).
Du coup ,
les donneés du site doivent etre generé en xml (  , passé a la moulinette par xslt , en appliquant une template, pour au resultat avoir du html (probablement qu'arrivé a ce stade on ne parlera même plus de html ou xhtml aux standard W3C par tout les efforts effectué jusqu'alors )
Et pour un rendu compatible multi-navigateur il faudrait  demandé a php de gerer tout ça (avec un petit coup de "dom" en plus) et de  ne renvoyé qu'au navigateur du (x)html et son css associer.

Bref, je crois que les moteur de templates (php/html) ont encore une belle vie devant eux , et cette exemple , a l'air assez "comprehensible" pour un novice comme moi . se limiter a php, html, css , n'induit qu'un langage de programmation ,
alors que xml-> xslt-> php->(x)html & css , demande a en utiliser plutot 2 et alourdirais le "traitement"  ?
Ou bien je n'ai pas bien saisie les possibilité xml/xslt et CIE.


Merci et bravo encore pour la source ...
++

Commentaire de malalam le 21/08/2006 12:39:50 administrateur CS

cyrphp => si je n'ai plus envie de discuter sur ce code, c'est dû à la réaction de son auteur. Réaction excessive et agressive, sans raison étant donné que je n'ai pas, que je sache, démonter son code, ou dit qu'il était à chier.
Beaucoup de gars se plaignent de ne pas avoir de commantaires, mais dès qu'ils en ont, si ce n'est pas "Ton code est génial!!", ils se vexent. Aucune envie de discuter d'un code si c'est pour que l'auteur se vexe pour rien tous les 3 mots.
Maintenant...pour te répondre :
le plus beau des moteurs de template orienté HTML, pour moi, ça reste les CSS. Mais ça ne gère que la mise en page, pas le contenu. Vouloir utiliser un moteur de tamplete pour le contenu, pourquoi pas, c'est une mode qui perdure depuis un moment déjà.
Néanmoins, je pense sincèrement que le futur est bien au XML (et XHTML2 va plus encore dans ce sens).
En effet, je parle bien, pour un moteur de template basé sur XML, de transformation XSL, de DOM, et de gestion de tout ça par PHP. Si Opera ne gère pas bien xml...bah ce n'est pas très grave puisqu'en effet, le but est de renvoyer du XHTML au navigateur. Et XSLT fait ça très bien.

Il faut bien comprendre qu'un moteur de template est déjà très lourd : ça fait du parsing à outrance, avec des expressions régulières (et autres fonctions plus rapides quand c'est possible évidemment). Et quand c'est bien fait, ça doit gérer les blocs et leur hiérarchie. Et forcément, puisqu'on gère du html, on suit le modèle DOM.
Que fait DOM (l'extension php) ? Grosso modo, la même chose : cela gère un document (XML en l'occurence), sauf que c'est en natif. L'accès à un élément se fait forcément plus rapidement via l'extension DOM que si l'on devait réécrire cet accès avec des expressions régulières.
Je n'ai pas créé de moteur de template en XML, et je ne pense pas le faire. J'ai créé de nombreux modules XML qui font peu ou prou la même chose, mais en dédié à une tâche bien précise; ceci dit, je suis prêt à parier qu'un moteur de template basé sur XML sera plus rapide qu'un moteur de template classique. Et il sera bien plus facilement portable.
Et puis, à la limite, DOM n'est même pas nécesssaire dans ce cadre : l'extension XSLTProcesor peut suffire, selon le type de moteur que l'on veut écrire. Et avec elle, ce n'est pas la navigateur qui va transformer le XML, mais le serveur. Le navigateur recevra bien son XHTML et la CSS associée.

Commentaire de Anthomicro le 21/08/2006 13:17:13

Salut,

je ne sais pas si ton code gère les blocs imbriqués, le mien non mais je te le montre : http://www.vulgarisation-informatique.com/source-69--php-4-classe-de-templates-avec-systeme-de-cache.php

Concernant XML / XSLT, l'avantage d'un système de templates fait avec une classe PHP 4 est qu'il peut être plus rapide tout en étant largement plus portable ;)

Je ne demande qu'a bencher les deux solutions en ce qui me concerne, mais bon question portabilité celle-ci est largement devant étant donné que tu n'as besoin d'aucune extension pour la faire tourner ;)

Commentaire de kankrelune le 21/08/2006 14:53:12

Le principe est interessant mais perso je ne vois pas l'interet de programmer des images (ni d'auilleur tout autre balise html) dans un template... sur mon moteur cela passe par la gestion des constante l'url du répertoire d'image étant défini par une constante il suffit de faire <img src="<{constant:IMG_URL}>mon_img.ext" /> comme ça on reste dans le html et non pas dans les balises exotiques (comme avec smarty)... après c'est un avis perso ça n'engage donc que moi mais qui sait ça peut te donner des idées... .. .

Pour moi le plus gros problème est/a été de bien gérer le cache sur des templates multicouche (ex le theme du site non cachable, le block X cachable, le block Y non cachable, etc)... et bien parser les boucles et les conditions (pas encore finit)... le tout avec des perf acceptables... .. .

Sinon coté code à vu de nez...

- il faut optimiser la méthode de bbcodes les multi str_replace sont inutiles et lourd
- le @ et le or die pour le str_replace sont inutiles str_replace ne renverra jamais false ou alors faut sérieusement s'inquiéter.

- dans la methode setCss tu te prend la tête avec ta balise <engine...>

// On parcours le tableau
$nbArgs = count($Args);
$Fss = '';

for($i=0; $i<$nbArgs; $i++ )
    $Fss .= '<link media="all" rel="stylesheet" type="text/css" href="'.$Args[$i].'" />';

$this->ContenuModele = str_replace('<engine:css />', $Fss, $this->ContenuModele);

Point... pas besoin d'en faire plus... au passage on ne met jamais de count() dans la définition d'une la boucle for sauf si le tableau en question est suceptible de changer de taille en cours de route car l'expression du milieu est testée (et donc le count() éxécuté) avant chaque itération... 1000 itération = 1000 count

Je trouve les multiple die un peu inutiles voir éxagéré... d'une part ce n'est normalement pas à cette class de gérer la réaction à avoir en cas d'errreur, normalement elle doit renseigner dans un attribut les erreurs point barre c'est à toi de gérer ces erreur en dehors de la class, d'autre part faire un die parce que le nom d'une variable est oublié est un peu éxagéré... si la class n'arrive pas à récupérer le contenu du fichier template passe encore (bien que ce soit plutot crade) mais pour un tags mal déclaré ou non trouvé c'est éxagéré... au pire le gars aura une balise <engine...> qui apparaitra dans sa page et corrigera l'erreur... au mieux tu peux introduire la notion (optionelle) de parsing strict et virer toutes les balises inutilisées en fin de parsing en les logguant pour savoir quels balises ne sont pas utilisées pour pouvoir modifier le template en concéquance... .. .

Voila ce qui me vient à l'esprit en regardant ton code... améliorations possible hormis une otpimisation/réécriture de certain passages du code... intégration de la mise en cache... c'est un plus non néligeable... éventuellement permettre une gestion multi template/multi block serait pas mal non plus et permettrait une utilisation en singleton (une seul instance gérant tous les templates du site)... à mon avis il serait bien de séparer la logique de déclaration des template/block/tag de leur parsing (à faire juste avant l'affichage) permettant des modifications des elements à n'importe quel moment avant l'affichage par exemple en cas d'erreur... mais ça c'est encore une fois un avis (et une façon de fonctionner) perso... .. .

Voili voilou... .. .

@ tchaOo°

Commentaire de malalam le 21/08/2006 15:02:54 administrateur CS

Portabilité serveur PHP sans aucun doute. Portabilité tous systèmes, c'est autre chose...l'avantage d'xml/xslt est que c'est portable sur d'autres systèmes. Quitte, si on passe par php (ce qui n'est même pas nécessaire hein, entendons-nous bien) à développer un moteur sous un autre langage (ce qui reste simple, si on utilise DOM, puisque DOM conserve la même structure, les mêmes méthodes peu ou prou quel que soit le langage).
Et y a plusieurs solutions (je rappelle que je ne me suis jamais penché sur le problème vu que je n'ai jamais eu l'intention de créer un moteur de template) :
DOM+XSLT demande l'extension XSLT (vu que DOM est normalement installé par défaut).
DOM tout court ne demande rien de spécial (on peut se passer d'XSLT, évidemment, en le simulant. Et ça reste simple puisque via DOM, on a pas besoin de parser type expressions régulières du tout).
XML+XSLT tout simple (sans php) est carrément plus portable que php4, sinon, lol (et là encore, c'est toujours possible).
%ais je le répête, la base d'un tel moteur serait : une bonne réflexion sur la structure XML globale (sachant que ce sera toujours modulable), de préférence un appui XSLT pour faciliter les choses, si possible côté client, et un langage côté serveur qui sera plus chargé des traitements en amont (bref, c'est le langage côté serveur, ce serait plus pour un framework...le templating pouvant largement se contenter d'XML/XSLT. Comme le montrent quelques framework actuels, dont XMLRAD).

Quant à la rapidité, je ne suis pas convaincu du tout mais comme je l'ai dit, oui, ça demanderait un bench :-)

Commentaire de Anthomicro le 21/08/2006 18:42:49

"Portabilité serveur PHP sans aucun doute. Portabilité tous systèmes, c'est autre chose"

Assurément, m'enfin bon pourquoi foutre la structure de ton site en xml ? le contenu à la rigueur admettons, mais la structure invariante ? je n'en vois pas l'intérêt sinon réduire les perfs ;)

Commentaire de malalam le 22/08/2006 09:30:04 administrateur CS

Le XML n'est pas invariant, c'est un "langage" descriptif. Tu décris les données dont tu as besoin pour ton site, donc il change en fonction du type de site, de ton contenu. Le XML et le HTMl, c'est pas très différent, il ne faut pas l'oublier. C'est la même base (SGML).
Je ne vois pas en quoi ça réduirait drastiquement les perfs. En tous cas, un framework comme XMLRAD couplé à PHP, pour l'avoir testé il y a peu, n'est pas plus lent qu'un autre moteur dédié à PHP.

Commentaire de Anthomicro le 22/08/2006 12:41:12

Je demande qu'à voir pour les perfs, mais je me demande comment un truc hyper lourdingue peut rivaliser, franchement :p

Commentaire de malalam le 22/08/2006 12:43:03 administrateur CS

Bah comment tu peux savoir que c'est lourdingue, lol ?

Commentaire de FhX le 22/08/2006 13:32:24

De toute facon, le templating en PHP4, c'est démodé.
Enfin je dis ca parce que moi j'ai évolué très vite en PHP5 aussi...

Mais c'est vrai que je préfèrerai à la limite utiliser XML/XSLT pour faire du template plutot que PHP.
Faire du remplacement de variable pour un affichage n'est pas ce qui fait de mieux pour PHP... autant lui dédier d'autres taches comme de la récupération d'infos ou du calcul.

Après chacun son choix.

Commentaire de Anthomicro le 22/08/2006 13:53:58

"Bah comment tu peux savoir que c'est lourdingue, lol ?" > google ;)

Après rien ne vaut un test :) Mais bon déjà en général ces trucs là ce sont des usines à gaz donc bon je me fais pas d'illusions quant aux perfs sans cache ;)

Commentaire de malalam le 22/08/2006 14:42:36 administrateur CS

Antho => ouais, mais XMLRAD est un framework hein, pas un simple moteur de template. C'était un exemple : le côté template, dans XMLRAD se situe uniquement dans le couple XML/XSLT.
Le langage serveur est dédié aux traitements côté serveur SANS AUCUN LIEN avec le templating : accès aux bases de données, calculs complexes etc etc...et c'est XSLT qui se charge de mettre les résultats dans le XML.
Bref, mon idée : un moteur de template uniquement en XML/XSLT. Et inutile de le développer, il existe déjà : c'est XSLT ;-)
Et ça, franchement, je ne pense pas qu'un moteur de template PHP puisse le battre XML/XSLT (côté client donc) en terme de rapidité.
Après, vient le problème de base : les moteurs client XSLT ne sont pas toujours encore très performants. Mais ça viendra, et ça s'améliore de jour en jour d'ailleurs (ou presque lol).

Commentaire de jean84 le 22/08/2006 15:13:11

malalam > tu as entierement raison, ma reaction etait excessive alors qu'au final ce n'etait pas mon intention. Je m'en excuse. J'ai ecoute ce que tu avais a dire et je me suis donc renseigne sur le xml+xsl (j'ai trouve un tuto sur developpez.com franchement sympa). Apres avoir parcourus les possibilites, il est certains que c'est l'avenir vers lequel nous nous dirigeons. Malgre cela, comme l'a fait remarque anthomicro, mon code est utile lorsque on ne peut rajouter d'extension sur son site (genre les sites persos ou les petits hebergeurs). Mon code etait avant tout destine a ce type de service, il n'etait evidement pas destine a etre utilise sur un site pro ;-) La ou par contre tu pourrais peut etre m'aider, c'est a m'expliquer ce qu'est XSLT car je n'ai vu XSL sur le tuto. Tu as l'air d'en savoir long sur ce sujet et a vrai dire, le tuto que j'ai lu m'a franchement convaincu... si tu n'ai plus fache contre moi ;-) sa serait sympa de ta part de m'eclairer.

Merci d'avance et encore desole.

anthomicro > grand moment de solitude pour les blocks imbriques... je suis bien entrain de me battre avec mais sa me pete a la figure toutes les 3 lignes.... je mettrais la mise a jour des que j'aurais compris d'ou vient le probleme ^^

kankrelune > Pour les images, disons que c'est une de mes fantaisies persos et ce n'etait absolument pas necessaire, j'en ai bien concience... mon idee de base etait de pouvoir en fait lister les images d'un repertoire et les afficher grace au moteur. Pas vraiment utile mais l'idee m'amusait alors je me suis dit pourquoi pas ? faut bien rigoler de temps en temps ^^
Sinon pour les css clair que j'avais pas penser a sa... disons que je venais de finir pas mal d'autre trucs et que j'ai pas trop reflechis.... je modifis sa tout de suite ! et pareille pour les die() et autre @... qui sont au final inutile et ralentisse le moteur... J'ai fait un code en C++ recement et c'est vrai qu'il m'est reste quelques traits de paranoia...
Par contre la ou je ne te suis plus du tout, c'est quand tu parle de template multi couches et de mise en cache... si tu pouvais m'eclairer... ! sa serait sympa merci :-)

FhX > entierement d'accord avec toi... je l'ai compris au moment meme ou je le codais mais malheureusement, la mise a jour vers php5 de tout le parc des hebergeurs n'est pas pour tout de suite !! Si je fais un code de ce genre c'est plus pour l'utiliser dans mes creations plutot que de le laisser moisir dans un dossier... et pour ne citer que les principaux hebergeurs gratuits (genre free, lycos, ifrance ect et meme hosteur qui est mon hebergeur payant), ils sont tous dans la majorites  en php4 ! Je ne tente pas de generaliser et il est certains que des hebergeurs commencent a proposer le 5 mais malgre cela, je trouve (c'est un avis perso) qu'il est encore penible et peu evident de trouver un hebergeur respectable faisant tourne cette version de php. Ce n'est evidement que mon avis !!

@++

Commentaire de malalam le 22/08/2006 16:09:13 administrateur CS

Hello,

JEAN84 => ok, pas de problème, on arrête la guéguerre ;-)
XSL est un ensemble de "modules". On y trouve notamment XSLT, XSL-FO...ou XPATH.
http://www.w3.org/Style/XSL/

Pour schématiser, j'ai repris le code d'Antho, et plus exactement son exemple de template html, pour en faire une version XML/XSLT. Sachant évidemment que dans un vrai moteuyr basé là-dessus, il faudra générer de toutes façons donner les bonnes valeurs au flux XML (là, je l'ai fait en dur)
.
fichier template.xml (qui vaut pour l'instanciation de l'objet template et l'assignation de ses propriétés):
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<TEMPLATE>
<HEAD>
<TITRE>Mon Titre</TITRE>
<DESCRIPTION>Ma description</DESCRIPTION>
<KEYWORDS>mot1;mot2</KEYWORDS>
<AUTRE_STYLE></AUTRE_STYLE>
</HEAD>
<BODY>
<IDENTIFICATION>Bonjour Moi</IDENTIFICATION>
<DATE>22-08-2006</DATE>
<BIENVENUE>Bienvenue Moi</BIENVENUE>
</BODY>
</TEMPLATE>

Le fichier template.xsl qui fait la transormation en XHTML (quyi vaut pour le fichier html template, dans un moteur de template) :
<?xml version ="1.0" encoding ="iso-8859-1" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output
      method="html"
      encoding="ISO-8859-1"
      doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
      indent="yes" />
   <xsl:template match="TEMPLATE">
<head>
<xsl:apply-templates select="HEAD" />
</head>
<body>
<xsl:apply-templates select="BODY" />
</body>
   </xsl:template>
   <xsl:template match="HEAD">
   <xsl:param name="description" select="DESCRIPTION" />
   <xsl:param name="keywords" select="KEYWORDS" />
   <title><xsl:value-of select="TITRE"/></title>
<meta name="description" content="{$description}"/>
<meta name="keywords" content="{$keywords}"/>
   </xsl:template>
   <xsl:template match="BODY">
   <p>
   <xsl:value-of select="IDENTIFICATION"/>
   </p>
<p>
<xsl:value-of select="DATE"/>
</p>
<p><xsl:value-of select="BIENVENUE"/></p>
<ul>
<!--BLOC-->
<li>
<ul>
<li>test</li>
</ul>
</li>
<!--/BLOC-->
</ul>
   </xsl:template>
</xsl:stylesheet>

Si vous analysez bien, vous verrez que ce n'est pas très différent...au fond ;-)

Commentaire de Anthomicro le 22/08/2006 17:54:24

"Antho => ouais, mais XMLRAD est un framework hein, pas un simple moteur de template"

C'est pour ça qu'il ne peut rivaliser en terme de perfs c'est ce que je disais plus haut, c'est un truc lourdingue ;)

Après XSLT coté client je trouve pas ça propre car ça déplace le problème, le rendu peut ne pas être le même comme tu l'as souligné, contrairement au rendu côté serveur, et dès que y'a du rendu côté serveur, les perfs d'un bon système de templates sont meilleures ;)

Commentaire de malalam le 22/08/2006 18:21:37 administrateur CS

Oui mais XMLRAd était un exemple, pour le côté templating XML/XSLT...
et ensuite : ben nan...php génère du html, qui, couplé à des css, affiche COTE CLIENT quelquechose...qui est différent selon les clients. La preuve...le box model d'IE est différent du box model de FF, nan? Enfin, un moteur de template ne change rien à ça : c'est côté client que l'affichage se fait, toujours! Que ce soit du html, du xhtml, des css, du xml, ou du xhtml généré à partir de xml via xslt...c'est kif kif tout ça.

Commentaire de Anthomicro le 22/08/2006 20:50:47

Mais oui mais je ne parle pas de ça ...

Je compare juste le fait que quand tu dis que les perfs sont meilleures, tu compares un truc qui génère tout côté serveur face à une autre solution qui fait presque tout côté client... normal que les perfs soient meilleures. Tandis qu'en CSS si tu te débrouilles bien t'auras pas de différences entre les navigateurs. Si tu compares deux solutions équivalentes en terme de machines utilisées pour le rendu (à savoir que le serveur ou que le client ou les deux mais dans les mêmes proportions) je mets ma queue à couper que les templates gérées avec une classe optimisées sont plus performantes que n'importe quelle solution de parsing XML + XSLT :)

Commentaire de Anthomicro le 22/08/2006 20:53:32

Oups, ... j'ai mis "j'ai mis ma q... à couper" alors que je voulais éditer ça à la dernière minute lol ...

Commentaire de FhX le 22/08/2006 21:06:15

Va y avoir du "coupe-coupe" dans pas longtemps :p :p :p

Commentaire de malalam le 22/08/2006 21:34:54 administrateur CS

nan nan nan, t'es mis queue, et du coup, je vais faire des benches!!!!

Commentaire de cyrphp le 23/08/2006 00:27:21

re

JEAN84 expliquait :
___________________________________________________
.... mon code est utile lorsque on ne peut rajouter d'extension sur son site (genre les sites persos ou les petits hebergeurs). Mon code etait avant tout destine a ce type de service, il n'etait evidement pas destine a etre utilise sur un site pro ;-) ...
____________________________________________________

C'est effectivement comme ça que je l'ai perçu, etant debutant et heberge par free entre autre , il est evident pour moi que php5 est inaccessible , sauf en local eventuellement pour "bricoler".
Sa source est pour moi interessante car j'ai bien du mal a saisir le fonctionnement d'un template en php et celle-ci ne paraissait pas trop "grosse" a avalée ,  alors que le tandem xml/xlst me parait bien plus simple a mettre en oeuvre , mais limité coté client .

Sinon pour ce qui est des rendu css des navigateur, en partant d'un doctype valide html ou xhtml , on s'en sort pas trop mal , reste les vielles versions de IE (5.5 et inferieur) qui ne fond que du mode quirk, avec un peu d'habitude on arrive a eviter une majorité de bug et a l'aide des commentaires conditionnel on evite de trop titiller les "vieux" en restant sur une mise en page pas trop saccagé . Ceci dit si on vise aussi les vieux navigateur , bien souvent l'entete de la page reste un <html> de base avec le css de base aussi , dans les balise , entete ou fichier externe.

Evidemment si on veut IE5 (et d'autres) pour le xml/xlst (toujours pour rendu final (x)html ), faut passer le traitement coté serveur.
Du "coup"  si il y a des tutos et/ou info qui peuvent permettre d'apprehender le "templating" a partir d'un contenu de site  en xml  passable a la moulinette en php 4. , je serai
tres interessé, car je me pose toujours la question de l'interet du xml et ses langage associer pour un site web , vu la "puissance" et possibilite du traitement , et surtout l'integration , l'utilisation possible  des  contenu "xml" dans toutes sortes  d'applications.

hmm, peut-etre bien que je deborde du "sujet" et que j'aurai du aller plutot du coté du forum finalement , en tout cas je prefererait  volontiers me casser la tête sur xml et CIE passer a la moulinette coté serveurs que de tenter d'apprendre et de comprendre ce qu'il faut faire pour faire un bon template .

Je suis aussi allez voir le script de anthomicro , et je dois avouez etre tres heureux d'etre tombé ici  .

merci a la comunaute  :)

Commentaire de jean84 le 23/08/2006 15:57:50

malalam > cool :p

J'ai acheter un bouquin hier, c'est XSLT fondamental... 42 € la petite histoire quand meme... mais malgre ca, j'ai commence la lecture et c'est clair que c'est trop top !! J'ai hate que le processeur XSLT soit dispo sur une grande majorite de navigateurs, sa va etre beaucoup mieux !! par contre, il parle egalement de processeur saxon ainsi que d'un processeur mis en place par apache... il s'agirait d'un thread sur le serveur permettant la generation de code html ou rtf destine au navigateur ou a l'impression. Ayant depuis pas mal de temps envie de monter mon serveur apache pour le mettre sur le net, sais-tu ou je pourrais chopper les sources ou l'executable de cette solution ?? Et je voudrais savoir aussi a quoi sert l'espace de nommage, tu sais le <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> qui fait appelle a un fichier ou une norme (je sais plus trop) DTD... j'avoue que je me suis un peu embrouiller sur ce truc...
Pour mon bouquin, j'en suis au chapitre xpath (bien que j'ai commence a regarder le chapitre sur le focntionnement de xslt) et je dois dire WAHOU... je pensais aps que c'etait si evolue... par contre galere galere a comprendre :$ ....Au fait il parle beaucoup de java et de son api Java for XML qui permet la genreation de code egalement... as-tu des infos ??

Merci a tous !

@++

Commentaire de malalam le 24/08/2006 13:47:42 administrateur CS

L'espace de nom permet, en gros, aux documents basés sur SGML, d'utiliser des shémas particuliers...dans le cas d'une DTD ou d'un Shéma, cela va permettre de définir ton meta langage, donc de définir quelles sont les balises, quels sont les attributs et valeurs autorisées pour ces balises, etc...
Bref : c'est la définition de ton langage.

Commentaire de jean84 le 24/08/2006 14:14:03

oki merci pour l'info, j'avais un doute et je voualis une confirmation :p Merci !

POur le moteur, sa y est il gere les blocks imbriques (les blocks dans des blocks) seul contraintes pour y arriver facilement, ferme la balise d'un block par </engine:block:nom_du_block_a_ferme>.
J'ai vire quelques die() et autres @. Je mets a jour la source des que je peux ...

@++

Commentaire de kankrelune le 24/08/2006 15:08:54

Hello... les discutions vont bon train ici... c'est cool... .. . :o)

[quote]Par contre la ou je ne te suis plus du tout, c'est quand tu parle de template multi couches et de mise en cache... si tu pouvais m'eclairer... ! sa serait sympa merci[/quote]

Pas de p... concernant la mise en cache c'est pas compliqué... quand tu formate ton template tu optiens du code html... des fois le template en question à un contenu statique qui n'est pas régulièrement mis à jour... genre bloc avec un texte de bienvenue en page d'acceuil... d'où l'interet pour ce genre de bloc de sauvegarder le contenu dans un fichier html qui sera repris pour un prochain affichage évitant ainsi de réouvrir le fichier template pour en récupérer le contenu, de parser les balises et de renvoyer le contenu formaté... pour ça en gros quand je sauve le fichier je le nome comme suis tmp_[nom du template hashé via md5].[timestamp de création].html... lors de l'appel de la page la class template vérifie qu'un fichier portant l'id voulue (hasch md5) existe... s'il existe la class vérifie que le fichier n'est pas trop vieux en comparant sont timestamp (+ le temps de mise en cache voulu) avec le timestamp courant si le fichier est encore d'actualité la class prend directement le contenu du fichier et arrete le traitement (pour ce template) permettant ainsi d'économiser tout le parsing couteux en perf... si la comparaison des timestamp révèle que le fichier est trop vieu celui ci est supprimé, le template original reparsé et le résultat sauvegardé dans un nouveau fichier cache... avantage un gain de perf significatif, désavantage pas grand chose il faut juste prévoir une fonction pour vider le cache (pour voir les modifications tout de suite quand tu édite ton block static et pour ne pas remplir inutilement le repertoir de cache) et bien géré le cache vis à vis des internautes... car par ex un membre qui postera un message sur un livre d'or s'il ne vois pas son message s'afficher pensera à une erreur et sera tenté de le reposter mais une fois le temps de cache passé deux message apparaitrons... .. .

par gestion multicouche j'entend deux choses... d'une part les blocs imbriqués mais ça tu l'a réglé... en effet pouvoir imbriquer des template permet de n'utiliser qu'une seule et unique instance de la class (penser à l'instanciation singleton bien pratique)... les second point c'est la gestion du cache mais pour chaques templates/block et non pas pour tout ou pour rien... .. .

Voili voilou... .. .

@ tchaOo°

Commentaire de kankrelune le 24/08/2006 15:13:43

Ah oui j'ais oublié... pour la gestion multicouche... charger les templates dans un tableau...

$this->ContenuModele[$templateName] = $templateContent;

Ainsi dans tes méthodes tu appel le bon template en fonction du nom que lui as donné... ou via un attribut $this->lastTemplateName

Ca te permet de travailler sur plusieurs templates en parallèle dans la même instance de ta class... .. .

;o)

@ tchaOo°

Commentaire de jean84 le 25/08/2006 14:48:05

Merci beaucoup kankrelune pour ta perseverance dans tes explications mais au risque de passer pour un boulet (encore une fois me direz vous), je n'ai absolument rien compris !lol... en fait presque : si je resume, tu place les blocks dans des fichiers temporaires afinn de les garder sous la main pour plutart .. se t'evite d'avoir a detecter et reconstruire ton block... tu n'as plus qu'a charge le modele a partir du fichier histoire d'aller plus vite...

Est-ce que j'ai compris ??

Commentaire de kankrelune le 26/08/2006 20:25:14

Oui voila... ça t'évite de parser le block (charger le modèle, remplacer les balises...)... donc tu gagne en perf pour des bloc ou pages qui ne sont pas amennées à changer régulièrement de contenu... .. .

^_^

@ tchaOo°

ps : t'inquiète pas le boulet c'est celui qui ne cherche pas à comprendre... .. . ;o)

Commentaire de malalam le 26/08/2006 20:39:56 administrateur CS

N'empêche, ce code a déclenché une discussion très intéressante et sur des sujets variés! On
y apprend plein de choses :-)
On devrait créer un TOP10 des commentaires sur phpcs :-)

Commentaire de Alain Proviste le 27/08/2006 12:22:45 administrateur CS

merci d'avoir floodé ma boite mail

Commentaire de malalam le 27/08/2006 12:35:21 administrateur CS

On dira que c'était un flood intéressant, alors.

Commentaire de jean84 le 27/08/2006 20:58:11

lol c'est vrai que moi aussi ma boite mail me fait peur tous les jours ^^ !! Mais comme l'a dit malalam, c'est une discution tres interessante.
A propos de la mise en cache des blocks (reponse pour kankrelune) j'ai fini de l'implementer ce week-end.. j'ai encore ma cle usb donc je la met en ligne des demain je pense (si j'ai aps encore oublie :p)

Merci a tous !

Commentaire de jean84 le 28/08/2006 14:42:52

Voila le code a ete mis a jour :p
Si vous pouviez me dire ce que vous en pensez sa serait cool merci :-)
(pensez a la note sa fait toujours plaisir)

Commentaire de Alain Proviste le 28/08/2006 18:19:54 administrateur CS

oui c'est un flood interssant :)

Commentaire de jean84 le 29/08/2006 15:18:27

La gestion des blocks imbriques ne marche pas !! Je pensais que c'etait une erreur de me aprt lors de l'implementation du code exploitant le moteur mais en fait pas du tout .... c'ets bien mon code ... donc pour l'instant faudra attendre pour l'imbriquation des blocks .. (par contre pour la mise en cache pas de soucis !)

@++

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Qui est le moteur de template de joomla ? [ par wassimbik ] Bonjour,à tousQui est le moteur de template de joomla ?Pouvez vous me donner le code source du moteur de template de joomla  et m'aider à comprendre c comment intégrer le moteur de recherche blork engine [ par desdak ] Bonjour, j'ai un sérieux problème avec l'intégration du blork engine. J'ai suivi le mode d'emploi du moteur de recherche mais rien à faire je ne sais Quel framworks ? Quel moteur de template ? [ par chatis ] Bonjour, Je développe un site internet de réservation de court de tennis par internet et ma version 1 est terminée. Actuellement sur le site j'ai 150 Moteur de recherche PHP4 / XML [ par globule ] Bonjour, Je suis à la recherche d'un moteur de recherche compatible PHP4 qui utiliserait les données d'un fichier XML (à la place d'une base de donn php5 et moteur de template "smarty" [ par smahaneAAI ] Bonjour tout le monde! J'ai eu un projet de la création d'un site web concernant les appelles d'offre, ce projet doit être réalisé en langage php5 et Probleme script moteur de recherche [ par McGyver59 ] Bonjour Sur le web j'ai trouvé un moteur de recherche interne pour mon site il fonctionne trés bien mais j'ai un soucis avec. Meme si je ne met rien Développement web [ par alouane2010 ] svp , j'ai une application de gestion de controle, je veux créer une courbe pour le cout minute processus, ça bien marché, j'ai utilsé DhtmlX chart, m Moteur recherche SQL php [ par fregeal ] Bonjour Je cherche un moyen d'avoir un champs de recherche sql qui affiche les resultats sous forme d'un tableau mais tous les scritps que j'ai pus t modification template [ par hasony ] bonjour j'ai un problème lors d' insertion du Template pour mon site l'animation flash n'est pas bien fonctionner; au début tout est bien mais lors de difficulté pour etablier un moteur de recherche [ par msi079 ] salut a tous je viens de faire un petit moteur de recherche qui marche bien . a partir donc du numéro du courrier on arrive a avoir les information su


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales