Templates : les blocks imbriqués et une astuce

juin 30, 2005

in Astuces et Tutoriaux

Pour illustrer le cas, nous allons mettre en place une sorte d’annuaire des liens sur PHP ! Pour simplifier au maximum je ne prendrais que les titres des sites.

Les données

J’utilise ici des tableaux, car c’est plus simple dans le cadre du tutorial. Mais nous pourrions, utiliser des données provenant d’une base de données.

<?
$categories = array( // les catégories de liens
    0 =>"Francais",
    1 =>"Anglais"
    );
$liens[0]=array( // les liens de la catégorie 0
    0 => "Phpinfo.net",
    1 => "PhpFrance.com"
    );

$liens[1]=array( // les liens de la catégorie 1
    0 => "PhpBuilder.com",
    1 => "Php.net"
    );
?>

Le template

Comme le tutorial est sur les blocks imbriqués, nous allons créer un seul fichier (tableau.tpl) contenant un titre et 2 blocks :

<html>
<p><font size="3"><b>Mes liens</b></font></p>
<!-- BEGIN CATEGORIE --><p><b>{TITRE_CATEGORIE}</b><br>
<!-- BEGIN ITEM --> * {TITRE_ITEM}<br>
<!-- END ITEM --></p><!-- END CATEGORIE -->
</html>

Comme vous pouvez le constater le block ITEM commence et se termine à l’intérieur du block CATEGORIE. Il ne faut pas l’oublier au moment d’écrire son code Php. On doit en effet commencer par déclarer le block à l’intérieur, puis l’autre :

$t->set_block("tableau","ITEM","item"); // on définit le block intérieur
$t->set_block("tableau","CATEGORIE","categorie"); // on définit le block extérieur

IMPORTANT : Si on faisait l’inverse, le block ITEM ne sera pas vu du tout, et vous obtiendriez un message d’erreur.

Le script

<?
include "template.inc";
$t=new template("."); // création du template
$t->set_file("tableau","tableau.tpl"); // on indique le fichier servant de modèle
$t->set_block("tableau","ITEM","item"); // on définit le block intérieur
$t->set_block("tableau","CATEGORIE","categorie"); // on définit le block extérieur
for ($i=0; $i<sizeof($categories); $i++) { // on commence par lister les catégories
       $t->set_var("TITRE_CATEGORIE",$categories[$i]);
       $t->set_var("item",""); // ligne à ne pas oublier sous peine de surprise !!!
        for ($j=0; $j<sizeof($liens[$i]); $j++) { // on liste les liens pour chaque catégorie
                     $t->set_var("TITRE_ITEM",$liens [$i][$j]);
                     $t->parse ("item","ITEM",true); //on traite le block ITEM
                     }
       $t->parse ("categorie","CATEGORIE",true); // on traite le block CATEGORIE
       }
$t->parse("MyOutput","tableau",true); // on traite le reste de la page
$t->p("MyOutput"); // on affiche la page
?>

Si vous avez lu les tutoriaux précédents, il n’y a rien de nouveau pour vous. On appelle le fichier, on déclare le block, on affecte les valeur aux zones et on affiche le tout. Il y a une seule variante, mais il ne faut absolument pas l’oublier :

$t->set_var("item",""); // ligne à ne pas oublier sous peine de surprise !!!

Elle tient au fait que vous avez 2 boucles imbriquées. Cette ligne affecte une valeur nulle au block ITEM. Ce nettoyage permet de vider la valeur, qui sans cette ligne suivrait dans la boucle suivante. Pour faire un test, essayez d’enlever cette ligne. Pour la première catégorie cela ne change rien, mais dans la deuxième, vous obtenez les liens de la deuxième catégorie mais aussi ceux de la première qui ont suivis. Si vous aviez 3 catégories, la troisième afficherait les liens de la première, de la deuxième et bien sûr ceux de la troisième. Alors imaginez le résultat si vous programmez un annuaire de 20 ou 30 catégories avec quelques sous-catégories !!

Conclusion

Si vous pouvez vous passer des blocks imbriqués, la technique utilisée pour vider le contenu du block vous sera certainement très utile. Elle fonctionne aussi de la même manière si vous utlisez plusieurs fichiers template plutôt que des blocks.
Je connais certains développeurs qui ont passé leur week-end sur ce problème, surtout que la documentation de la Phplib ne mentionne pas du tout cette astuce.

Je crois que vous en savez maintenant assez pour développer votre site avec les templates !

Télécharger les sources du tutorial

No tag for this post.

Billets sur le même sujet

{ 5 comments… read them below or add one }

1

6529jj 02.17.06 at 18:02

Franchement, merci, celà faisait longtemps que je cherchais pour les blocks imbriqués… :-)

2

Jonas 06.21.06 at 13:15

Salut,

merci j’ai pas fini de lire, ca m’a l’air plutôt bien expliquer :) .

Bonne continuation.

Jonas.

3

Yann 02.09.07 at 16:17

4

LAM Frédéric 07.21.08 at 12:09

Super tutorial !
Maintenant, pour la commande $t->set_var(”item”,”");
il y en a une encore plus propre et qui existe rien que pour ça :

$t->clear_var(”item”);

5

Dimou 07.30.08 at 16:54

Vraiment sympa comme tutorial.
Seul regret les deux p**** de colonnes sur la droite qui recouvre la moitié du texte….
Cordialement

Leave a Comment

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Older post: Templates : les blocks

Newer post: Templates : configurer Dreamweaver MX