Blocs imbriqués

Temphplate permet bien évidemment l'imbrication des blocs. Chaque command {end:block} ferme le dernier bloc ouvert.

{block:premierbloc}
    contenu du premier bloc
    {block:secondbloc}
        contenu du second bloc
    {end:block}
    suite du contenu du premier bloc
{end:block}

Exemple

Dans cet exemple, on va définir une liste d'élèves. Chaque élève a un nom, un prénom, et une liste de notes. Il est alors intéressant d'imbriquer des blocs: le bloc principal dénombrera les élèves, le bloc imbriqué dénombrera les notes.

Méthode 1: Assignation directe

Dans cette méthode on crée un tableau (Array) ayant une structure identique à celle de notre template. Un simple appel à la méthode set('nom du bloc', $tableau) aura alors pour effet de faire les répétitions correspondantes.

NomPrénomNotes
Bidulon Jacques
  • français: 10/20
  • maths: 10/20
  • anglais: 10/20
Machin Pierre
  • français: 18/20
  • latin: 20/20
  • philo: 17/20
  • maths: 2/20
Truc Paul
  • biologie: 16/20
  • sexologie: 12/20
  • histoire: 0/20
Lalune Pierrot
  • glandouille: 20/20

Méthode 2: Assignations relatives

La méthode 1 pouvant se révéler rapidement lourde quand on a des imbrications plus profondes, il y a d'autres moyens de répéter des blocs imbriqués. En particulier, un appel à set('bloc1/bloc2/var', 'valeur') a pour effet d'affecter 'valeur' à la variable var, se trouvant dans le bloc bloc2, lui-même inclus dans le bloc bloc1. Un seconde appel à set('bloc1/bloc2/var', 'autre valeur') aura pour effet de répéter le bloc2 bloc2: on a maintenant dans bloc1, 2 blocs ayant chacune une variable var différente.

Le fonctionnement général de set quand on lui passe un chemin vers une variable est le suivant:

set peut également prendre un 3e paramètre booléen (TRUE ou FALSE). Si vous passez ce paramètre à TRUE, alors après l'affectation, on forcera Temphplate a créer un nouveau bloc en dernière position.

Le modèle:
{block:bloc1}
    {var1}
    {block:bloc2}
        {var2}
    {end:block}
{end:block}

Appel: $tpl->set('bloc1/bloc2/var2', 'coucou');
Résultat intermédiaire:
bloc1:
    - bloc2:
        - var2 = 'coucou'

Appel: $tpl->set('bloc1/var1', 'salut');
Résultat intermédiaire:
bloc1:
    - var1 = 'salut'
    - bloc2:
        - var2 = 'coucou'

On veut maintenant doublé le bloc "bloc1", pour afficher "hello" en var1, et "hi" en var2, on essaie ceci:

Appel: $tpl->set('bloc1/bloc2/var2', 'hi');
Résultat intermédiaire:
bloc1:
    - var1 = 'salut'
    - bloc2:
        - var2 = 'coucou'
        - var2 = 'hi'
Appel: $tpl->set('bloc1/var1', 'hi');
Résultat intermédiaire:
bloc1:
    - var1 = 'salut'
    - bloc2:
        - var2 = 'coucou'
        - var2 = 'hi'
bloc1:
    - var1 = 'hello'
    - bloc2:

Ce n'est pas du tout ce qu'on attendait !

Il fallait d'abord effectuer $tpl->set('bloc1/var1', 'hi'), ce qui a pour effet d'ouvrir un nouveau bloc1. Ensuite les appels affectant 'bloc1/bloc2/var2' affecteront bien le dernier bloc ouvert. Il faudrait donc remplir normalement le premier bloc (les occurences de bloc1/bloc2/var2, puis bloc1/var1), puis pour toutes les occurences suivantes, l'inverse (d'abord bloc1/var1 puis les occurences de bloc1/bloc2/var2). Cela fonctionne, mais c'est assez difficile à mettre en place.

Il est plus simple de dire "j'en ai terminé pour cette occurence de ce bloc, je veux maintenant en entamer une autre". Ceci est fait avec le 3e paramètre de set.

$tpl->set('bloc1/bloc2/var2', 'un');
$tpl->set('bloc1/bloc2/var2', 'deux');
$tpl->set('bloc1/var1', 'nombres', TRUE);

$tpl->set('bloc1/bloc2/var2', 'uno');
$tpl->set('bloc1/bloc2/var2', 'due');
$tpl->set('bloc1/var1', 'numeri', TRUE);

$tpl->set('bloc1/bloc2/var2', 'one');
$tpl->set('bloc1/bloc2/var2', 'two');
$tpl->set('bloc1/var1', 'nombres', TRUE);

// On a créé une occurence vide de trop avec le dernier paramètre à TRUE
$tpl->deleteLast('bloc1');

Il est important de ne pas mettre TRUE pour le dernier bloc, ou de suivre par un appel à deleteLast avec le nom du bloc. Sinon une occurence supplémentaire vide sera créée.

NomPrénomNotes
Bidulon Jacques
  • français: 10/20
  • maths: 10/20
  • anglais: 10/20
Machin Pierre
  • français: 18/20
  • latin: 20/20
  • philo: 17/20
  • maths: 2/20
Truc Paul
  • biologie: 16/20
  • sexologie: 12/20
  • histoire: 0/20
Lalune Pierrot
  • glandouille: 20/20

Méthode 3: Assignations groupées

Il s'agit d'une méthode complètement similaire à la méthode 2, mais on utilise la méthode setBlock qui permet d'assigner en un appel toutes les variables d'un bloc. Cette méthode fonctionne comme un set appliqué aux blocs:

NomPrénomNotes
Bidulon Jacques
  • français: 10/20
  • maths: 10/20
  • anglais: 10/20
Machin Pierre
  • français: 18/20
  • latin: 20/20
  • philo: 17/20
  • maths: 2/20
Truc Paul
  • biologie: 16/20
  • sexologie: 12/20
  • histoire: 0/20
Lalune Pierrot
  • glandouille: 20/20


Generation time: 298.195ms