A partir de Ametys 4.9

Une charte graphique peut avoir un comportement par défaut en cas d'absence d'un plugin dont elle dépend.

Dépendance classique

La dépendance à un plugin dans un fichier XSL ou SCSS utilise un import via le protocole "plugin:PLUGINNAME://" par exemple :

<xsl:import href="plugin:rocket.chat://stylesheets/rocket.chat.xsl" />

ou

@import "plugin:rocket.chat://resources/css/Rocket.Chat";

Cette dépendance "classique" nécessite que le plugin Rocket.Chat existe et comporte les fichiers XSL et SCSS importés.
Dans le cas contraire, la XSL ou la SCSS provoquera une erreur.

Dépendance optionelle

Rendre une dépendance optionelle se fait en 2 étapes : indiquer que l'on rend la dépendance optionelle et fournir le comportement par défaut.

Rendre la dépenance optionelle

Dans les url de la forme "plugin:PLUGINNAME://location" il s'agit d'ajouter un "?" derrière le nom du plugin.
Les exemples ci-dessus deviennent ainsi :

<xsl:import href="plugin:rocket.chat?://stylesheets/rocket.chat.xsl" />

ou

@import "plugin:rocket.chat?://resources/css/Rocket.Chat";

Comportement par défaut ou fallback

Il faut créer ou modifier le fichier "skins/MASKIN/conf/optional-source-fallbacks.xml" pour indiquer vers quelle url renvoyer le cas échéant les urls optionnelles.

Il est important que toutes les urls optionnelles utilisées trouvent une correspondance ici.

Ce fichier comporte une balise racine <fallbacks>suivi de 0..n balises <fallback>.
Chaque balise fallback comporte 2 sous-balises :

  • <uri> indique l'url optionelle (incluant le caractère "?" après le nom du plugin). 
    L'attribut regexp à true, permet d'indiquer que le contenu d'uri est une expression régulière qui va vérifier l'uri optionelle.
  • <fallback> qui indique l'url de redirection.
    Si l'uri est une expression régulière, il faut utiliser $1...$N pour récupérer les contenus des groupes définis dans l'expression régulière.

Par exemple, la contenu suivant va indiquer que toutes les urls optionnelles du plugin Rocket.Chat doivent être redirigées vers le dossier de la charte graphique "skins/MASKIN/fallbacks/plugin/rocket.chat".

<fallbacks>
   <fallback>
        <uri regexp="true">^plugin:rocket\.chat\?://(.*)$</uri>
        <fallback>fallbacks/plugin/rocket.chat/$1</fallback>
 </fallback>
</fallbacks>

qui évite de décrire chaque url que l'on souhaite rediriger.
Dans les exemples ci-dessus cela nécessiterait :

<fallbacks>
 <fallback>
       <uri>plugin:rocket.chat?://stylesheets/rocket.chat.xsl</uri>
       <fallback>fallbacks/plugin/rocket.chat/stylesheets/rocket.chat.xsl</fallback>
   </fallback>
 <fallback>
      <uri>plugin:rocket.chat?://resources/css/Rocket.Chat.scss</uri>
      <fallback>fallbacks/plugin/rocket.chat/resources/css/Rocket.Chat.scss</fallback>
 </fallback>
</fallbacks>

L'import de scss utilisé en haut ne précise par l'extension .scss car c'est optionel en SCSS
     @import "plugin:rocket.chat://resources/css/Rocket.Chat";
pour autant, la redirection ici nécessite le .scss car c'est bien cette url qui sera utilisée au final

Fichiers par défaut

Il reste maintenant à réellement écrire la version par défaut des fichiers référencés avec un contenu nécessaire à faire fonctionner les XSL ou les SCSS.

Dans les exemple ci-dessus, le plugin Rocket.Chat fournit une xsl "stylesheet/rocket.chat" qui contient les templates suivants : "rocket.chat-css" et "rocket.chat-scripts".
La XSL de la charte grpahique qui importe "plugin:rocket.chat?://stylesheets/rocket.chat.xsl" comporte les instructions :

<xsl:call-template name="rocket.chat-css"/>
<xsl:call-template name="rocket.chat-scripts"/>

Il faut que les fichiers par défaut puissent remplacer ceux du plugin en définissant ces templates : 

"skins/MASKIN/fallbacks/plugin/rocket.chat/stylesheet/rocket.chat.xsl"

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <!-- empty fallbacks -->
   
   <xsl:template name="rocket.chat-scripts"/>
   <xsl:template name="rocket.chat-css"/>
  
</xsl:stylesheet>

 

Pour la scss de Rocket.Chat qui est juste importée, un fichier SCSS vide convient "skins/MASKIN/fallbacks/plugin/rocket.chat/resources/css/Rocket.Chat.scss".
Mais si la SCSS qui importe Rocket.Chat.scss nécessite une variable définie par celle-ci, il faudait que le fichier de fallback définisse cette variable aussi (et sa valeur par défaut).

Retour en haut