Cloner un thème est facile — pour peu qu’on ait pas d’appréhension à modifier du code PHP —, puisqu’il suffit de dupliquer le dossier du thème original, de changer le nom du dossier et de changer le nom du thème défini dans le fichier _define.php.
Ça peut suffire, mais ça peut ne pas parce qu’il se peut que le thème cloné ait un fichier _prepend.php et/ou un fichier _public.php contenant une ou plusieurs classes et dans ce cas là, Dotclear ne va pas aimer[1].
Dans ce cas là, il faut ouvrir et modifier ces fichiers pour changer le nom des classes définies et leurs usages, ce qui, pour certains thèmes (comme Ductile), peut devenir assez pénible vu la quantité de code.
C’est la raison pour laquelle j’ai introduit une petite modification dans les thèmes de la prochaine version 2.12 de Dotclear : l’usage des espaces de nom de PHP.
Pour faire vite, et d’ailleurs c’est applicable à n’importe quel thème publié, il suffit de définir l’espace de nom en début de fichier ; exemple pour Ductile dans les fichiers _public.php et _prepend.php :
<?php
namespace themes\ductile;
# -- BEGIN LICENSE BLOCK ---------------------------------------
# This file is part of Ductile, a theme for Dotclear
#
# Copyright (c) 2017 - Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
…
Puis d’utiliser le préfixe \ pour les appels de fonctions statiques de Dotclear et d’utiliser la constante __NAMESPACE__ là où c’est utile. Exemple pour les appels des fonctions statiques de Dotclear :
l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');
…
echo
dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js');
devient :
\l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');
…
echo
\dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
\dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js');
Et pour utiliser le nom de la classe définie dans le fichier :
$core->addBehavior('publicHeadContent',array('tplDuctileTheme','publicHeadContent'));
devient (notez le \ devant le nom de la classe) :
$core->addBehavior('publicHeadContent',array(__NAMESPACE__.'\tplDuctileTheme','publicHeadContent'));
Une fois effectuées ces modifications, le thème est candidat à un clonage plus simple car il ne sera plus utile de modifier le nom de la ou des classes définies dans le code et le code de leurs usages, il suffira simplement de modifier le nom de l’espace de nom.
Par exemple si je veux cloner le « nouveau » Ductile, il me suffira alors de dupliquer le dossier ductile, de modifier le nom du dossier, de modifier le nom du thème dans le fichier _define.php et de modifier le nom de l’espace de nom au début des fichiers _public.php et _prepend.php :
<?php
namespace themes\ductileClone;
# -- BEGIN LICENSE BLOCK ---------------------------------------
# This file is part of Ductile, a theme for Dotclear
#
# Copyright (c) 2017 - Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
…
Attention, pas de tiret ou autres caractères spéciaux dans les espaces de nom, il est du coup préférable d’utiliser un nommage de type CamelCase.
Pour ma part, les prochaines versions des thèmes que j’ai publié contiendront cette modification.
PS : Ce changement n’est pas à faire dans un fichier _config.php du thème s’il en comporte un, à moins que la propriété standalone_config du thème soit définie à true dans sa définition.
PPS : Les espaces de nom sont utilisables dès la version 5.3 de PHP, il n’y a donc aucune contre-indication à faire cette modification dès à présent.
Note
[1] Sauf si vous avez défini un autre répertoire principal pour les thèmes du blog avec about:config. Dans ce cas il se peut qu’il n’y ait aucune incidence, c’est à vérifier au cas par cas.
1 De mirovinben -
Super !…
Et merci pour tes explications.
Pour ceux qui veulent se documenter en français sur les “namespace” sans devoir, comme je l’ai fait, chercher un bon bout de temps des infos faute de poser la bonne question au moteur de recherche de php.net, le lien kivabien
2 De Franck -
Merci pour le lien mirovinben, je vais le placer dans le billet.
3 De Mathieu M. -
Bonsoir Franck,
Merci pour ces nouveautés, c’est vachement top pour les thèmes enfants :)
Une remarque en revanche sur le thème Berlin, existe t-il une manip’ pour le rendre “parent” ?
Car en créant mon dossier “enfant”, si je ne fais que créer un _define.php et adapter _head.html, le blog part en sucette et le
js
ne semble pas pris en compte.4 De Franck -
Mathieu M. normalement définir une propriété
'parent' => 'Berlin'
devrait suffire à en faire un thème enfant de Berlin.Une URL pour voir ça de visu ?
5 De Mathieu M. -
Après quelques recherches, je suis tombé sur une solution sur le forum Dotclear.
Tout est rentré dans l’ordre en ajoutant le paramètre
'standalone_config' => false,
.A savoir si c’est normal… :)
C’est un projet en cours (voir mon lien).
6 De Franck -
Étrange, va falloir que je regarde ça.
7 De Mathieu M. -
Un souci également sur smartphone, les polices d’écriture sont très petites en comparaison de chez toi par exemple.
8 De Gilles -
Bonjour,
J’ai actuellement un souci (que je pense lié à des conflits entre le thème source et personnalisé de Ductile).
Je suis donc entrain de remettre à jour ma configuration. Pourriez-vous mettre à disposition une archive contenant les deux répertoires Ductile et DuctileClone qui prennent en compte les modifications que vous décrivez dans ce billet, car même en suivant vos explications, je ne parviens pas à faire fonctionner le thème clone.
J’ai une question par ailleurs : en dupliquant le dossier de Ductile pour faire son clone. Le fichier style.css qui sera utilisé par le thème clone sera - je suppose - celui contenu dans le répertoire du clone. Peut-on alors supprimer ce dernier et se trouver dans le mode de fonctionnement décrit ici?
Merci pour votre aide et précisions !
Et merci pour toutes les améliorations que vous apportez à Dotclear et qui sont souvent très appréciées. :)
Gilles
9 De Franck -
Gilles l’héritage entre thème parent et thème enfant ne concerne pas les CSS des deux thèmes. Chaque thème doit donc posséder sa propre CSS.
10 De Gilles -
Dacc.
J’avoue être un peu perdu entre :
Est ce que ce sont trois choses bien distinctes? Ou des choses qui peuvent être utilisées de manière complémentaire?
11 De Franck -
Pour répondre rapidement, oui ce sont trois choses distinctes. L’héritage est géré par Dotclear, le clonage est une façon de dupliquer et de modifier un thème créé par quelqu’un d’autre (et donc de préserver ses propres modifications si jamais le thème cloné devait être mis à jour ensuite), quant au thème Custom CSS il est indépendant.
12 De Gilles -
J’étais parvenu à cela en dupliquant et en modifiant le nom des classes par le nom de notre thème personnalisé. Mais depuis peu (je suppose depuis la dernière mise à jour de Dotclear), il semble qu’il y ait un fichier du thème Ductile contenant mes modifications qui empêche la génération de la page d’administration d’Apparence du blog. J’ai donc été obligé d’isoler le dossier du thème et de revêtir le thème Ductile dans sa forme originale en attendant.
Je vais réessayer en local la méthode décrite dans ce billet (qui me semble la mieux appropriée dans mon cas). M’assurer que Ductile et DuctileClone fonctionne indépendamment. Puis ré-insérer progressivement les éléments de mon template personnalisé dans DuctileClone, pour identifier la source du conflit ou repartir sur une base du thème Ductile à jour.
Merci en tout cas pour tes réponses, même rapides, ça m’aide à y voir plus clair.