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
julien
mardi 29 avril 2008, 22:15
Cet exemple de code me pousse à poser une question : qu'est-ce qui nous assure que c'est bien le nouveau gestionnaire qui sera appelé et non pas celui par défaut ? (Par extension : et si un greffon avait lui également redéfini ce même gestionnaire d'URL, lequel serait appelé ?)
Je suppose que ce sera toujours le dernier défini qui sera réellement appelé. Donc, dans quel ordre est-ce que Dotclear va traiter les thèmes, greffons et cœur ?
#2
Pep
mardi 29 avril 2008, 23:04
L'ordre actuel va du plus général au plus spécifique, c'est-à-dire :
inc/prepend.php)inc/public/prepend.php)_public.phpdu thème courant (inc/public/prepend.php, toujours)Néanmoins, après cette séquence, il y a un appel au behavior .
C'est le dernier recours pour jouer avec le gestionnaire d'URLs, puisqu'on entre ensuite de plein pied dans le traitement de la requête.
#3
Philippe
vendredi 23 mai 2008, 22:11
Merci pour l'astuce que je découvre avec un peu de retard, je parvenais jusqu'à maintenant à obtenir des affichages différents selon les catégories en CSS, mais c'est nettement plus puissant ainsi ;)
#4
Toff
samedi 4 avril 2009, 13:22
Merci pour cette astuce qui m'est très utile. Je me pose quand même une question. N'est-il pas possible sur le même principe d'avoir, un tpl de post par catégorie ?
#5
Pep
samedi 4 avril 2009, 15:39
Bonjour Toff,
Regarde de ce côté : http://callmepep.org/bricoland/post...
Je pense que ça doit correspondre à ce que tu cherches.
#6
Black Angel
lundi 8 février 2010, 22:07
Salut Pep,
J'utilise ton astuce et j'ai eu le problème suivant:
Fatal error: Cannot redeclare class myURLHandlersJ'ai suivi ton conseil situé sur Dotaddict. Cela fonctionne. Toutefois cela a-t-il des conséquences sur le plugin myURLHandlers ?
Merci