J’avais besoin, pour mettre en valeur le dernier billet publié ici de différencier à l’aide des balises template de Dotclear, sur la page d’accueil, le premier billet de la boucle. Bien évidemment j’ai aussitôt pensé à la balise <tpl:LoopPosition>
qui permet de différencier le traitement en fonction de l’état actuel de parcours de la boucle — c’est à dire si le billet en cours de traitement est le premier, le deuxième, …, ou le dernier — et tout aussi naturellement j’ai voulu utiliser le jeu de balises <tpl:Pagination>
et <tpl:PaginationIf>
pour déterminer si il s’agit de la première page ou d’une autre.
J’ai alors codé quelque chose comme ceci dans le fichier home.html
:
<tpl:Entries> <tpl:LoopPosition start="1" length="1"> <!-- # Traitement du premier billet --> <tpl:Pagination> <tpl:PaginationIf start="1"> <!-- # Première page --> <!-- # Affichage de l'extrait s'il existe suivi du contenu --> </tpl:PaginationIf> <tpl:PaginationIf start="0"> <!-- # Page 2 et suivante (pas la première page) --> <!-- # Affichage de 200 premiers caractères de l'extrait ou du contenu si pas d'extrait --> </tpl:PaginationIf> </tpl:Pagination> </tpl:LoopPosition> <tpl:LoopPosition start="2"> <!-- # Traitement des autres billets --> <!-- # Affichage de 200 premiers caractères de l'extrait ou du contenu si pas d'extrait --> </tpl:LoopPosition> </tpl:Entries>
C’est fonctionnel, ça répond à mon “cahier des charges”, mais il n’est pas sans défaut, car la balise <tpl:Pagination>
ne sera active que s’il y a au moins deux pages à afficher, ce qui peut ne pas être le cas dans certains contextes (cas d’un blog tout jeune par exemple). Il faudrait pour cela ajouter l’attribut no_context="1"
à la balise pour être certain qu’il fonctionne. Ceci dit il y a plus simple à écrire, pourvu qu’on connaisse un peu le jeu de balise à notre disposition. Voilà le code final que j’utilise, qui a l’avantage de fonctionner quelque soit le nombre de pages final :
<tpl:Entries> <tpl:EntryIf first="1"> <!-- # Traitement du premier billet --> <tpl:SysIf current_mode="default"> <!-- # Première page --> <!-- # Affichage de l'extrait s'il existe suivi du contenu --> </tpl:SysIf> <tpl:SysIf current_mode="!default"> <!-- # Page 2 et suivante (pas la première page) --> <!-- # Affichage de 200 premiers caractères de l'extrait ou du contenu si pas d'extrait --> </tpl:SysIf> </tpl:EntryIf> <tpl:EntryIf first="0"> <!-- # Traitement des autres billets --> <!-- # Affichage de 200 premiers caractères de l'extrait ou du contenu si pas d'extrait --> </tpl:EntryIf> </tpl:Entries>
La balise <tpl:SysIf current_mode="default">
permet de tester si l’on est sur la première page de la page d’accueil où seul ce mode default est positionné. En effet sur les pages suivantes, c’est le mode default-page qui est alors positionné.
Conclusion il ne faut pas hésiter à fouiller un peu la documentation disponible sur les balises et leurs usages avant de s’attaquer à la résolution d’un problème ;-)
1 De Franck -
Note aux lecteurs :
N’hésitez-pas à me communiquer toutes les remarques que vous auriez, entre autre pour clarifier les explications si elles vous semblent insuffisantes ou mal détaillées.
2 De Groumphy -
Le grand retour de Franck ! Et en beauté s’il vous plait !
(non Franck, je n’ai toujours pas DC et je n’ai toujours pas testé :( )
3 De Koala -
Bonjour, pour info, j’ai cherché à obtenir la position dans la boucle pour compléter un identifiant css. Après de longues recherches, j’ai trouvé dans les sources la propriété LoopIndex qui va avec LoopPosition, mais je n’ai pas réussi à la faire marcher dans mon thème en utilisant la balise
.Pour réussir à faire marcher cette fonction j’ai finalement du modifier dans le source class.dc.template.php la ligne suivante [536] pour ajouter l’instruction echo :
4 De Franck -
Effectivement Koala, c’est une erreur dans le code. Ça sera corrigé dans la prochaine version de Dotclear, merci pour le signalement et le bugfix !