Open Time - Série - Dotclear 2 et les templates<p>Open time, open mind, open eyes</p>2024-03-29T05:53:19+01:00Franck Paulurn:md5:61070eb8c883ae7581f861faefddecbfDotclearDotClear 2 et les templates (9)urn:md5:9042ffc628ebeacb3af256b6486a316c2007-07-13T11:02:59+00:002007-07-13T11:27:35+00:00FranckDotcleardotclearpratiquethème <p>Continuons (et terminons) notre exercice pratique dont je rappelle l'énoncé :</p>
<blockquote><p>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 <em>Flash</em> et ne servira qu'à gérer ce genre de petits messages et par conséquent ses billets ne devront pas apparaitre dans le <em>flux</em> normal<sup>[<a href="https://open-time.net/post/2007/07/13/1088-dotclear-2-et-les-templates-9#pnote-1088-1" id="rev-pnote-1088-1">1</a>]</sup>.</p></blockquote>
<p>Nous savons maintenant comment déterminer correctement si nous nous trouvons sur la première page (page d'accueil), il s'agit maintenant de faire en sorte d'afficher le dernier billet publié de la catégorie <em>Flash</em>, ou, s'il n'en existe aucun, d'afficher un texte fixe.</p>
<p>Voilà le code utilisé :</p>
<pre><tpl:FlagFirstPageIf true="1">
<strong>{{tpl:FlagFlashPost}}</strong>
<!-- # Last published post from Flash category (if exists) -->
<tpl:Entries category="Flash" lastn="1">
<h2 class="intro" id="p{{tpl:EntryID}}">
<strong>{{tpl:EntryTitle encode_html="1"}}</strong></h2>
<tpl:EntryIf extended="1"><span>{{tpl:EntryExcerpt}}</span></tpl:EntryIf>
<div class="post-content">{{tpl:EntryContent}}</div>
<strong>{{tpl:FlagFlashPost true="1"}}</strong>
</tpl:Entries>
<strong><tpl:FlagFlashPostIf true="0"></strong>
<!-- # Standard text if there is no published post from Flash category -->
<h2 class="intro"><strong>{{tpl:BlogDescription}}</strong></h2>
<div class="post-content">
<p>Ze best blog on ze best world of ze universe.</p>
</div>
<strong></tpl:FlagFlashPostIf></strong>
</tpl:FlagFirstPageIf></pre>
<p>J'ai mis l'emphase sur l'utilisation de deux nouvelles balises (<code>{{tpl:FlagFlashPost}}</code> et <code><tpl:FlagFlashPostIf></code>) qui sont exactement les mêmes que celles décrites dans les deux billets précédents à ceci près qu'elles utilisent une autre variable dans le code PHP.</p>
<p>Ces nouvelles balises me servent à positionner un <em>drapeau</em> (variable à <em>true</em> ou à <em>false</em>) en fonction de la présence ou pas d'un billet publié dans la catégorie <em>Flash</em>, et de tester la valeur de ce <em>drapeau</em> ce qui me permet, plus bas, d'afficher le texte standard si nécessaire.</p>
<p>Il n'y a absolument rien de nouveau ici, uniquement l'utilisation de techniques déjà expliquées précédemment ou reprises dans les fichiers standards du thème defaut. Rien de plus à mettre en place pour terminer notre exercice, on peut sauvegarder le fichier <code>_intro.html</code> et vérifier que tout fonctionne comme attendu.</p>
<p>Voilà qui conclut cette série de billets sur les <em>templates</em> de Dotclear 2. J'espère que cela aura permis d'éclairer quelques zones d'ombres dans ce système qui peut — qui doit même pour certains — paraitre bien compliqué au premier abord. Je parle en connaissance de cause, je suis passé par cette phase ;-)</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/07/13/1088-dotclear-2-et-les-templates-9#rev-pnote-1088-1" id="pnote-1088-1">1</a>] Par contre j'ai choisi de laisser l'accès à tous ces billets particuliers dans la liste des catégories ou dans les archives.</p></div>
https://open-time.net/post/2007/07/13/1088-dotclear-2-et-les-templates-9#comment-formhttps://open-time.net/feed/atom/comments/3122DotClear 2 et les templates (8)urn:md5:f25b34217c9eca5f97ffb55261d3a9f52007-07-06T07:17:05+00:002007-09-20T01:15:11+00:00FranckDotcleardotclearpratiquethème <p>Si vous voulez plus d'information sur ce fichier <code>_public.php</code> qui accompagne parfois les thèmes, alors continuez la lecture de ce billet, sinon rendez-vous au prochain pour la suite de l'exercice.</p>
<p>Voilà, pour l'instant, à quoi ressemble notre <code>_public.php</code> :</p>
<pre><?php
class dcFallSeason
{
static public function FlagFirstPage($attr)
{
if (isset($attr['true'])) {
$flag = 'true';
} else {
$flag = 'false';
}
return '<?php $dcFallSeasonFlagFirstPage = '.$flag.'; ?>';
}
static public function FlagFirstPageIf($attr,$content)
{
$if = '';
if (isset($attr['true'])) {
$sign = (boolean) $attr['true'] ? '' : '!';
$if = $sign.'$dcFallSeasonFlagFirstPage';
}
if ($if != '') {
return '<?php if('.$if.') : ?>'.$content.'<?php endif; ?>';
} else {
return $content;
}
}
}
// Add Flag management to the template scheme
$core->tpl->addValue('FlagFirstPage',
array('dcFallSeason','FlagFirstPage'));
$core->tpl->addBlock('FlagFirstPageIf',
array('dcFallSeason','FlagFirstPageIf'));
?></pre>
<p>Détaillons-le un peu. Première et dernière lignes classique dans un fichier PHP, <code><?php</code> et <code>?></code>. À l'intérieur de ceci nous y trouvons deux parties. La première définit une classe <code>dcFallSeason</code>, un nom qui reprend le nom du thème précédé de <code>dc</code>. Cette classe sert à définir les fonctions de traitement des nouvelles balises qui seront utilisées au sein du thème. La deuxième partie permet de déclarer à DotClear 2 les nouvelles balises <em>template</em> et les fonctions de traitement qui en dépendent.</p>
<p>Le plus simple d'abord, la déclaration des nouvelles balises. Je rappelle qu'il y en a deux, une de type simple <code>{{tpl:FlagFirstPage}}</code> et une de type bloc <code><tpl:FlagFirstPageIf></code>, respectivement déclarées de la manière suivante :</p>
<pre>$core->tpl->addValue('FlagFirstPage',
array('dcFallSeason','FlagFirstPage'));
$core->tpl->addBlock('FlagFirstPageIf',
array('dcFallSeason','FlagFirstPageIf'));</pre>
<p>Le premier paramètre définit le nom utilisé dans la balise — ce qui suit le <code><tpl:</code>, le deuxième, sous forme de tableau (<em>array</em>), définit le nom de la classe (<code>dcFallSeason</code> dans notre cas) et le nom de la fonction associée. <code>addValue()</code> est utilisée pour une balise simple, <code>addBlock()</code> pour une balise de type bloc. De cette manière, lorsque DotClear 2 rencontrera une de nos balises dans un fichier du thème, il saura quelle est la fonction de traitement qui doit être utilisée.</p>
<p>Voyons maintenant les fonctions de traitement. La première, <code>FlagFirstPage()</code> reçoit un paramètre, sous forme de tableau, contenant les attributs éventuels et leurs valeurs utilisés dans la balise. La deuxième, <code>FlagFirstPageIf()</code> reçoit en plus un paramètre contenant le contenu de ce qui est encadré par la balise (de type bloc). Les deux fonctions doivent retourner le code PHP (ou HTML) correspondant à la balise.</p>
<p>Je vais détailler le code de la première, la seconde devrait être comprise assez facilement. Voilà le code :</p>
<pre>1. static public function FlagFirstPage($attr)
2. {
3. if (isset($attr['true'])) {
4. $flag = 'true';
5. } else {
6. $flag = 'false';
7. }
8. return '<?php $dcFallSeasonFlagFirstPage = '.$flag.'; ?>';
9. }</pre>
<p>Ligne 1, il s'agit de la déclaration de la fonction et des paramètres attendus (un seul dans ce cas). Les lignes 2 et 9 délimitent le code de la fonction. Ligne 3, je contrôle qu'un attribut intitulé <code>true</code> a ou n'a pas été spécifié dans la balise (ex <code>{{tpl:FlagFirstPage}}</code> ou <code><tpl:FlagFirstPage true="1"></code>). Ligne 4, interprétée si l'attribut a été utilisé, permet de positionner la valeur <code>'true'</code> à une variable texte (<code>$flag</code>). La ligne 6, interprétée dans le cas contraire, permet de positionner la valeur <code>'false'</code> à cette même variable. La ligne 8, enfin, retourne le texte par lequel sera remplacée la balise.</p>
<p>Exemple :</p>
<p>Si j'utilise la balise <code>{{tpl:FlagFirstPage}}</code>, la fonction va alors retourner ceci <code><?php $dcFallSeasonFlagFirstPage = false; ?></code>, ce qui revient à déclarer et à initialiser une variable avec la valeur <em>false</em> (faux).</p>
<p>Si j'utilise la balise <code>{{tpl:FlagFirstPage true="1"}}</code>, la fonction va retourner cela <code><?php $dcFallSeasonFlagFirstPage = true; ?></code>, ce qui revient à déclarer et à initialiser une variable avec la valeur <em>true</em> (vrai).</p>
<p>Cette variable, <code>$dcFallSeasonFlagFirstPage</code>, positionnée à <em>true</em> ou <em>false</em>, sera ensuite testée avec la balise <code><tpl:FlagFirstPageIf></code> dans le thème, permettant de conditionner l'apparition d'un bloc en fonction du résultat, l'affichage du bloc d'intro dans notre cas.</p>
<p>Vous devriez maintenant comprendre un peu mieux comment s'opère la phase de traitement des balises <em>template</em> de DotClear 2.</p>
<p>À suivre …</p>https://open-time.net/post/2007/07/06/1082-dotclear-2-et-les-templates-8#comment-formhttps://open-time.net/feed/atom/comments/3119DotClear 2 et les templates - indexurn:md5:646302c57a70903b4290a1d908f183de2007-06-29T10:39:00+00:002023-01-19T12:35:22+00:00FranckDotclearblogdotclearpratiquethème <p>Un petit index des billets publiés sur ce sujet pour s’y retrouver plus facilement dans l’avenir :</p>
<ul>
<li><a href="https://open-time.net/post/2007/05/15/1018-dotclear-2-et-les-templates" hreflang="fr" title="DotClear 2 et les templates">Chapitre 1</a>, le traitement par DotClear 2 des <em>templates</em> présents dans les thèmes en comparaison avec DotClear 1</li>
<li><a href="https://open-time.net/post/2007/05/16/1019-dotclear-2-et-les-templates-2" hreflang="fr" title="Dotclear 2 et les templates (2)">Chapitre 2</a>, les commentaires <em>invisibles</em> et le PHP dans les thèmes</li>
<li><a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3" hreflang="fr" title="DotClear 2 et les templates (3)">Chapitre 3</a>, les deux formes de balises <em>template</em> disponibles (simple et bloc)</li>
<li><a href="https://open-time.net/post/2007/05/29/1036-dotclear-2-et-les-templates-4" hreflang="fr" title="DotClear 2 et les templates (4)">Chapitre 4</a>, l’imbrication des balises de même nom n’est pas possible</li>
<li><a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5" hreflang="fr" title="DotClear 2 et les templates (5)">Chapitre 5</a>, exercice pratique, exclure une catégorie d’une liste de billets (utiliser les attributs des balises)</li>
<li><a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6" hreflang="fr" title="DotClear 2 et les templates (6)">Chapitre 6</a>, exercice pratique (suite), se limiter à la première page pour afficher un bloc d’introduction</li>
<li><a href="https://open-time.net/post/2007/06/28/1071-dotclear-2-et-les-templates-7" hreflang="fr" title="DotClear 2 et les templates (7)">Chapitre 7</a>, exercice pratique (suite), développer ses propres balises pour éviter les imbrications</li>
<li><a href="https://open-time.net/post/2007/07/06/1082-dotclear-2-et-les-templates-8" hreflang="fr" title="DotClear 2 et les templates (8)">Chapitre 8</a>, le code utilisé pour développer les balises, le fichier _public.php</li>
<li><a href="https://open-time.net/post/2007/07/13/1088-dotclear-2-et-les-templates-9" hreflang="fr" title="DotClear 2 et les templates (9)">Chapitre 9</a>, fin de l’exercice, afficher un billet ou un texte fixe</li>
</ul>
<p>Je mettrais à jour cet index au fur et à mesure des publications et il est disponible dans la liste des billets ”À retenir”.</p>https://open-time.net/post/2007/06/29/1074-dotclear-2-et-les-templates-index#comment-formhttps://open-time.net/feed/atom/comments/3115DotClear 2 et les templates (7)urn:md5:7c80940ff18e029eeb8d6aadea0467662007-06-28T07:33:00+00:002023-01-21T14:56:25+00:00FranckDotclearblogdotclearpratiquethème <p>Nous avons un petit problème à résoudre (voir <a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6" hreflang="fr" title="DotClear 2 et les templates (6)">ce billet</a> pour en retrouver l’énoncé). DotClear 2 inclut la possibilité de définir ses propres balises <em>template</em> au niveau du thème<sup>[<a href="https://open-time.net/post/2007/06/28/1071-dotclear-2-et-les-templates-7#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>. Pour cela, il faut créer un fichier <code>_public.php</code> qui contiendra tout le code PHP nécessaire au traitement de ces balises.</p>
<p>Revenons à notre problème. Nous avons besoin d’éviter l’imbrication de deux balises <code><tpl:Entries></code> (lignes 1 et 4) :</p>
<pre>1. <strong><tpl:Entries category="!Flash" no_content="1"></strong>
2. <tpl:Pagination>
3. <tpl:PaginationIf start="1">
4. <strong><tpl:Entries category="Flash" lastn="1"></strong>
5. …
6. </tpl:Entries>
7. </tpl:PaginationIf>
8. </tpl:Pagination>
9. </tpl:Entries></pre>
<p>L’idée que j’ai retenue est de faire en sorte de positionner une variable si l’on est sur la première page, juste après la ligne 3, puis de tester cette même variable une fois sorti du bloc <em>template</em> <code><tpl:Entries></code> (ligne 9). Voilà le nouveau code (j’ai mis l’emphase sur ce qui est nouveau) :</p>
<pre><strong>{{tpl:FlagFirstPage}}</strong>
<tpl:Entries category="!Flash" no_content="1">
<tpl:Pagination>
<tpl:PaginationIf start="1">
<strong>{{tpl:FlagFirstPage true="1"}}</strong>
</tpl:PaginationIf>
</tpl:Pagination>
</tpl:Entries>
<strong><tpl:FlagFirstPageIf true="1"></strong>
<tpl:Entries category="Flash" lastn="1">
…
</tpl:Entries>
<strong></tpl:FlagFirstPageIf></strong></pre>
<p>Deux nouvelles balises doivent être développées. La première, <code>{{tpl:FlagFirstPage}}</code>, sert à positionner la variable dont je ai parlé précédemment. Si la balise est utilisée sans aucun paramètre, la variable sera initialisée à <em>false</em> (faux). Si la balise contient un attribut <code>true="1"</code> alors la variable sera initialisée à <em>true</em> (vrai). La deuxième, sous forme de bloc de test (<code><tpl:FlagFirstPageIf></code> … <code></tpl:FlagFirstPageIf></code>) sert à tester la valeur de la variable ce qui permettra de réutiliser une balise <code><tpl:Entries></code> pour récupérer le dernier billet de la catégorie <em>Flash</em><sup>[<a href="https://open-time.net/post/2007/06/28/1071-dotclear-2-et-les-templates-7#wiki-footnote-2" id="rev-wiki-footnote-2">2</a>]</sup>.</p>
<p>Voyons maintenant à quoi ressemble ce fichier <code>_public.php</code> qui contiendra tout le code nécessaire.</p>
<pre><?php
class dcFallSeason
{
static public function FlagFirstPage($attr)
{
if (isset($attr['true'])) {
$flag = 'true';
} else {
$flag = 'false';
}
return '<?php $dcFallSeasonFlagFirstPage = '.$flag.'; ?>';
}
static public function FlagFirstPageIf($attr,$content)
{
$if = '';
if (isset($attr['true'])) {
$sign = (boolean) $attr['true'] ? '' : '!';
$if = $sign.'$dcFallSeasonFlagFirstPage';
}
if ($if != '') {
return '<?php if('.$if.') : ?>'.$content.'<?php endif; ?>';
} else {
return $content;
}
}
}
// Add Flag management to the template scheme
$core->tpl->addValue('FlagFirstPage',
array('dcFallSeason','FlagFirstPage'));
$core->tpl->addBlock('FlagFirstPageIf',
array('dcFallSeason','FlagFirstPageIf'));
?></pre>
<p>Que fait tout ce code ? La première fonction, <code>FlagFirstPage</code>, est utilisée lors du remplacement de la balise <code>{{tpl:FlagFirstPage}}</code> et donnera le code PHP suivant :</p>
<pre><?php $dcFallSeasonFlagFirstPage = false; ?></pre>
<p>ou</p>
<pre><?php $dcFallSeasonFlagFirstPage = true; ?></pre>
<p>si on utilise l’attribut <code>true="1"</code> dans la balise. La deuxième fonction, <code>FlagFirstPageIf</code>, est utilisée lors du remplacement de la balise <code><tpl:FlagFirstPageIf></code> … <code></tpl:FlagFirstPageIf></code> et donnera le code suivant (si on l’utilise tel que je l’ai fait plus haut) :</p>
<pre><?php if($dcFallSeasonFlagFirstPage) : ?>
…
<?php endif; ?></pre>
<p>Je vais arrêter là pour la description du code PHP du fichier <code>_public.php</code> à moins que vous vouliez que je détaille tout ce qui s’y trouve, à vous de choisir. En fonction de vos réponses je continuerai la dessus, sinon — ou si je n’ai pas de réponse — je continuerai l’exercice prévu.</p>
<p>À suivre …</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/06/28/1071-dotclear-2-et-les-templates-7#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Il est également possible d’en définir avec un plugin mais ça dépasse le cadre de ce tutoriel.</p>
<p>[<a href="https://open-time.net/post/2007/06/28/1071-dotclear-2-et-les-templates-7#rev-wiki-footnote-2" id="wiki-footnote-2">2</a>] Vous aurez surement remarqué que ce bloc a été déplacé plus bas et en dehors du premier bloc de même nature.</p></div>
https://open-time.net/post/2007/06/28/1071-dotclear-2-et-les-templates-7#comment-formhttps://open-time.net/feed/atom/comments/3113DotClear 2 et les templates (6)urn:md5:c1fc1657e9cc059a2503c51fcb6bfe352007-06-22T00:13:50+00:002007-06-22T00:13:50+00:00FranckDotclearblogdotclearpratiquethème <p>Je continue la suite du petit exercice commencé dans <a href="https://open-time.net/2007/06/14/1062-dotclear-2-et-les-templates-5" hreflang="fr" title="DotClear 2 et les templates (5)">ce billet</a>. Pour rappel voilà son énoncé :</p>
<blockquote><p>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.</p></blockquote>
<p>Nous avons vu comment exclure une catégorie du flux normal des billets, la catégorie <em>Flash</em>. 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é <code>_intro.html</code>, et qui est inclus juste après la balise <code><div id="wrapper"></code> du fichier <code>home.html</code><sup>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#pnote-1068-1" id="rev-pnote-1068-1">1</a>]</sup>. Voilà la portion de code du fichier <code>home.html</code> (j'ai mis l'emphase sur ce que j'ai rajouté) :</p>
<pre><div id="wrapper">
<strong><!-- # Franck Paul : ajout du bloc d'intro --></strong>
<strong>{{tpl:include src="https://open-time.net/post/2007/06/22/_intro.html"}}</strong></pre>
<p>Ce sera la dernière modification du fichier <code>home.html</code>, et vous aurez certainement remarqué au passage le signe <code>#</code> utilisé dans le commentaire pour qu'il ne soit pas inclus dans le code HTML généré par DotClear 2.</p>
<p>Voyons maintenant le contenu du fichier <code>_intro.html</code>. Première chose à faire, encadrer tout le bloc dans une balise <code><div></code> afin de pouvoir lui appliquer des styles particuliers :</p>
<pre><div id="introcontent">
…
<em>(contenu du bloc)</em>
…
</div></pre>
<p>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 :</p>
<pre><tpl:Entries category="!Flash" no_content="1">
<tpl:Pagination>
<tpl:PaginationIf start="1">
…
<em>(affichage du dernier billet Flash ou d'un texte fixe)</em>
…
</tpl:PaginationIf>
</tpl:Pagination>
</tpl:Entries></pre>
<p>Normalement vous devez avoir reconnu la première ligne, <code><tpl:Entries category="!Flash" no_content="1"></code>, qui permet de retrouver la liste des billets ne faisant pas partie de la catégorie <em>Flash</em>. On utilise l'attribut <code>no_content="1"</code> car nous n'avons pas besoin du contenu des billets. Vous reconnaitrez sans difficulté la balise qui ferme le bloc à la fin : <code></tpl:Entries></code>.</p>
<p>À 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, <code><tpl:Pagination></code> et <code></tpl:Pagination></code>, qui permettra ensuite de tester la page courante à l'aide, encore une fois d'un bloc de test, <code><tpl:PaginationIf start="1"></code> et <code></tpl:PaginationIf></code>. L'attribut <code>start="1"</code> permet de tester si on est sur la première page<sup>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#pnote-1068-2" id="rev-pnote-1068-2">2</a>]</sup>.</p>
<p>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.</p>
<p>Une fois ce test effectué, nous allons récupérer, s'il existe, le dernier billet publié de la catégorie <em>Flash</em>. Le bloc nécessaire pour obtenir celui-ci est le suivant :</p>
<pre><tpl:Entries category="Flash" lastn="1">
…
</tpl:Entries></pre>
<p>Ici on ne retient que la catégorie <em>Flash</em> (attribut <code>category="Flash"</code>) et uniquement le dernier publié (attribut <code>lastn="1"</code><sup>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#pnote-1068-3" id="rev-pnote-1068-3">3</a>]</sup>).</p>
<p>Intégrons maintenant ce code dans le code précédent (test de la première page). Cela donne cela :</p>
<pre><strong><tpl:Entries category="!Flash" no_content="1"></strong>
<tpl:Pagination>
<tpl:PaginationIf start="1">
<strong><tpl:Entries category="Flash" lastn="1"></strong>
…
<strong></tpl:Entries></strong>
</tpl:PaginationIf>
</tpl:Pagination>
<strong></tpl:Entries></strong></pre>
<p>Allo ? Houston ? On a un problème !</p>
<p>En effet il s'avère qu'on ne peut imbriquer des blocs <em>template</em> de même nature<sup>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#pnote-1068-4" id="rev-pnote-1068-4">4</a>]</sup> (<code><tpl:Entries></code> en ce qui nous concerne) ! Comment contourner ce soucis ? Et bien en développant nos propres balises (ou fonctions) <em>template</em> 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 <em>Flash</em>).</p>
<p>Rendez-vous au prochain billet pour la suite des <em>templateurs</em> fous \o/</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#rev-pnote-1068-1" id="pnote-1068-1">1</a>] Je rappelle que ce bloc ne doit être affiché que sur la page d'accueil. On pourra si nécessaire ré-utiliser ce fichier <code>_intro.html</code> dans d'autres contextes si nécessaire.</p>
<p>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#rev-pnote-1068-2" id="pnote-1068-2">2</a>] On peut également savoir si on est sur une autre page que la première en utilisant l'attribut <code>start="0"</code>. De même, on peut utiliser l'attribut <code>end="1"</code> pour déterminer si l'on est sur la dernière page, ou <code>end="0"</code> pour les autres pages.</p>
<p>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#rev-pnote-1068-3" id="pnote-1068-3">3</a>] Si vous voulez les trois derniers billets, il vous suffit d'utiliser l'attribut <code>lastn="3"</code>.</p>
<p>[<a href="https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#rev-pnote-1068-4" id="pnote-1068-4">4</a>] J'en avais détaillé la raison dans <a href="https://open-time.net/2007/05/29/1036-dotclear-2-et-les-templates-4" hreflang="fr" title="DotClear 2 et les templates (4)">ce billet</a>.</p></div>
https://open-time.net/post/2007/06/22/1068-dotclear-2-et-les-templates-6#comment-formhttps://open-time.net/feed/atom/comments/3112DotClear 2 et les templates (5)urn:md5:f04b45b0ea8d991b43ee1f8d10dfc8c52007-06-14T01:10:58+00:002007-06-14T02:24:25+00:00FranckDotclearblogdotclearpratiquethème <p>Maintenant que nous avons vu l'essentiel de ce qu'il faut savoir à propos des <em>templates</em> de DotClear 2 nous allons faire un petit exercice pratique. Nous y verrons comment personnaliser un peu notre thème et au passage comment développer quelques petites fonctions très basiques en <acronym title="PHP Hypertext Preprocessor">PHP</acronym>.</p>
<p>Prêts ? Alors voilà l'énoncé de l'exercice :</p>
<p>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 <em>Flash</em> et ne servira qu'à gérer ce genre de petits messages et par conséquent ses billets ne devront pas apparaitre dans le <em>flux</em> normal<sup>[<a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#pnote-1062-1" id="rev-pnote-1062-1">1</a>]</sup>.</p>
<p>Traduit en pseudo langage informatique cela donnera ceci :</p>
<pre>si premiere_page alors
si billet_flash existe alors
afficher billet_flash
sinon
afficher un texte fixe
fin_si
fin_si
afficher billets_non_flash</pre>
<p>Par où commencer ? Ce traitement doit s'appliquer uniquement sur la page d'accueil donc on fera les modifications sur le fichier <code>home.html</code> du thème<sup>[<a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#pnote-1062-2" id="rev-pnote-1062-2">2</a>]</sup>.</p>
<p>Dans ce fichier on trouve normalement un bloc <em>template</em> de cette forme :</p>
<pre><div id="main">
<div id="content">
<tpl:Entries>
…
</tpl:Entries>
</div>
</div></pre>
<p>Première chose à faire, surtout la plus aisée, exclure la catégorie <em>Flash</em> de la liste des billets affichés normalement. Pour cela il suffit de rajouter l'attribut <code>category="!Flash"</code> dans la balise <code><tpl:Entries></code>. Voilà le code modifié :</p>
<pre><div id="main">
<div id="content">
<tpl:Entries <strong>category="!Flash"</strong>>
…
</tpl:Entries>
</div>
</div></pre>
<p>Vous aurez peut-être remarqué, dans le fichier <code>home.html</code>, un autre endroit où apparait la balise <code><tpl:Entries no_content="1"></code>, dans la section <code><head></code>. Ici aussi il faut rajouter l'attribut <code>category="!Flash"</code> ce qui donnera :</p>
<pre> <tpl:Entries category="!Flash" no_content="1"></pre>
<p>Dernière précision, le <code>!</code> utilisé devant le nom de la catégorie sert à exclure les billets de cette dernière de la liste de ceux qui seront traités (affichés)<sup>[<a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#pnote-1062-3" id="rev-pnote-1062-3">3</a>]</sup>.</p>
<p>Nous voilà donc avec une page d'accueil dont les billets de la catégorie <em>Flash</em> ne seront pas affichés. Prochaine étape, le bloc d'introduction sur la première page. Nous verrons dans le prochain billet comment déterminer si l'on est sur la première page ou pas et le problème — facile à résoudre — que cela peut poser pour la suite de notre exercice.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#rev-pnote-1062-1" id="pnote-1062-1">1</a>] Par contre j'ai choisi de laisser l'accès à tous ces billets particuliers dans la liste des catégories ou dans les archives.</p>
<p>[<a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#rev-pnote-1062-2" id="pnote-1062-2">2</a>] Si votre thème ne possède pas un tel fichier, il suffit de faire une copie de celui qui est présent dans le répertoire du thème par défaut (répertoire <code>default</code>) et de le copier dans le répertoire de votre thème.</p>
<p>[<a href="https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#rev-pnote-1062-3" id="pnote-1062-3">3</a>] Vous pouvez si nécessaire mettre une liste de catégorie dont les noms seront séparés par une virgule. Tous les billets de ces catégories seront alors ignorés. Bien sûr la réciproque est vraie. En ne mettant pas le <code>!</code> devant la ou les catégories, nous ne récupérerons que les billets de cette ou de ces catégories.</p></div>
https://open-time.net/post/2007/06/14/1062-dotclear-2-et-les-templates-5#comment-formhttps://open-time.net/feed/atom/comments/3111DotClear 2 et les templates (4)urn:md5:1b571795f3f6ac0d1f02965a450009e62007-05-29T13:34:10+00:002007-05-29T17:42:49+00:00FranckDotcleardotclearthème <p>Vous savez maintenant qu'il y a deux formes de balises pour les <em>templates</em>, les simples (<code>{{tpl:…}}</code>) et les blocs (<code><tpl:…></code> et <code></tpl:…></code>).</p>
<p>Une des précautions à prendre à propos des blocs est qu'il ne faut pas imbriquer deux blocs de même nom. Je m'explique sur un exemple. Voyez le code suivant :</p>
<pre>1. <tpl:PaginationIf start="1">
2. <div id="intro">
3. <p>Début du blog</p>
4. <tpl:PaginationIf end="1">
5. <p>Fin du blog</p>
6. </tpl:PaginationIf>
7. </div>
8. </tpl:PaginationIf></pre>
<p>Logiquement il signifie ceci :</p>
<p>Si c'est la première page alors on ouvre une <code><div></code> avec un texte particulier (<q>Début du blog</q>), puis, si de plus, c'est également la dernière page — donc il n'y a qu'une page, alors on rajoutera un autre texte (<q>Fin du blog</q>). Chacune des conditions est testée à l'aide d'une balise intitulée <code><tpl:PaginationIf …></code>.</p>
<p>Au moment d'interpréter les balises <code><tpl:…></code> pour les remplacer par le code PHP nécessaire, DotClear 2 va trouver la première balise sur la ligne 1. C'est une balise ouvrante et il va ensuite chercher la première balise fermante de même nom. Celle-ci se trouve sur la ligne 6. Ce sont donc les lignes 2 à 5 qui vont dépendre de la condition testée à la ligne 1 :</p>
<pre>1. <tpl:PaginationIf start="1">
2. <strong><div id="intro"></strong>
3. <strong><p>Début du blog</p></strong>
4. <strong><tpl:PaginationIf end="1"></strong>
5. <strong><p>Fin du blog</p></strong>
6. </tpl:PaginationIf>
7. </div>
8. </tpl:PaginationIf></pre>
<p>Bien sûr DotClear 2 va traiter ces lignes pour éventuellement y chercher des balises <em>templates</em> à remplacer, et il va trouver celle qui se trouve sur la ligne 4, seulement cette balise n'a pas de balise fermante associée et par conséquent sera ignorée.</p>
<p>Une fois ce premier bloc de balise traité (lignes 1 à 6), DotClear 2 va traiter la suite — c'est à dire les lignes 7 à 8, y trouver une balise fermante sur la ligne 8 mais comme aucune balise ouvrante n'a été trouvée auparavant, elle sera également ignorée :</p>
<p>Conclusion nous allons nous retrouver avec le code suivant (l'emphase est mise sur les balises non traitées)<sup>[<a href="https://open-time.net/post/2007/05/29/1036-dotclear-2-et-les-templates-4#pnote-1036-1" id="rev-pnote-1036-1">1</a>]</sup> :</p>
<pre>1. <?php if (page_courante == 1) : ?>
2. <div id="intro">
3. <p>Début du blog</p>
4. <strong><tpl:PaginationIf end="1"></strong>
5. <p>Fin du blog</p>
6. <?php endif; ?>
7. </div>
8. <strong></tpl:PaginationIf></strong></pre>
<p>C'est ce code qui va être ensuite pris en charge par le serveur pour interpréter le code PHP inséré et il va ignorer les balises laissées par DotClear 2, éventuellement en vous gratifiant d'un petit message au passage. Bref pas glop !</p>
<p>Donc pour résumer, si vous utilisez une balise ouvrante quelque part, pensez à insérer la balise fermante correspondante avant de la réutiliser. Parfois cette limitation peut poser problème et je vous expliquerai dans un prochain billet comment écrire vos propres balises pour palier ce problème.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/05/29/1036-dotclear-2-et-les-templates-4#rev-pnote-1036-1" id="pnote-1036-1">1</a>] La ligne 1 est un exemple de code PHP plausible mais n'est pas la ligne réellement insérée par DotClear 2. J'ai préféré mettre quelque chose de simple pour éviter d'encombrer la démonstration.</p></div>
https://open-time.net/post/2007/05/29/1036-dotclear-2-et-les-templates-4#comment-formhttps://open-time.net/feed/atom/comments/3110DotClear 2 et les templates (3)urn:md5:409952be3331cea304f52670e4dc98c12007-05-23T07:17:37+00:002007-05-23T11:13:13+00:00FranckDotcleardotclearthème <p>Je continue ma petite série sur les <em>templates</em> utilisés pour les thèmes de DotClear 2. Je vous avais parlé dans <a href="https://open-time.net/2007/05/15/1018-dotclear-2-et-les-templates" hreflang="fr" title="DotClear 2 et les templates">ce premier billet</a> des deux formes de balises spécifiques aux templates :</p>
<ul>
<li>celles qui sont sous la forme {{tpl:…}}</li>
<li>celles qui sont sous la forme <tpl:…> et </tpl:…></li>
</ul>
<p>Ces balises sont remplacées par DotClear 2 par des instructions <acronym title="PHP Hypertext Processor">PHP</acronym> qui seront ensuite traitées par le serveur.</p>
<p>La première forme est principalement utilisée pour générer du contenu comme par exemple l'affichage de la description du blog dans l'entête avec la balise suivante :</p>
<pre>{{tpl:BlogDescription}}</pre>
<p>Que va faire DotClear 2 avec cette balise ? Et bien il va simplement la remplacer par le code PHP suivant :</p>
<pre><?php echo context::global_filter($core->blog->desc,0,0,0,0,0); ?></pre>
<p>Ensuite le serveur interprètera cette instruction qui sert à récupérer la description du blog dans la base de donnée et à l'afficher<sup>[<a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#pnote-1029-1" id="rev-pnote-1029-1">1</a>]</sup>.</p>
<p>La deuxième forme, composée de deux balises, une ouvrante (<code><tpl:…></code>) et une fermante (<code></tpl:…></code>), permet principalement de traiter un contenu HTML<sup>[<a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#pnote-1029-2" id="rev-pnote-1029-2">2</a>]</sup> seulement si une condition est remplie (balise de test) ou autant de fois que nécessaire (balise de boucle).</p>
<p>Deux exemples, un pour pour chaque type :</p>
<p>Imaginons que je souhaite afficher un texte uniquement si on se trouve sur la page numéro 1 du blog et pas sur les suivantes. Je vais utiliser le code suivant dans mon thème :</p>
<pre><tpl:PaginationIf start="1">
<p>Un joli texte affiché uniquement sur la première page.</p>
</tpl:PaginationIf></pre>
<p>La première balise permet de tester une condition, ici <q>Est-on au <em>début</em> de la pagination, c'est-à-dire sur la page 1 ?</q>. Ensuite nous trouvons le contenu qui sera traité uniquement si la condition est remplie, puis une balise qui indique la fin de ce qui est dépendant de la condition testée.</p>
<p>Imaginons maintenant que je souhaite afficher les 10 derniers billets d'une catégorie. Je vais utiliser le code suivant :</p>
<pre><tpl:Entries category="Flash" lastn="10">
…
<em>affichage du contenu du billet (titre, introduction, …)</em>
…
</tpl:Entries></pre>
<p>La première balise permet de définir ce qu'on veut récupérer, ici les 10 derniers billets (<code>lastn="10"</code>) de la catégorie Flash (<code>category="Flash"</code>). Puis pour chacun de ces 10 billets, tout ce qui se trouve jusqu'à la balise de fin (<code></tpl:Entries></code>) sera répété.</p>
<p>J'espère que c'est suffisamment clair pour tout le monde. Si vous avez tout compris jusqu'ici et bien vous savez tout (ou presque) du système de template de DotClear 2. Je vous parlerai bientôt de ce qu'on peut faire avec tout ça, des quelques précautions qu'il faut prendre et tout ça sur un exemple concret<sup>[<a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#pnote-1029-3" id="rev-pnote-1029-3">3</a>]</sup>.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#rev-pnote-1029-1" id="pnote-1029-1">1</a>] L'instruction PHP <code>echo</code> est utilisée pour afficher quelque chose dans la page que l'on est en train de visualiser.</p>
<p>[<a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#rev-pnote-1029-2" id="pnote-1029-2">2</a>] Ce contenu peut également comporter des balises <em>templates</em>, des deux formes.</p>
<p>[<a href="https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#rev-pnote-1029-3" id="pnote-1029-3">3</a>] Il s'agit de mon futur thème DotClear 2, mais chut, personne n'est au courant !</p></div>
https://open-time.net/post/2007/05/23/1029-dotclear-2-et-les-templates-3#comment-formhttps://open-time.net/feed/atom/comments/3109Dotclear 2 et les templates (2)urn:md5:4e64a65378ffbce976d26b06d0f7d4842007-05-16T06:37:42+00:002007-05-16T06:37:42+00:00FranckDotcleardotclearthème <p>Vous savez maintenant qu'il y a une étape de plus dans le traitement des thèmes avec DotClear 2. Avant d'aller plus loin dans les explications sur ces fameuses balises <em>template</em> dont je vous parlais précédemment (voir <a href="https://open-time.net/2007/05/15/1018-dotclear-2-et-les-templates" hreflang="fr" title="DotClear 2 et les templates">ce billet</a>), deux petites remarques :</p>
<ul>
<li>Pas la peine de mettre des instructions en PHP dans les fichiers du thème vu qu'elles sont supprimées par DotClear 2 lors du traitement.<sup>[<a href="https://open-time.net/post/2007/05/16/1019-dotclear-2-et-les-templates-2#pnote-1019-1" id="rev-pnote-1019-1">1</a>]</sup> Si vous avez besoin de fonctions particulières en PHP pour obtenir ce que vous souhaitez, c'est prévu dans DotClear 2 et je vous en dirai rapidement comment le faire.</li>
</ul>
<ul>
<li>Les commentaires HTML ayant la forme <code><!-- # … --></code> — notez le <code>#</code> au début — seront également supprimés pendant le traitement. Ce qui veut dire que vous pouvez — c'est même fortement conseillé — commenter à loisir toutes les modifications que vous ferez sans pour cela surcharger la page qui résultera du traitement.</li>
</ul>
<p>Un exemple étant plus parlant, voilà un exemple de fichier HTML :</p>
<pre>1. <div id="intro">
2.
3. <!-- # Affichage du résultat d'un appel de fonction PHP -->
4. <?php echo dcMyTemplate::myFunction(); ?>
5.
6. <!-- Debut du bloc -->
7. <p>Lorem Ipsum …</p>
8. </div></pre>
<p>Et voilà ce qu'il en ressortira une fois passé dans les fourches caudines de DotClear 2 :</p>
<pre>1. <div id="intro">
2.
3.
4.
5.
6. <!-- Debut du bloc -->
7. <p>Lorem Ipsum …</p>
8. </div></pre>
<p>Les lignes 3 et 4 qui contenaient respectivement un commentaire masquable (avec le <code>#</code> au début) et du code PHP ont été supprimées. Vous remarquerez que le commentaire de la ligne 6 est resté tel quel et qu'il sera donc visible dans le code HTML final de la page.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/05/16/1019-dotclear-2-et-les-templates-2#rev-pnote-1019-1" id="pnote-1019-1">1</a>] Bien sûr il y a un moyen de désactiver ceci, ce qui permettra l'interprétation du code par le serveur, mais cela reste spécifique à votre installation et n'est en aucun cas la configuration standard. Il est donc illusoire de vouloir distribuer un thème nécessitant ce changement de configuration.</p></div>
https://open-time.net/post/2007/05/16/1019-dotclear-2-et-les-templates-2#comment-formhttps://open-time.net/feed/atom/comments/3107DotClear 2 et les templatesurn:md5:55f46209682d07e30869642955eb250c2007-05-15T06:39:08+00:002007-05-15T06:41:45+00:00FranckDotcleardotclearthème <p>Voilà un premier billet à propos des thèmes de DotClear 2 et plus particulièrement au sujet des <em>templates</em>.</p>
<p>Un thème DotClear 1 est constitué de fichiers <acronym title="PHP Hypertext Processor">PHP</acronym> directement interprétés par le serveur pour générer la page HTML qui sera affichée<sup>[<a href="https://open-time.net/post/2007/05/15/1018-dotclear-2-et-les-templates#pnote-1018-1" id="rev-pnote-1018-1">1</a>]</sup>, alors qu'un thème DotClear 2 est constitué de fichiers <acronym title="HyperText Markup Language">HTML</acronym> contenant des balises spéciales qui seront traitées par DotClear 2 pour générer des fichiers PHP qui seront ensuite, comme DotClear 1, interprétés par le serveur pour générer la page HTML qui sera affichée.</p>
<p>C'est clair ? Comment ça non ? Bon d'accord, comme une image vaut pas mal de mots, voilà un petit schéma qui montre la différence :</p>
<p><img src="https://open-time.net/public/images/divers/DC2_A.png" alt="Différences entre DC1 et DC2" style="display:block; margin:0 auto;" /></p>
<p>À savoir :</p>
<ul>
<li>Le serveur comprend le langage PHP et est capable de l'interpréter pour produire finalement une page HTML</li>
<li>Le navigateur ne comprend <strong>que</strong> le langage HTML</li>
</ul>
<p>Le traitement supplémentaire, noté [1] sur le schéma, est fait par DotClear 2 juste avant l'interprétation du code PHP par le serveur, noté [2] sur le schéma. Le résultat de ce traitement supplémentaire est d'ailleurs conservé dans un répertoire <em>cache</em> (voir le dossier <code>tmp</code> et son contenu) pour gagner du temps les fois suivantes.</p>
<p>Que fait DotClear 2 pendant cette étape 1 ? Et bien il recherche et remplace deux types de balises présentes dans les fichiers HTML du thème :</p>
<ul>
<li>celles qui sont sous la forme <code>{{tpl:…}}</code></li>
<li>celles qui sont sous la forme <code><tpl:…></code> et <code></tpl:…></code></li>
</ul>
<p>Je vous expliquerai à quoi elles servent dans un prochain billet.</p>
<p>Pour en savoir plus :</p>
<ul>
<li>À propos de l'étrange conversation entre le serveur et votre navigateur, je vous conseille <a href="http://www.kozlika.org/kozeries/post/2006/11/25/652-ca-se-passe-comme-ca" hreflang="fr">ce billet</a></li>
<li>La <a href="http://doc.dotclear.net/2.0/resources/themes" hreflang="fr">documentation</a> officielle bien sûr</li>
<li>Tous les billets indispensables chez <a href="http://dissitou.klafoutis.org/" hreflang="fr">Mme la fée</a></li>
<li>Le <a href="http://www.dotclear.net/forum/" hreflang="fr">forum</a>, en cherchant un peu</li>
</ul>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="https://open-time.net/post/2007/05/15/1018-dotclear-2-et-les-templates#rev-pnote-1018-1" id="pnote-1018-1">1</a>] J'ai décrit dans <a href="https://open-time.net/2005/04/21/141-cinematique-de-dotclear" hreflang="fr" title="Cinématique de DotClear">ce billet</a> comment ceci fonctionne.</p></div>
https://open-time.net/post/2007/05/15/1018-dotclear-2-et-les-templates#comment-formhttps://open-time.net/feed/atom/comments/3106