Je continue la suite du petit exercice commencé dans ce billet. Pour rappel voilà son énoncé :
J'ai prévu d'afficher un bloc particulier sur la page d'accueil. Ce bloc contiendra le dernier billet publié d'une catégorie précise ou à défaut, un texte fixe. Cette catégorie s'appellera Flash et ne servira qu'à gérer ce genre de petits messages et par conséquent ses billets ne devront pas apparaitre dans le flux normal.
Nous avons vu comment exclure une catégorie du flux normal des billets, la catégorie Flash. Voyons maintenant comment traiter le bloc qui doit être affiché sur la première page. J'ai choisi de mettre tout ce qui sera utilisé pour ce bloc dans un fichier particulier, nommé _intro.html
, et qui est inclus juste après la balise <div id="wrapper">
du fichier home.html
[1]. Voilà la portion de code du fichier home.html
(j'ai mis l'emphase sur ce que j'ai rajouté) :
<div id="wrapper"> <!-- # Franck Paul : ajout du bloc d'intro --> {{tpl:include src="_intro.html"}}
Ce sera la dernière modification du fichier home.html
, et vous aurez certainement remarqué au passage le signe #
utilisé dans le commentaire pour qu'il ne soit pas inclus dans le code HTML généré par DotClear 2.
Voyons maintenant le contenu du fichier _intro.html
. Première chose à faire, encadrer tout le bloc dans une balise <div>
afin de pouvoir lui appliquer des styles particuliers :
<div id="introcontent"> … (contenu du bloc) … </div>
Passons maintenant au contenu du bloc. Celui-ci, billet ou texte fixe, doit être affiché uniquement sur la première page. Pour le déterminer, il faut utiliser le code suivant :
<tpl:Entries category="!Flash" no_content="1"> <tpl:Pagination> <tpl:PaginationIf start="1"> … (affichage du dernier billet Flash ou d'un texte fixe) … </tpl:PaginationIf> </tpl:Pagination> </tpl:Entries>
Normalement vous devez avoir reconnu la première ligne, <tpl:Entries category="!Flash" no_content="1">
, qui permet de retrouver la liste des billets ne faisant pas partie de la catégorie Flash. On utilise l'attribut no_content="1"
car nous n'avons pas besoin du contenu des billets. Vous reconnaitrez sans difficulté la balise qui ferme le bloc à la fin : </tpl:Entries>
.
À l'intérieur de ce bloc, qui définit une sorte de contexte où nous avons à notre disposition la liste des billets, nous pouvons utiliser un bloc spécifique à la pagination, <tpl:Pagination>
et </tpl:Pagination>
, qui permettra ensuite de tester la page courante à l'aide, encore une fois d'un bloc de test, <tpl:PaginationIf start="1">
et </tpl:PaginationIf>
. L'attribut start="1"
permet de tester si on est sur la première page[2].
Pour résumer, on définit le contexte servant à déterminer le nombre de page (nombre de billets retrouvés divisé par le nombre de billets par page précisé dans les préférences du blog) et on vérifie que la page courante est la première.
Une fois ce test effectué, nous allons récupérer, s'il existe, le dernier billet publié de la catégorie Flash. Le bloc nécessaire pour obtenir celui-ci est le suivant :
<tpl:Entries category="Flash" lastn="1"> … </tpl:Entries>
Ici on ne retient que la catégorie Flash (attribut category="Flash"
) et uniquement le dernier publié (attribut lastn="1"
[3]).
Intégrons maintenant ce code dans le code précédent (test de la première page). Cela donne cela :
<tpl:Entries category="!Flash" no_content="1"> <tpl:Pagination> <tpl:PaginationIf start="1"> <tpl:Entries category="Flash" lastn="1"> … </tpl:Entries> </tpl:PaginationIf> </tpl:Pagination> </tpl:Entries>
Allo ? Houston ? On a un problème !
En effet il s'avère qu'on ne peut imbriquer des blocs template de même nature[4] (<tpl:Entries>
en ce qui nous concerne) ! Comment contourner ce soucis ? Et bien en développant nos propres balises (ou fonctions) template qui serviront à stocker le résultat des tests que nous effectuons (première page, présence d'au moins un billet publié dans la catégorie Flash).
Rendez-vous au prochain billet pour la suite des templateurs fous \o/
Notes
[1] Je rappelle que ce bloc ne doit être affiché que sur la page d'accueil. On pourra si nécessaire ré-utiliser ce fichier _intro.html
dans d'autres contextes si nécessaire.
[2] On peut également savoir si on est sur une autre page que la première en utilisant l'attribut start="0"
. De même, on peut utiliser l'attribut end="1"
pour déterminer si l'on est sur la dernière page, ou end="0"
pour les autres pages.
[3] Si vous voulez les trois derniers billets, il vous suffit d'utiliser l'attribut lastn="3"
.
1 De kny -
bonjour,
j'ai cru comprendre sur l'un des billets précédents que vous faites parti de l'équipe de développement.
J'aurai aimé savoir ou se trouvait les définitions des différents templates pour pouvoir les modifier.
Merci
2 De Franck -
J'ai donné toutes ces infos dans ce commentaire, ceci dit, je ne pense pas que modifier directement le source de DotClear 2 soit une bonne idée.
3 De mirovinben -
"modifier le source" ?! en effet, surement pas une bonne idée. A moins que...
...l'on puisse écraser des templates déjà existants via un fichier perso qui remplace le code "natif" par du code perso.
Je ne sais pas si c'est faisable, ni comment ni où mettre le fichier perso. Mais vu la modularité de DC2 et l'utilisation de programmation "objet", je suppose que c'est possible.
Mais ceci est une autre histoire, un peu hors sujet pour l'instant...
4 De Franck -
Oui un peu hors sujet la surcharge des méthodes fournies par DotClear. Je vais me limiter à mes propres fonctions template dans le prochain billet.
5 De Pep -
C'est faisable et les fichiers _public.php (de thèmes ou de plugins) sont de bons candidats pour cela.
Néanmoins ça devrait venir en dernier recours, puisque - dans certains cas - d'autres mécanismes sont disponibles pour modifier le comportement des marqueurs existants, et s'avéreront suffisants.
Mais, oui, à défaut d'être hors-sujet, on a déjà sauté des étapes.
6 De Pep -
Arf. Grillé par le tenancier des lieux. :-)
7 De mirovinben -
j'avais le mot sur le bout de la langue : "surcharge"... mais l'est resté en route et je n'ai trouvé que "écraser".
"Grillé" ? il n'y pas que l'intervention de Pep qui le soit... mes neurones le sont aussi, grillés.
Grillé, surcharge... m'en vais disjoncter ailleurs.
Mais j'attends la suite avec impatience et délectation. ;) :)
8 De rumeurs -
"premiere page, presece d'au moins un billet publie dans laa categorie flash", commentn ça ? ;)
9 De Franck -
Je n'ai pas bien compris la question ! Vous pouvez reformuler ?