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.
- Mettez en place un thème enfant avec le thème parent de votre choix.
- Ouvrez et/ou créez le fichier _public.php de votre thème.
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 :)
Commentaires
Ça ne fonctionne pas si on retourne directement les balises ? Par exemple :
return "</div>";
Oui c'est exact, ça fonctionne aussi si on utilise le code que tu indiques.