Imaginons que je souhaite apporter un changement simple au code HTML d'un thème comme ajouter une <div> autour des groupes de widgets sur toutes les pages ou encore autour de chaque billet pour faire du centrage dans une mise en page fluide, par exemple. La réponse évidente serait de dupliquer chaque fichier du thème en créant un nouveau thème et d'effectuer les changements dans chaque contexte. Cependant, cette solution a un inconvénient, elle créée beaucoup de fichiers qu'il faudra maintenir en veillant à ce que les changements du thème parent soient répercutés sur le nouveau thème. Comme les thèmes sont appelés à évoluer régulièrement au gré de la découverte de bugs de rendu CSS dans les navigateurs et autres, le processus peut vite devenir fastidieux.

Heureusement, il existe des mécanismes dans Dotclear que l'on peut utiliser pour éviter de devoir dupliquer les fichiers. En s'appuyant sur les behaviors de template et le mécanisme d'héritage des thèmes, on peut ajouter du code autour d'éléments tout en ayant du code plus facile à maintenir.

Avant de continuer, il faudra se familiariser avec le mécanisme d'héritage des thèmes et le fichier _public.php. Les deux premières étapes sont couvertes par des ressources déjà existantes ici.

Disons que j'ai besoin d'avoir une balise div autour de mes groupes de widgets. Afin d'y parvenir, nous allons créer deux fonctions, une créera la balise <div> ouvrante et l'autre la balise </div> fermante de part et d'autre des groupes de widgets.

Premièrement, il nous faut attacher nos fonctions aux behaviors qui sont appelés avant et après les blocs de contenu.

$core->addBehavior('templateBeforeValue',array('behaviorsDeMonTheme','templateBeforeValue'));
$core->addBehavior('templateAfterValue',array('behaviorsDeMonTheme','templateAfterValue'));

Ensuite, il nous faut déclarer la classe behaviorsDeMonTheme et les deux fonctions qui en feront partie, une qui précède le bloc et l'autre qui le suit.

class behaviorsDeMonTheme {

 function templateBeforeValue($core,$v,$attr) {
          if ($v == 'Widgets') { // fonction qui affiche la balise ouvrante devant les groupes de widgets
                       return "<?php echo '<div class=\"widgets\">'; ?>";
          }
          }
 function templateAfterValue($core,$v,$attr) {
          if ($v == 'Widgets') { // fonction qui affiche la balise fermante derrière les groupes de widgets
                       return "<?php echo '</div>'; ?>";
               }
          }

 }

Grâce à cette méthode, vous pouvez ajouter du code HTML à tous les contextes en même temps sans être obligé de dupliquer le fichier du thème parent. En vous servant de cette astuce, vous pourrez aussi faire des choses plus élaborées. Il vous suffit pour cela d'en apprendre plus sur les behaviors de template dans le forum ou la documentation.

Un thème avec seulement une feuille CSS et un fichier _public.php est tellement plus propre et facile à entretenir :)