Organisation des plugins, squelettes et thèmes

, par _Eric_

Je publie à nouveau ce billet datant de 2007 pour mémoire mais aussi pour nourrir la réflexion actuelle sur les squelettes à thèmes comme SPIP-Clear, Zesty, Zpip...

Introduction

Organiser la relation entre plugins, squelettes et thèmes en partant de l’existant, à savoir, la structure des plugins et la surcharge du path. L’intérêt est d’offrir un réceptacle aux thèmes dans SPIP comme le modèle des plugins l’a fait fait aux fonctions et squelettes.

Quelques idées à débattre éventuellement...

Principes

Basé sur :

  1. Des répertoires à la racine du site :
    • plugins/
    • squelettes/
    • themes/
  2. Un fichier xml, à l’instar des plugins, pour chaque thème ou squelette (à voir si intérêt). Donc theme.xml et squelette.xml.

L’idée étant de lier, en particulier, les thèmes à son squelette de base (plugin ou pas), le lien pourrait se faire dans le fichier theme.xml par une balise <prefix> qui renverrait sur le préfixe du plugin-squelette. On pourrait aussi donc créer un squelette.xml contenant à minima cette balise.

SPIP, gèrerait nativement, comme pour les plugins :

  1. Une liste de thèmes issus du répertoires themes/ et pourrait proposer une page de choix des thèmes associés au plugin actif qui propose de tels thèmes
  2. Un path incluant themes/ si il existe (ça doit inclure aussi la balise #CHEMIN, voire une balise #THEME)

Cas d’un squelette-plugin type Sarka-SPIP

Le plugin

Le squelette Sarka-SPIP, distribué sous forme de plugin possède donc le fichier plugin.xml suivant :

<plugin>
    <nom>Squelette Sarka-SPIP 2</nom>
    <auteur>
        SarkAFeeK (Toufik), SarkALeoN (Sylvain), SarkARchimeD (Xavier), SarkASmeL (Eric)
        &copy; 2007 - Distribu&eacute; sous licence GPL
    </auteur>
    <version>2.0.1</version>
    <etat>stable</etat>
    <icon>images/sarka-icone.png</icon>
    <description>
    Ce plugin active ou désactive le squelette Sarka-SPIP....
    </description>
    <lien>[Site Sarka-SPIP->http://www.sarka-spip.com]</lien>
    <prefix>SarkaSpip</prefix>
    <fonctions>sarkaspip_fonctions.php</fonctions>
    <options>sarkaspip_options.php</options>
</plugin>

Et une arborescence de fichiers « thémables » suivante :

  • images/, contenant toutes les icônes et autres logos
  • styles/, contenant les css (style.css, impression.css...)
  • scripts/, contenant les scripts js ou htc

Les thèmes

Tout d’abord, le thème par défaut reste dans le dossier du plugin comme aujourd’hui. La distribution n’est donc pas modifiée. Les thèmes Sarka-SPIP supplémentaires seraient donc installés dans themes/ de la façon suivante :

  • themes/sarka-rose/
  • themes/sarka-bleu/
  • themes/sarka-vert/

et possèderaient tous un fichier theme.xml, avec le préfixe SarkaSpip, dont la structure pourrait être :

<theme>
    <nom>Sarka-SPIP 2 Vert</nom>
    <auteur>
        SarkAFeeK (Toufik)
        &copy; 2007 - Distribu&eacute; sous licence GPL
    </auteur>
    <version>0.1</version>
    <etat>stable</etat>
    <icon>images/sarka-vert.png</icon>
    <description>
        Ce thème propose une alternative verte....
    </description>
    <lien>[Site Sarka-SPIP->http://www.sarka-spip.com]</lien>
    <prefix>SarkaSpip</prefix>
</theme>

Le nec serait d’avoir aussi une balise <necessite version=xxx> qui permettrait d’assurer la compatibilité entre le thème et une version ou une plage de versions du squelette. D’ailleurs peut-être que <necessite> peut remplacer la balise <prefix>, mais sémantiquement c’est pas la même chose. A moins qu’on utilise une balise <squelette id=prefix version=xxx> ?

L’arborescence des fichiers sous themes/sarkaspip_2_vert/ serait la suivante :

  • images/
  • styles/
  • scripts/

Dans l’espace privé, on pourrait avoir une page admin_theme, à l’instar de la page admin_plugin, accessible soit par un bouton « Gestion des thèmes » sous « Configuration », soit par un bouton dans la description du plugin si des thèmes lui sont rattachés. La présentation peut être en tout point identique à celle des plugins. La liste des thèmes proposés correspond à la liste des thèmes des plugins actifs uniquement. On peut donc imaginer une présentation à deux niveaux : nom du plugin / thèmes.

Utilisation dans le plugin-squelette : tout se fait via le path (non ?) et la balise #CHEMIN quand on met dans le header l’inclusion des css comme :
<link rel="stylesheet" href="#CHEMIN{styles/style.css}" type="text/css">

Si aucun thème n’est actif, on prends plugins/sarkaspip_2/styles/style.css, si le style vert es actif, on inclus plutôt themes/sarkaspip_2_vert/styles/style.css.

Par contre, c’est la définition du contenu d’un thème qui n’est pas explicite. On pourrait ainsi y mettre des noisettes HTML ou autres. On pourrait imaginer alors d’utiliser une balise #THEME plutôt que #CHEMIN qui seule permettrait la surcharge du path par themes/ et on ne toucherait pas à la balise #CHEMIN. On aurait donc :

<link rel="stylesheet" href="#THEME{styles/style.css}" type="text/css">
<link rel="stylesheet" href="#CHEMIN{styles/style_nontheme.css}" type="text/css">

Et on saurait que seuls les styles de style.css sont surchargeables dans des thèmes et pas style_nomtheme.css. C’est au squelette de choisir son template de thème.

Donc un squelette comme Sarka-SPIP distribué par plugin aurait, dans l’ordre :

  1. ses css et images personnalisables par les thèmes, switchables dans l’espace privé
  2. des paramétres de thèmes ou de noisettes gérés avec CFG
  3. et si besoin, ses pages et/ou noisettes personnalisables dans le dossier squelettes

laissant la distribution plugin stable et sans modification. C’est intérêt finalement de distribuer le squelette en plugin.

Pour squelettes/ on pourrait aussi faire une personnalisation squelettes/sarkaspip_2_perso/ avec un fichier squelette.xml contenant le préfixe SarkaSpip. C’est surtout utile pour le cas d’un squelette non plugin.

Cas de la DIST

Les thèmes sont mis dans themes/dist_xxxx/ et possède un theme.xml dont le préfixe peut-être soit Dist soit vide (je sais pas trop... mais si on choisi une balise type <necessite> alors il faudra un préfixe standard).
Le reste est identique au plugin Sarka-SPIP pour ce qui est de la mise en oeuvre et de la personnalisation.

Cas d’un squelette non plugin type Multisaisons

Cela ressemble aux cas précédents pour les thèmes qui seraient dans themes/ avec un fichier theme.xml. Mais pour associer le thème au squelette par un préfixe il faudrait alors un fichier squelette.xml attaché à la distribution du squelette et contenant à minima la balise <prefix>. Le reste est identique, mais on voit ici que la personnalisation hors thèmes devient plus difficile.