Page 1 sur 1

Création d'un moteur de template, probleme : les conditions

Posté : 13 févr. 2007, 21:45
par Neidged6bels
Voilà bonjour à tous, j'ai décidé de créer mon propre moteur de template.
Je sais qu'il en existe de très bons déjà faits etc mais je le fais surtout pour apprendre, voir comment ça marche etc.
Je me suis aidé de ce tuto pour faire ce que j'ai :http://skillexchange.info/blog/index.ph ... e-template
et me suis inspiré de gagatemplate de gaga26 dont le tuto est disponible sur le site du Zéro.
Pour l'instant le moteur ne fait que le remplacement de variables.
Voici le code du moteur :
<?php 

class evoluTemplix
{
  // Declaration des variables utilisées par le moteur
  private $dossierTemplate ;  // Adresse du dossier des templates par rapport à la page
  private $contenuTemplate ;  // Contenu du fichier TPL
  private $cleVariable ;  // Cle utilisée par le TPL pour appeller une valeur
  private $valeurVariable ;  // Valeur d'une variable (liée à sa clé)
  
  
  // Constructeur, on défini le dossier des template et on initialise les variables moteur
  function __construct($dossier)
  {
    $this->dossierTemplate = $dossier ;
    $this->contenuTemplate = '' ;
    $this->cleVariable = array() ;
    $this->valeurVariable = array() ;
  }
  
  
  // On assigne une clé à sa valeur
  function assigne($cle, $valeur = null)
  {
    if(is_array($cle))
    { 
      foreach($cle as $cle => $valeur)
      {
        $cle = '{$'. $cle .'}' ;
        array_push($this->cleVariable, $cle) ;
        array_push($this->valeurVariable, $valeur) ;
      }
		}
		else
		{
      $cle = '{$'. $cle .'}' ;
      array_push($this->cleVariable, $cle) ;
      array_push($this->valeurVariable, $valeur) ;
    }
  }
  

  // Parsage du fichier TPL
  function parse($file)
  {
    $this->contenuTemplate = file_get_contents($this->dossierTemplate.$file) ; // Récupération du fichier TPL
    $this->contenuTemplate = str_replace($this->cleVariable, $this->valeurVariable, $this->contenuTemplate) ; // On remplace les clé par leur valeur respectives
    echo $this->contenuTemplate ; // On écrit le contenu du fichier sur la page
  }


}

?>
Alors voilà je voudrais faire des conditions qui seraient comme ça (remplacez les ** par des conditions)
{?if(**)} Matthew est un gnome {?else} C'est un fou {/?if}
Le probleme c'est que je n'ai aucune idée de comment fait ça, j'ai pensé que je pouvais essayer de les retrouver et les faire executer avec eval() mais je vois pas comment faire ça.
Sinon j'aimerai savoir comment faire pour chronometrer le temps d'éxécution de la page et de le placer dans une variable {$chrono} par exemple, je sais qu'on peut le faire avec microtime(true) en faisant la différence entre le début et la fin on l'an, mais je veut compter le parsage du moteur dedans et je vois pas comment mettre la valeur dans une variable apres que le fichier tpl ait été parsé.
Je sais pas si c'est très clair pour vous donc n'hésitez pas à poser des questions !! :)


Merci beaucoup d'avance ;) !!

Neidged6bels

Posté : 14 févr. 2007, 13:16
par naholyr
C'est un peu plus compliqué que ça si tu veux avoir à la fois les avantages des templates et à la fois la complexité de certaines conditions (les OR, AND, groupes, etc...). Je te renvoie au système que j'avais développé : Temphplate

Posté : 14 févr. 2007, 15:19
par Neidged6bels
D'accord, je vais prendre le temps de regarder ça de plus près, sinon dans le même sujet :
<?php


class evoluTemplix
{
  // Declaration des variables utilisées par le moteur
  private $dossierTemplate ;  // Adresse du dossier des templates par rapport à la page
  private $contenuTemplate ;  // Contenu du fichier TPL
  private $cleVariable ;  // Cle utilisée par le TPL pour appeller une valeur
  private $valeurVariable ;  // Valeur d'une variable (liée à sa clé)


  // Constructeur, on défini le dossier des template et on initialise les variables moteur
  function __construct($dossier)
  {
    $this->dossierTemplate = $dossier ;
    $this->contenuTemplate = '' ;
    $this->variables = array() ;
  }


  // On assigne une clé à sa valeur
  function assigne($cle, $valeur)
  {
    $cle = '<$'. $cle .'>' ;
    $this->variables[$cle] = $valeur ;
    
    //echo '<pre>' ;
    //print_r($this->variables) ;       Pour tester
    //echo '</pre>' ;
  }


  // Parsage du fichier TPL
  function parse($file)
  {
    $this->contenuTemplate = file_get_contents($this->dossierTemplate.$file) ; // Récupération du fichier TPL

    foreach($this->variables as $cle => $valeur)
    {
      str_replace($cle, $valeur, $this->contenuTemplate) ;
    }

    echo $this->contenuTemplate ; // On écrit le contenu du fichier sur la page
  }


}

?>

Pourquoi le str_replace ne remplace pas mes clé par leur valeur ??


Merci de ta réponse !! :D

Posté : 14 févr. 2007, 18:56
par Neidged6bels
Bon j'ai trouvé l'erreur, sinon connais-tu de bon tutos sur les concepts qui peuvent m'aider à créer mon moteur, car je fais ça surtout pour apprendre :wink:
Merci !!

Posté : 14 févr. 2007, 22:35
par naholyr
Aucun tuto ni aucune doc, au niveau du code je suis personnellement parti de rien. J'avais une idée bien précise des fonctionnalités que je voulais intégrer, je ne me suis pas préocuppé du code avant d'avoir dressé cette liste précisément ;) C'est presque comme si j'avais écrit le manuel d'utilisation, puis ensuite coder de manière à coller à ce manuel.

Posté : 15 févr. 2007, 15:21
par Neidged6bels
Ouais c'est super, j'aimerai avoir le niveau pour faire ça moi mais c'est pas encore le cas :wink:
Mais la pour les blocks, le temps de génération de la page et les conditions.
J'envisage à la rigueur de faire des boucles et peut-etre (dans le futur :-° ) un systeme de cache. Sauf que j'ai beau essayer de m'inspirer d'autres codes.
Je vois pas comment arriver à lire une partie du code du fichier TPL, le parser en PHP et le faire executer en temps que php (avec eval() ?). Tu pourrai pas me mettre sur la voie, après je pourrais arriver à me débrouiller avec d'autres codes et la doc php.
Pour ce qui est des blocks, j'y comprend absolument rien :roll:
Je me demande si c'était pas un peu trop haut comme objectif.
Mais étant donné que c'est plus pour aprendre que pour utiliser ce que j'aurais j'aimerais quand même bien savoir comme faire tout ça :wink:
Merci de tes réponses !