Posons d'abord le décor

Que nous ne nous mèprenions pas : l'idée de thèmes hérités n'est pas nouvelle et encore moins révolutionnaire.

De fait, il s'agit simplement de décliner un nouveau thème depuis un thème existant, sans avoir à tout réécrire ou copier, surtout en matière de templates et de comportements. Pour la suite de ce billet, nous établirons les termes suivants :

  • Le thème enfant : il s'agit de notre nouveau thème, qui reposera sur une grosse part d'existant fournie par un autre thème.
  • Le thème parent : c'est ce fameux thème qui nous fournit déjà une base solide que nous nous contenterons de compléter et/ou de spécialiser dans notre nouveau thème enfant.

Si vous avez déjà créé des thèmes pour Dotclear 2, vous devez déjà comprendre pourquoi l'idée des thèmes hérités n'est pas nouvelle.

Non ? Allons... Relisez bien les deux petites définitions.

Et oui : en standard, un thème Dotclear 2 hérite systématiquement du thème default. Rappelez-vous que si votre thème ne fournit pas des versions spécifiques des templates home.html, post.html, category.html, etc. , Dotclear 2 utilisera alors les versions de ces fichiers présentes dans le thème default pour effectuer un rendu des pages.

En résumé : actuellement, tout thème personnalisé est déjà un thème enfant du thème par défaut de Dotclear 2.

La nouveauté dans Dotclear 2.1 tient qu'il sera désormais possible de préciser explicitement et librement cette relation parent/enfant. Vous pourrez alors dire que votre nouveau thème B hérite du thème A, plutôt que du thème default.

Comment les choses s'emboitent

Ou, plus exactement, comment elles s'enchainent.

Séquence de chargement du thème B

  1. Si le thème A fournit un fichier _public.php, ce dernier est chargé.
  2. Ensuite, si le thème B fournit lui aussi un fichier _public.php, celui-ci est chargé à son tour.

Ainsi, si :

  • de nouvelles balises de templates,
  • de nouveaux gestionnaires d'URL

ont été définis et sont utilisés dans le thème A, ils seront également directement disponibles dans le thème B.

Ordre de recherche d'un fichier template lors du rendu

  1. Si B dispose du fichier demandé, ce dernier sera utilisé.
  2. Sinon, si A dispose du fichier demandé, celui de A servira au rendu.
  3. Sinon, Dotclear 2.1.x fera la recherche habituelle :
    1. d'abord dans le thème par défaut (default),
    2. puis dans les autres chemins possibles susceptibles d'avoir été ajoutés par des plugins.

Autres fichiers de thème (CSS, Javascript, images ...)

A l'heure actuelle, aucune notion d'héritage n'est disponible à ce niveau. En tout cas, pas en standard.

Ce qui signifie que tout marqueur {{tpl:BlogThemeURL}} pointera systématiquement vers l'URL de B, même si ce dernier n'apparait que dans un template fourni par A.

Limitation à un - et un seul - niveau d'héritage

Autant vous avertir tout de suite : le système d'héritage des thèmes est volontairement bridé à un seul niveau et un seul lien de parenté.

Sachez donc que :

  • Un thème ne peut hériter que d'un autre thème et un seul[1].
  • Un thème ne peut pas hériter d'un thème qui lui-même hérite d'un autre thème[2].

Comment ça s'utilise

J'imagine - j'espère - que c'est la dernière question que vous vous posez. :-)

Déclarer explicitement un thème B comme enfant d'un thème A est très simple. Il faudra simplement bien se mettre en tête que la relation entre deux thèmes s'expriment en utilisant les identifiants internes (en gros les noms des dossiers), et non leurs noms communs (aka les libellés).

Tout se passe alors dans le fichier _define.php du thème enfant :

$this->registerModule(
        /* Name */                      "Mon superbe thème",
        /* Description*/                "Exemple d'un thème enfant basé sur Blue Silence",
        /* Author */                    "Pep",
        /* Version */                   '1.0',
        /* Id du Parent */              'blueSilence'
);

Notes

[1] Pas d'héritage multiple, comme on dit dans certaines contrées malfamées.

[2] Enfin, rien dans Dotclear 2.1 ne vous empêchera d'en tenter l'expérience, mais vous serez forcément déçu du résultat. :-)