Tutoriel – Initiation aux templates en php
Voici un petit tutoriel, sans prétention pour vous initier au développement de templates en php. C’est une petite contribution, qui permet de visualiser quelques points de la programmation en php et afin d’en comprendre quelques mécanismes.
Pour cet exercice, je vais considérer que vous avez des bases en programmation php et que vous avez votre environnement de travail (exemple WAMP).
Dans un premier temps vous allez créer deux dossiers à la racine de votre site, un dossier nommé templates et l’autre zones.
Ensuite nous allons créer des fonctions, au nombre de 4. Bien entendu, on pourrait faire cela sous forme de classe, mais c’est juste pour vous faire découvrir quelques principes de base.
Alors appelons notre fichier qui contiendra ces fonctions template.php, que nous mettrons à la racine.
Première fonction, getContent() est la fonction principale, celle qui va faire l’appel du template et le gérer, elle va appeler d’autres fonctions :
[pastacode lang= »php » manual= »%2F%2F%20Appel%20et%20affichage%20du%20template%0A%2F%2F%20%24require%20%3D%20chemin%20vers%20le%20template%0Afunction%20getContent(%24require)%7B%0A%0A%2F%2F%20d%C3%A9marrage%20du%20buffer%0Aob_start()%3B%0A%0A%2F%2F%20Verification%20si%20le%20fichier%20existe%0Aif(file_exists(%24require))%0Arequire(%24require)%3B%0Aelse%0Aecho%20’ERROR%20%3A%20TEMPLATE%20INTROUVABLE%20!!!’%3B%0A%0A%2F%2F%20copie%20du%20contenu%20du%20tampon%20dans%20une%20variable%0A%24out%20%3D%20ob_get_contents()%3B%0A%0A%2F%2F%20effacement%20du%20contenu%20du%20tampon%20et%20arret%20de%20son%20fonctionnement%0Aob_end_clean()%3B%0A%0A%2F%2F%20Recherche%20d’%C3%A9l%C3%A9ment%20a%20remplacer%0A%24out%20%3D%20preg_replace_callback(‘%23%5C%7B(.*)~(.*)%5C%7D%23U’%2C%20’callbackBuff’%2C%20%24out)%3B%0A%0A%2F%2F%20Retour%0Aecho%20%24out%3B%0A%0A%7D » message= » » highlight= » » provider= »manual »/]
Que peut on remarquer ? la mise en mémoire des éléments et le tout est inséré dans une variable $out. Après, on va passer les éléments à la moulinette via la fonction preg_replace_callback et nous allons récupérer tous les éléments composés ainsi : {VALEUR1~VALEUR2}, puis à chaque fois appeler une fonction nommée callbackBuff().
Retrouvons cette dernière :
[pastacode lang= »php » manual= »%2F%2F%20Le%20callback%0Afunction%20callbackBuff(%24matches)%7B%0A%0A%2F%2F%20ELEMENTS%20%3A%20%24matches%5B0%5D(tout)%20-%20%24matches%5B1%5D(premiere%20partie)%20%24matches%5B2%5D(deuxieme%20partie)%0A%0A%2F%2F%20Pour%20l’instant%20seules%20les%20zones%20et%20les%20contenus%20sont%20trait%C3%A9es%0Aif(%24matches%5B1%5D%20%3D%3D%20’ZONE’)%0Areturn%20buffZone(%24matches%5B2%5D)%3B%0Aif(%24matches%5B1%5D%20%3D%3D%20’VAR’)%0Areturn%20buffVar(%24matches%5B2%5D)%3B%0Aelse%0Areturn%20%24matches%5B0%5D%3B%0A%0A%7D » message= » » highlight= » » provider= »manual »/]
C’est simple, on vérifie la première valeur, en résumé VALEUR1 de notre exemple {VALEUR1~VALEUR2}. Si cette valeur est ZONE on appelle la fonction buffZone() avec la deuxième valeur (VALEUR2) comme argument, si la valeur est VAR alors on appelle buffVar() pareils avec pour argument VALEUR2 et sinon on retourne l’élément inchangé.
Voyons donc nos deux autres fonctions buffZone() et buffVar() :
[pastacode lang= »php » manual= »%2F%2F%20Affichage%20d’une%20zone%0Afunction%20buffZone(%24zone)%7B%0A%0A%2F%2F%20Le%20chemin%20vars%20le%20fichier%0A%24file_zone%20%3D%20’zones%2F’.strtolower(%24zone).’.php’%3B%0A%0A%2F%2F%20d%C3%A9marrage%20du%20buffer%0Aob_start()%3B%0A%0A%2F%2F%20Chargement%20de%20la%20zone%0Aif(file_exists(%24file_zone))%0Arequire(%24file_zone)%3B%0Aelse%0Aecho%20 »%3B%0A%0A%2F%2F%20copie%20du%20contenu%20du%20tampon%20dans%20une%20variable%0A%24out%20%3D%20ob_get_contents()%3B%0A%0A%2F%2F%20effacement%20du%20contenu%20du%20tampon%20et%20arret%20de%20son%20fonctionnement%0Aob_end_clean()%3B%0A%0A%2F%2F%20traitement%20de%20la%20chaine%20obtenue%0A%24out%20%3D%20preg_replace_callback(‘%23%5C%7B(.*)~(.*)%5C%7D%23U’%2C%20’callbackBuff’%2C%20%24out)%3B%0A%0A%2F%2F%20Sortie%0Areturn%20%24out%3B%0A%0A%7D%0A%0A%2F%2F%20Affichage%20d’une%20variable%0Afunction%20buffVar(%24var)%7B%0A%0Arequire(‘var.php’)%3B%0A%0A%2F%2F%20d%C3%A9marrage%20du%20buffer%0Aob_start()%3B%0A%0A%2F%2F%20Chargement%20de%20la%20zone%0Aif(isset(%24%24var))%0Aecho%20%24%24var%3B%0Aelse%0Aecho%20 »%3B%0A%0A%2F%2F%20copie%20du%20contenu%20du%20tampon%20dans%20une%20variable%0A%24out%20%3D%20ob_get_contents()%3B%0A%0A%2F%2F%20effacement%20du%20contenu%20du%20tampon%20et%20arret%20de%20son%20fonctionnement%0Aob_end_clean()%3B%0A%0A%2F%2F%20traitement%20de%20la%20chaine%20obtenue%0A%24out%20%3D%20preg_replace_callback(‘%23%5C%7B(.*)~(.*)%5C%7D%23U’%2C%20’callbackBuff’%2C%20%24out)%3B%0A%0A%2F%2F%20Sortie%0Areturn%20%24out%3B%0A%0A%7D » message= » » highlight= » » provider= »manual »/]
Que peut on observer ? Qu’on aurait pu faire plus simple et fusionner ces deux fonctions qui se ressemblent grandement, mais ainsi vous pouvez mieux observer les éléments, les différences et le comportement.
Donc, que se passe t il ? C’est que chacune des fonctions va réagir selon l’argument passé, par exemple buffZone() appellera un fichier php s’il existe dans le dossier zone et buffVar() appellera une variable contenu dans le fichier var.php qui est à la racine.
Ce que l’on peut observer aussi, c’est la possibilité de rappeler encore des éléments {VALEUR1~VALEUR2} grâce à la fonction preg_replace_callback().
Donc certes, c’est un petit tutoriel, mais les possibilités sont tout de même nombreuses.
Exemple d’utilisation le plus simple, créez un fichier index.php à la racine avec comme contenu :
[pastacode lang= »php » manual= »%3C%3Fphp%20require(‘template.php’)%3B%20getContent(‘templates%2Fdefault.tpl.php’)%3B%20%3F%3E » message= » » highlight= » » provider= »manual »/]
Créez votre fichier var.php à la racine, avec comme contenu :
[pastacode lang= »php » manual= »%3C%3Fphp%20%0A%24title%20%3D%20’TITRE%20DU%20SITE’%3B%20%0A%24h1%20%3D%20’LE%20H1%20DU%20SITE’%3B%20%0A%24p%20%3D%20’BALISE%20P%20DU%20SITE’%3B%20%0A%3F%3E » message= » » highlight= » » provider= »manual »/]
Maintenant créez un fichier zone1.php dans le dossier zones :
[pastacode lang= »markup » manual= »%3Cdiv%3E%0A%0AZONE%201%0A%0A%3C%2Fdiv%3E » message= » » highlight= » » provider= »manual »/]
Et pour terminer un fichier default.tpl.php dans le dossier templates :
[pastacode lang= »php » manual= »%7BVAR~title%7D%0A%0A%3Ch1%3E%7BVAR~h1%7D%3C%2Fh1%3E%0A%7BVAR~p%7D%0A%0A%7BZONE~zone1%7D%0A%0A%7BAFFICHE~OK%7D » message= » » highlight= » » provider= »manual »/]
Si vous avez bien suivi ce tuto vous avez une racine qui ressemble à ça :
Et en lançant le fichier index.php vous obtiendrez ceci :
Que voit on ? Que les éléments ont bien été traité, que ce qu’il y avait dans le fichier zone1.php s’affiche, que nos variables ont bien été récupérées. Et que l’élément entre crochet qui n’appelle ni une zone, ni une variable s’affiche normalement.
A savoir que vous pouvez appeler une zone dans une zone (attention aux boucles infinies) :
Dans zone1.php
[pastacode lang= »markup » manual= »%3Cdiv%3E%0A%0AAffiche%20une%20zone%202%0A%7BZONE~zone2%7D%0A%0A%3C%2Fdiv%3E » message= » » highlight= » » provider= »manual »/]
Créez un fichier zone2.php dans le dossier zones avec :
[pastacode lang= »markup » manual= »%0AZONE%202%20%3A%20%7BVAR~title%7D » message= » » highlight= » » provider= »manual »/]
Relancez l’index.php et voyez le résultat.
A savoir que vous pouvez aussi appeler des zones et des variables depuis les variables du fichier var.php, exemple :
[pastacode lang= »php » manual= »%3C%3Fphp%20%0A%24title%20%3D%20’TITRE%20DU%20SITE’%3B%20%0A%24h1%20%3D%20’LE%20H1%20DU%20SITE’%3B%20%0A%24p%20%3D%20’%7BZONE~zone2%7D’%3B%20%0A%3F%3E » message= » » highlight= » » provider= »manual »/]
Faites plusieurs essais avec différentes possibilités.
Pour télécharger les fichiers :
tuto_template.zip
N’hésitez pas à apporter vos remarques et contributions.
Ce tutoriel était une petite initiation, mais qui devrait amener les novices à poser ou se poser des questions et à entrevoir des possibilités envisageables.
Bon code à tous 🙂
1 novembre 2009
Cool, ce petit tuto. Ça va me permettre d’évoluer dans ma logique dev
1 novembre 2009
Merci pour le commentaire.
J’espère que ça va pouvoir t’aider. Si tu as des questions n’hésite pas Willzgui. Bientôt je mettrais en ligne un petit forum afin d’échanger plus facilement autours du dev.
++ l’ami 😉
2 mai 2010
Bonjour
J’arrive sur cette page !! Extra, va t’il y avoir une petite suite …?
Merci pour l’échange 😉
2 mai 2010
Salut Fantoche,
Bah écoute, je n’allais pas forcément le faire, mais vu ton enthousiasme et tes encouragements, je vais te répondre pourquoi pas.
Je prépare tout ça dans la semaine.
Je t’enverrais un mail pour te tenir informé 😉
Merci pour le commentaire
@+
2 mai 2010
Que dire !!?
Merci beaucoup, bon esprit 😉
A bientot, je lis aussi l’article concernant l’éditeur TinyMCE que je découvre plus facilement a présent.
Bon fin de WE
A biental
2 mai 2010
Tiens en parlant de TinyMCE, un article plus complet et approfondi arrivera vers la mi-Mai je pense.
Bonne fin de WE également 😉