Dans le cadre de mon projet professionnel de gestion de documents, je classe l'ensemble des fichiers dont je dois fournir un lien de téléchargement, dans des onglets via le composant de régular labs tabs.
Le besoin
Dans chacun de ces onglets, au moyen de l'outil du même éditeur content replacer, si cet onglet ne contient aucun lien de téléchargement, ma hiérarchie m'a demandé de positionner un texte de spécifiant. Afin de ne pas avoir à tout corriger au gré des différents changements politiques, le texte que je remplace est lui-même spécifié dans content templater par la "constante" [[[onglet_vide]]]. Le composant de remplacement va alors remplacer cette chaîne de caractère, par un div auquel j'ai appliqué un style assez sympa, avec la chaîne de caractère "cet onglet ne contient aucun lien de téléchargement." Voila pour la demande de départ.
Or, au fil des mois, nous nous rendons compte que sur l'ensemble des onglets d'une fiche, chacune des fiches contenant environ une quinzaine d'onglet, si nous recherchons un document sur une fiche, nous sommes obligés de cliquer sur l'onglet pour voir son contenu. La demande de ma hiérarchie a été à suivante : ne serait-il pas possible d'adjoindre dans le libellé de l'onglet, un symbole distinctif spécifiant et la présence ou absence de document téléchargeable dans cet onglet"
Analyse d'expression rationnelle
Je ne vais pas vous le cacher, j'ai passé énormément de temps à réfléchir à une expression régulière pour pouvoir afficher les onglets contenant soit la chaîne spécifiant que l'onglet est vide, soit éventuellement une chaîne de caractères spécifiant que l'onglet n'est pas vide.
J'ai passé énormément de temps sur ce sujet et ne savais vraiment pas comment faire ma requête point de plus, je m'interrogeais sur le fait de placer ma regex sur le code HTML généré, ou sur le code Joomla contenant les short code du composant tab, totu en réorganisant les appels des plugins dans Joomla.
Fonctionnement
Après de nombreux tests, j'ai opté pour la recherche dans le code HTML généré, ce qui paradoxalement a été beaucoup plus simple à traiter.
Ainsi, mon expression rationnelle va rechercher une liste dont la classe est bien spécifique aux onglets, j'en extrais le contenu des listes mais sous 3 groupes de recherche différents
- dans un premier temps je recherche tout le groupe qui contient la liste jusqu'au libellé de l'onglet
- dans le deuxième groupe, j'extrais le contenu de l'onglet
- donc le dernier groupe, j'extrais le reste avec le contenu de la constante spécifiant que mon onglet est vide. Dans mon cas, cette constante s'appelle [[[onglet_vide]]].
Le code
Comme vous pourrez le voir dans le code source que je vous propose, je recherche donc ma regex avec le début de la liste, j'extrais le contenu ainsi que la fin de ma liste avec la chaîne de caractère spécifiant que mon onglet est vide. Je récupère ensuite dans les paramètres du plugin, le code ASCII correspondant au caractère spécial que je souhaite mettre avant le libellé de l'onglet pour spécifier que ce dernier est vide, puis je substitue simplement cette nouvelle chaîne de caractères au contenu existant de l'onglet.
Voila, rien de bien compliqué même si j'ai mis un certain temps avant de réussir ce plugin
ongletvide.php
<?php
defined('_JEXEC') or die('Access deny');
class plgContentOngletvide extends JPlugin
{
function onContentPrepare($content, $article, $params, $limit){
$re = '/(<ul.*class="nav nav-tabs".*<li.*<a.*><span.*>)(.*)(<\/span>.*<\/li>.*[[[onglet_vide]]])/Us';
$subst = "$1&#".$this->params->get('code')."; $2$3";
$article->text = preg_replace($re, $subst, $article->text, 1);
}
}
?>
ongletvide.xml
<?xml version="1.0" encoding="utf-8"?>
<extension version="1.0" type="plugin" group="content" method="upgrade">
<name>Mentions onglets vides</name>
<author>Sébastien LHUILLIER</author>
<creationDate>Avril 2024</creationDate>
<copyright></copyright>
<license></license>
<authorEmail>Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.</authorEmail>
<authorUrl>www.sebastien-lhuillier.com</authorUrl>
<version>1.0</version>
<description>
Ajoute un caractere automatiquement dans les onglets contenant [[[onglet_vide]]]
</description>
<files>
<filename>ongletvide.xml</filename>
<filename plugin="ongletvide">ongletvide.php</filename>
</files>
<config>
<fields name="params">
<fieldset name="basic">
<field name="code" type="text" default="" label="code UTF-8 numerique (juste le nombre comme 128309)" description=""/>
</fieldset>
</fields>
</config>
</extension>