Je continue ma liste d'articles sur ce que j'ai écrit durant l'an dernier, afin de vous présenter un nouveau plugin qui fonctionne essentiellement voire quasiment qu'avec Joomla content. Encore une fois, pour bien comprendre ce que je fais, je souligne bien le fait que cet outil n'est utilisé sur un réseau local non connecté à Internet, c'est-à-dire totalement déconnecté de la problématique de spam.
La problématique et donc la suivante : ce plugin vous permet d'afficher un lien sur lequel un lien de type mailto: sur lequel l'utilisateur pourra cliquer pour ouvrir son client de messagerie configuré par défaut sur son ordinateur, afin de transmettre un mail au destinataire de ce lien.
Au niveau de la configuration du plugin, vous avez la possibilité de renseigner quatre informations (qui seront donc le même pour tous les liens) :
- le titre du lien
- le sujet du mail
- le corps du mail
- la phrase spécifié dans l'id de l'article
Il suffit, au moment où vous souhaitez utiliser ce plugin, parlons quand même un petit peu du mode d'emploi, de saisir l'utilisation de ce dernier via le code
{mailidEnreg}monadresseEmail@ monISP.com{/mailidEnreg}
Vous pouvez bien entendu télécharger mon code du réutiliser et l'adapter selon vos besoins.
mailidenreg.php
<?php
defined('_JEXEC') or die('Access deny');
class plgContentMailidenreg extends JPlugin //Concatener à "plg" le nom du groupe (ici Content) puis le nom du plugin ( que l'on trouve ds le XML ligne extension) : plg<Plugin Group><Plugin name>
{
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]; //$this->params->get('email', '');
$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'; //PAS D4ESPACE AU PREMIER CARACTERE !
$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>
tagparser.php
La class tagParser est le fruit de Richey Web
<?php
class TagParser {
private $identifier;
private $openclose = true;
public $tags = false;
public $params = false;
public $content = false;
public function __construct($identifier,$openclose=true) {
$this->identifier = $identifier;
$this->openclose = $openclose;
}
public function parse($content,$contenu) {
// simple search first to capture full tags:
if($this->openclose) {
$regex ='/{'.$this->identifier.'(?<'.$contenu.'>.*?)}'; // open tag and params
$regex.='(?<content>.*?)'; // content if it exists
$regex.='(?</'.$contenu.'>{\/'.$this->identifier.'})/'; // close tag if it exists
} else {
$regex ='/{'.$this->identifier.'(?<params>.*?)}/'; // open tag and params
}
$matches = array();
preg_match_all($regex,$content,$matches);
foreach($matches[0] as $key=>$match) {
$this->tags[$key]=$match;
if(
array_key_exists('params',$matches) &&
array_key_exists($key,$matches['params'])
) {
$params = new DOMDocument;
$params->loadHTML('<br '.trim($matches['params'][$key].' />'));
$paramsxml = simplexml_import_dom($params->documentElement);
foreach($paramsxml->body->br->attributes() as $attribute=>$value) {
$this->params[$key][$attribute]=$value->__toString();
}
}
if(
array_key_exists('closetag',$matches) &&
array_key_exists($key,$matches['closetag'])
) {
$this->content[$key]=$matches['content'][$key];
}
}
}
public function replace($key,$content,$replacement='') {
if(!is_numeric($key)) return;
if(!strlen($content)) return;
$regex='/'.preg_quote($this->tags[$key],'/').'/';
return preg_replace($regex,$replacement,$content,1);
}
}