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é.

Notes

[1] Réflexe naturel de tout nouvel utilisateur arrivant de Dotclear 1.x. Osez me dire le contraire ! ;-)

[2] Réflexe naturel de tout thèmeur allergique au PHP. Là aussi, osez me dire le contraire ... :-p