mardi 29 avril 2008
Template personnalisé par catégorie
Si vous avez un peu pris le temps de décortiquer les sources et les quelques documentations disponibles au sujet de Dotclear2, vous vous êtes sans doute aperçu que vous avez entre les mains un beau jeu de Lego. Si celui-ci peut sembler, de prime abord, complexe, avec un peu de pratique vous vous rendrez rapidement compte qu'il offre une grande souplesse à faible coût.
Pour illustrer ce propos, aujourd'hui, nous allons jouer un peu avec le rendu des pages de catégories.
Posons rapidement le problème : pour certaines catégories, nous souhaitons avoir des éléments en plus (ou en moins), et, pourquoi pas, un balisage HTML radicalement différent.
Par réflexe, nous serons tentés de chercher où glisser un bout de PHP au beau milieu de nos fichiers templates[1], histoire de faire un test sur la (ou les) catégorie(s) devant bénéficier d'un traitement particulier. Nous nous rendrons vite compte que le PHP au sein des templates Dotclear2, bien que possible, n'est pas la panacée. Nous nous dirigerons donc vers un balisage template conditionnel à grand renfort de <tpl:*If*>.[2] Voilà qui peut être très simple et amplement suffisant pour un nombre restreint de cas particuliers.
Figurez-vous que je vais vous proposer de lui rentrer dans le lard, à ce mécréant de Dotclear2. Nous allons le forcer à changer la façon dont il distribue le template (unique) de catégorie, histoire d'avoir les coudées franches une bonne fois pour toutes.
Pas la peine de vous inquiéter, c'est moins violent et intrusif que ça ne le paraît. Il nous suffira de redéfinir le gestionnaire d'URL en charge des catégories, par le nôtre, propre à notre nouveau thème.
L'intervention se limite alors à l'édition du fichier _public.php de notre thème, comme suit :
<?php
$core->url->register('category','category','^category/(.+)$',array('myURLHandlers','category'));
class myURLHandlers extends dcUrlHandlers
{
public static function category($args)
{
$_ctx =& $GLOBALS['_ctx'];
$core =& $GLOBALS['core'];
$n = self::getPageNumber($args);
if ($args == '' && !$n) {
self::p404();
}
$params['cat_url'] = $args;
$params['post_type'] = 'post';
$_ctx->categories = $core->blog->getCategories($params);
if ($_ctx->categories->isEmpty()) {
self::p404();
} else {
if ($n) {
$GLOBALS['_page_number'] = $n;
}
$tpl = 'category-'.$_ctx->categories->cat_id.'.html';
if (!$core->tpl->getFilePath($tpl)) {
$tpl = 'category.html';
}
self::serveDocument($tpl);
exit;
}
}
}
?>
En y regardant de plus près, il apparaît clairement qu'il ne s'agit que d'une copie du gestionnaire par défaut, mais agrémentée du simple ajout de code suivant :
$tpl = 'category-'.$_ctx->categories->cat_id.'.html';
if (!$core->tpl->getFilePath($tpl)) {
$tpl = 'category.html';
}
Ces quelques lignes suffisent à faire toute la différence :
- Nous considèrons que le template à servir en priorité se nomme
category-##.html, où##représente l'identifiant numérique de la catégorie. - Nous nous assurons qu'un template de ce nom est bel et bien disponible auprès du moteur de template
- Si ce n'est pas le cas, nous nous rabattons sur ce cher vieux nom de template par défaut,
category.html - Nous demandons à Dotclear2 de servir le template retenu.
Le tour est joué.
Il est désormais possible de se livrer à toutes les extravagances imaginables pour une catégorie donnée. Il suffira pour cela de lui adjoindre un template HTML correctement nommé.


Commentaires
1. Par julien, le 29/04/2008 à 22:15
2. Par Pep, le 29/04/2008 à 23:04
3. Par Philippe, le 23/05/2008 à 22:11