Que voit on aujourd'hui ?

Oui vous avez bien lu le titre... mais vous allez être déçus... ou pas :) !

Dans le cadre de mes fonctions professionnelles d'adminitration d'un site intranet national, il arrive que des infos mentionnées soient devenues osolètes, erronnées, ... et donc l'article doit être supprimé de Joomla. Mais pour que j'en sois averti, Il faut donc faire une remontée de l'information au gestionnaire de la page (moi, quoi) afin que je corrige.

Alors, oui, j'ai déja écrit un module de ce type mais je souhaitais développer, pour me faire la main, un plugin pour ca. De plus, l'utilisation d'un plugin est drôlement plus souple puisqu' on peut l'intégrer où l'on veut dans sont article (Joomla content pour ma part) à l'aide de shortcodes.

L'idée de ce plugin est de définir une chaine entre deux tags dans un article et le plugin générera une chaine, avec un hyperlien et un mailto.

Alors le spam ? Oui bah pour être honnête, rien a faire puisque mon intranet n'est pas relié au net. On peut se permettre donc un lien hypertexte de type mailto: .

Alors j'ai déja écrit un article sur un plugin que j'avais fait à l'époque où je n'avais pas trop le temps de m'apesantir sur le sujet. Cette fois, je vais essayer de rendre et article plus pédagogique.

Il fait quoi ce plugin ?

Le plugin va remplacer l'appel dans un article {mailtoEnreg}Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.{/mailtoEnreg} par Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.

Rien de bien folichon, mais c'est un besoin... ou plutôt un besoin pédagogique ! Apprenons à réaliser ce plugin

Un plugin répond à un événement

Joomla a recenséune multitude d'événements que l'utilisateur peut générer. Bonne nouvelle, vous n'avez pas à détecter l'événement, juste trouver le bon pour y implémenter le code qui va bien. Vous pouvez retrouver la liste des événements et ce à quoi ils répondent sur la page Plugin/Events de Joomla! Documentation. Je ne vais pas ici faire un inventaire à la Prévert mais sachez que le système Joomla possède une cinquantaine d'événements. Pour celles et ceux qui ont déja codé avec des IDE comme Delphi, ou encore VB, c'est le code que vous mettez dans les onEvent. (Ex : onClick). Sauf qu'ici c'est bien à un événeemnts serveur qu'il faut répondre.

Il est a noter qu'ici, on souhaite transformer un shortcode en une chaine mailto. Alors il est où cet événement ? Que peut il bien être ? Et voila le premier travers auquel je me suis heurté et je tenais à prendre quelque igne pour mieux expliquer. Contrairement à un IDE comme ceux que j'ai cité, les événements de Delphi par exemple sont des événemments engendrés par des actions utilisateurs, qu'ils soient directs ou par ricochet (OnClick est direct car c'est sur une action souris, onChange peut être par ricochet car ca peut être, par exemple, en cliquant sur un bouton qu'un élément peut changer. Et ce sera sur l'événement onChange de l'objet sur lequel produire le test que l'on intégrera le code). Si je transpose cette explication au web, il nous vient tout de suite à l'esprit les différents événements Javascript. Et bien, vous avez tout faux, c'est pas ce que l'on cherche. 

Pourquoi dis-je cela ? Car je suis tout de suite fourvoyé dans ce travers et n'ai plus rien compris jusqu'à ce que je reprenne tout depuis 0. Si vous analysez les différents événements de la liste dont je vous ai mis le lien, vous vous rendez vite compte que ces événements sont détéctés par joomla "en interne" et ne sont pas directement la conséquence d'actions utilisateurs directes. Il faut imaginer un moteur Joomla qui passe son temps à attendre de voir si l'utilisateur a fait une action qui puisse engendrée une action qui puisse répondre à un événement. 

Dans notre exemple, le plugin répond à un onContentPrepare (je détaille le code plus loin). Si je regarde la documentation de onContentPrepare, on se rend compte qu'Il s'agit de la première étape de la préparation du contenu pour la sortie et est le point le plus courant pour les plugins orientés contenu pour effectuer leur travail. C'est donc une action qui est intercalée entre le moment où la page web est demandée, mais non encore affichée. Juste avant son affichage, on lance l'action avant de la retourner au navigateur modifiée (les shortcodes sont modifiés par du HTML). Nous verrons plus bas l'action (le code) en détail.

Organisation des fichiers d'un plugin Joomla.

L'organisation des fichiers d'un plugin s'organise ainsi et je crois bien que c'est encore plus simple que mes modules :

  • un fichier php au coeur du systeme (mailidenreg.php) qui est le coeur de l'action
  • le fichier XML associé (mailidenreg.xml)

Attention : je me suis fait avoir. Dans le fichier XML, il faut bien spécifier (ligne 13), le nom du plugin : nom du fichier sans l'extension.

Les fichiers

mailidenreg.php

<?php

defined('_JEXEC') or die('Access deny');

?class plgContentMailidenreg extends JPlugin{
?function onContentPrepare($content, $article, $params, $limit){
?preg_match_all('/{mailtoEnreg}(.*?){\/mailtoEnreg}/is',$article->text ,$matches);
? $i=0;
?foreach($matches[0] as $match){
?$username=$matches[1][$i];
?$email = $matches[0];
?$sujet_email = $this->params->get('sujet_email', '');
?$contenu_mail_avant_id_art = $this->params->get('contenu_mail_avant_id_art', '');
?$idart = explode(':',JRequest::getVar('id'));
? $texte_contenu .= $contenu_mail_avant_id_art.$idart[0].'%20%0AVeuillez%20nous%20spécifier%20la%20modification%20a%20effectuer%20:%0A';
?$ligne = '<a class="titre-lien-mail-id-enreg" target="_blank" href="mailto:'.$username.'?subject='.$sujet_email.'&body='.$text_lien.'%0A'.$texte_contenu.'">'.$this->params->get('titre_lien', '').' </a>';
?$article->text = str_replace($match,$ligne,$article->text);
}
}
}

mailidenreg.xml

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="Content">
<name>Mailidenreg</name>
<author>Sebastien LHUILLIER</author>
<creationDate>Juillet 2022</creationDate>
<copyright>Copyright (C) 2005 - 2013 Open Source Matters. All rights reserved.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</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>Ce plugin permet d'intégrer un hyperlien mailto avec ID de l'enregistrement</description>
<files>
   <filename plugin="mailidenreg">mailidenreg.php</filename>
   <filename>mailidenreg.xml</filename>
   <filename>tagparser.php</filename>
</files>

<config>
   <fields name="params">
      <fieldset name="basic">
         <field name="titre_lien" type="text" label="Titre du lien" description="Titre du lien" />
         <field name="sujet_email" type="text" label="Sujet de l'mail" description="Sujet de l'email à envoyer" />
         <field name="corps_email" type="textarea" label="Corps de l'email" description="Corps de l'email à envoyer auquel sera automatiquement concaténé l'ID de l'article" rows="10" cols="5" />
         <field name="contenu_mail_avant_id_art" type="text" label="Phrase spécifiée avant l'id de l'article" description="Ex. : Modification demandée de l'article n° : "/>
      </fieldset>
   </fields>
</config>
</extension>

Et voila, j'ai quand même passé du temps dessus a trouver des choses qui n'allaient pas.... Mais le plugin tourne désormais