Class template PHP5
Hors ligneEmmablack Le 17/08/2007 à 12:55 Profil de Emmablack Configuration de Emmablack

Hello tout le monde ;)
j'ai commencé à réaliser une class template en PHP5. Je sais qu'il y en a une sur ce site, mais pour une fois je voulais en faire une moi-même ^^
Pour le début je n'ai pas eu de soucis : on peu associer un fichier, créer des variables et afficher le fichier?
Mais je n'arrive pas à créer des blocs !
J'ai repris le code utilisé dans la class de ce site et l'ai adapté à la mienne, mais ça ne marche pas plus.
Voici le code actuel (il est commenté donc vous devriez bien le comprendre) :



<?php
//
//     fichier: class.template.php
//     auteur: EmmaBlack
//     crée: 16/08/2007
//     version: 0.0.1 - 31/08/2007
//

class template {
     private $blocs;                         // liste tous les blocs existants array('nom' => 'contenu')
     private $cheminTpl;                    // chemin vers le dossier tpl correspondant au fichier en cours
     private $contenuBloc;                    // liste le contenu des blocs array('nomBloc' => 'contenu')
     private $erreur;                    // liste les erreurs possibles array('erreur')
     private $variablesListe;               // liste les variables et leur valeur array('NOM' => 'valeur')

     /*
     ** initialise quelques variables
     */
     public function __construct() {
          $this->blocs = array('' => '');
          $this->contenuBloc = array('' => '');
          $this->erreur = array();
          $this->variablesListe = array();
     }

     /*
     ** associe un fichier tpl à un fichier PHP
     ** $nomFichier          nom du fichier tpl
     ** $cheminFichier     chemin jusqu'au fichier tpl
     */
     public function associer_fichier($nomFichier$cheminFichier) {
          global $racine;

          $this->cheminFichier $racine 'styles/' $cheminFichier '/' $nomFichier;
          $this->cheminTpl $racine'styles/' $cheminFichier '/';
          $this->nomFichier $nomFichier;

          if (file_exists($this->cheminFichier)) {
               $this->contenuFichier file_get_contents($this->cheminFichier);
               $this->inclure_fichier();
               
               $this
->variablesListe['RACINE_TPL'] = $racine 'styles/' $cheminFichier;
          }
          else {
               $this->erreur[] = 'Impossible de trouver le fichier <b>' $this->cheminFichier '</b> (ligne ' __LINE__ ' du fichier ' __FILE__ ')';
          }
     }

     /*
     ** inclut des fichiers tpl supplémentaires
     */
     private function inclure_fichier() {
          preg_match_all('#<!-- INCLURE ([a-zA-Z0-9\_\-\+\./]+) -->#'$this->contenuFichier$matches);

          foreach ($matches[1] as $fichier) {
               if (file_exists($this->cheminTpl $fichier)) {
                    $fichierInclut = @file_get_contents($this->cheminTpl $fichier);
                    $this->contenuFichier preg_replace('#<!-- INCLURE ' $fichier ' -->#'$fichierInclut$this->contenuFichier);

                    unset($matches);
                    unset($fichier);
               }
               else {
                    $this->erreur[] = 'Le fichier tpl <b>' $fichier '</b> n\'existe pas (ligne ' __LINE__ ' du fichier ' __FILE__ ')';
               }
          }

          if (preg_match('#<!-- INCLURE ([a-zA-Z0-9\_\-\+\./]+) -->#'$this->contenuFichier)) {
               $this->inclure_fichier();
          }
     }

     /*
     ** crée l'array contenant toutes les variables à remplacer dans le fichier tpl
     ** $variablesAry     array de variables array('NOM', 'valeur')
     */
     public function variables($variablesAry) {
          if (is_array($variablesAry)) {
               foreach ($variablesAry as $nom => $valeur) {
                    $this->variablesListe[$nom] = $valeur;
               }
          }
          else {
               $this->erreur[] = __METHOD__ ' demande un array en entrée (ligne ' __LINE__ ' du fichier ' __FILE__ ')';
          }
     }

     /*
     ** remplace les variables crées dans variables() par leur équivalent
     */
     private function remplace_variables() {
          global $lang;

          foreach ($this->variablesListe as $nom => $valeur) {
               $this->contenuFichier str_replace('{' $nom '}'$valeur$this->contenuFichier);
          }

          preg_match_all('#{L_([a-zA-Z0-9\_\-\+\./]+)}#'$this->contenuFichier$cle);

          foreach ($cle[1] as $cleLang) {
               $this->contenuFichier preg_replace('#{L_' $cleLang '}#'$lang[$cleLang], $this->contenuFichier);
          }
     }

     /*
     ** crée l'array contenant toutes les variables à remplacer dans le bloc du fichier tpl
     ** $nomBloc          nom du bloc
     ** $variablesAry     array de variables array('NOM' => 'valeur')
     */
     public function variables_bloc($nomBloc$variablesAry) {
          if (!array_key_exists($nomBloc$this->blocs)) {
               $tableauEreg = array();
               ereg('<!-- DEBUT ' $nomBloc ' -->(.*)<!-- FIN ' $nomBloc ' -->'$this->contenuFichier$tableauEreg);
               $this->blocs[$nomBloc] = $tableauEreg[0];
          }
          
          $rechercheAry 
= array('<!-- DEBUT ' $nomBloc ' -->''<!-- FIN ' $nomBloc ' -->');
          $remplacementAry = array('''');

          foreach ($variablesAry as $nom => $valeur) {
               $rechercheAry[] = '{' $nomBloc '.' $nom '}';
               $remplacementAry[] = $valeur;
          }

          if (array_key_exists($nomBloc$this->contenuBloc)) {
               $this->contenuBloc[$nomBloc] .= str_replace($rechercheAry$remplacementAry$this->blocs[$nomBloc]);
          }
          else {
               $this->contenuBloc[$nomBloc] = str_replace($rechercheAry$remplacementAry$this->blocs[$nomBloc]);
          }
     }

     /*
     ** remplace les blocs de variables crée dans variables_blocs() par leur équivalent
     */
     private function remplace_blocs() {
          foreach ($this->contenuBloc as $nomBloc => $contenu) {
               $this->contenuFichier str_replace($this->blocs[$nomBloc], $contenu$this->contenuFichier);
          }
     }

     /*
     ** affiche le fichier demandé s'il n'y a pas d'erreur
     */
     public function __toString() {
          $this->remplace_variables();
          $this->remplace_blocs();

          if (!$this->erreur) {
               return $this->contenuFichier;
          }
          
          exit
;
     }

     /*
     ** affiche la liste d'erreur s'il y en a
     */
     public function __destruct() {
          if ($this->erreur) {
               foreach ($this->erreur as $erreurId => $erreurTexte) {
                    $erreurId += 1;
                    echo '<br /><b>Erreur n°' $erreurId '</b> : ' $erreurTexte;
               }
          }
     }
}
?>

Si vous trouvez un moyen de résoudre mon soucis, merci de me l'indiquer ;)
Bonne journée,
EmmaBlack
Hors ligneAnthony Le 17/08/2007 à 13:27 Profil de Anthony Configuration de Anthony

Admin
Salut EmmaBlack

Tu appelles à chaque fois que tu assignes une variable à un bloc la fonction $this->remplace_blocs(); or elle ne doit être appelée qu'une fois avant l'affichage général
--

Hors ligneEmmablack Le 17/08/2007 à 13:31 Profil de Emmablack Configuration de Emmablack

Hello ;)
Donc il vaudrait mettre la ligne $this->remplace_blocs(); (et par conséquent $this->remplace_variables();) dans la fonction __toString() ?
Hors ligneAnthony Le 17/08/2007 à 13:40 Profil de Anthony Configuration de Anthony

Admin
Oui
--

Hors ligneEmmablack Le 17/08/2007 à 13:44 Profil de Emmablack Configuration de Emmablack

Voila j'ai déplacé les deux lignes (code du premier message à jour), mais j'ai toujours le même soucis... Les blocs ne sont pas remplacés.
Hors ligneEmmablack Le 19/08/2007 à 17:06 Profil de Emmablack Configuration de Emmablack

Hello ;)
Personne ne peux m'aider pour le problème de bloc ?
J'ai mit à jour le code : ajout de la fonction inclure_fichier() qui permet d'inclure un fichier tpl, directement dans un autre !
Merci à tous pour votre aide,
EmmaBlack
Hors ligneAnthony Le 19/08/2007 à 19:16 Profil de Anthony Configuration de Anthony

Admin
Je suis sur ton code, mais tu t'es aventuré dans beaucoup trop de modifications sans comprendre le code, ce qui fait que plus rien ne fonctionne ... certaines méthodes comme la méthode __tostring() n'ont pas de sens car tu attends un paramètre alors que la méthode __tostring() est appelée automatiquement quand tu fais un echo $template;

Bref je vais voir si j'arrive à savoir d'où vient le problème, mais pour l'instant c'est pas gagné

EDIT : Parfois il y a des bout de mon code, parfois du tien, modifés et qui ne veulent donc plus rien dire ... il faudrait que tu reprennes ton code en partant à mon avis de zéro car là c'est l'embrouille totale ...
--

Hors ligneEmmablack Le 19/08/2007 à 19:36 Profil de Emmablack Configuration de Emmablack

Hello ;)
Merci pour la réponse.
Pour la fonction toString, je pourrais retirer l'argument demandé en entrée. Il faudra juste modifier la fonction après pour que le résultat soit le même, mais ça ne doit pas être impossible :)
Pour le moment j'arrête de toucher au code... Etant donné que tu es dessus, si tou les jours j'en poste un nouveau, ça n'aide pas :D
Hors ligneAnthony Le 19/08/2007 à 20:31 Profil de Anthony Configuration de Anthony

Admin
Bah là j'ai lâché l'affaire, y'avait mon code, le tien, un mix des deux et au final rien ne marchait, alors quand par magie j'arrivais à corriger un truc y'avait autre chose qui déconnait, et ainsi de suite, bref l'horreur.
--

Hors ligneEmmablack Le 19/08/2007 à 20:35 Profil de Emmablack Configuration de Emmablack

Ok ^^
Le problème est que je n'ai aucune idée de comment crée les fonctions pour gérer les blocs.
Toutes les autres fonctions je les ait faites de moi-même sans soucis, mais sur ces deux-là je sèche :S
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels