Aujourd'hui, dans cet article, je vous propose la génération et à création de "double-plugin", dont la/les fonctionnalité(s) principale(s) est d'aller rechercher sur l'intégralité des articles contenus dans un Joomla, des éléments, pour en générer "une synthèse".
{tab title="First Tab"}
<ul>
<li>{tip title="[[[tiptitreapropos]]]" content="<span class="fic-auteur">[[[auteur]]]</span>: Marcel DUCHEMIN<br/><span class="poids-fichier">[[[poids]]]</span>13 Mo<br/><span class="fic-date">[[[date]]]</span> : 08/01/2014"}
</ul>
{tab title="Second Tab"}
{/tabs}
Ma problématique
- le premier est en ouverture d'un Tab, {tab}
- le deuxième étant la fermeture de l'ensemble des tabs.
Dans chacun de mes onglets, j'ai en plus une liste à puce avec l'ensemble des liens hypertextes vers mes fichiers PDF à télécharger, accompagné de quelques fioritures comme des phylactères dans lesquels je mentionne :
- le poids du fichier,
- l'auteur du fichier
- sa date de création.
Ce code ressemble donc à ca pour UN lien donné :
<li>{tip title="[[[tiptitreapropos]]]" content="<span class="fic-auteur">[[[auteur]]]</span>NomAuteur<br /><span class="poids-fichier">[[[poids]]]</span> : 20Mo<br /><span class="fic-date">[[[date]]]</span> : 20/05/2021"} <a href="/toto.pdf" target="_blank">Libellé<span class="ref-interne-seo">50254</span></a></li>
Fonctionnalités de mon plugin
Principe de fonctionnement de la synthèse
- La première condition est en fait une simple requête SQL dont le but est de récupérer pour chacun des articles publiés, le titre de l'article, son numéro au cas où, ainsi que le champ introtext de Joomla content. C'est à partir de ce contenu de ce champs que nous allons extraire au moyen de regex les informations dont nous avons besoin.
- La deuxième condition, vous l'aurez sans doute deviné, et de regarder que notre article comporte des balises de synthèse, ces fameuses balises dans lequel nous allons spécifier un ensemble d'informations, qui vont servir à la fois à l'affichage de ce contenu dans l'article, mais aussi à la possibilité de générer des synthèses. Sur le plan pratique, j'ai utilisé exactement le même formalisme que celui que nous utilisons traditionnellement dans les il plugin joomla :
- Le type du fichier (ici "fichier-kit")
- La taille du fichier avec l'unité de mesure
- L'auteur du fichier (généralement issu des méta données du fichier, extaction "manuellle")
- l'URL relative du fichier
- Un libellé pour mettre entre les <a> ET </a>
- La référence interne
- je définis une chaîne de caractères que l'on pourrait assimiler à un champ de base de données (Ex : auteur)
- Je saisis un séparateur. j'ai utilisé ici le double point (:). (Ex. : sébastien LHUILLIER)
Un double short code
Shortcode de définition de lien
- le type de document que nous souhaitons rendre téléchargeable,
- son poids que l'on peut aussi appeler sa taille en octet ou dans un multiple de cette valeur,
- un auteur de document,
- sa date de création,
- et bien entendu l'URL relative vers le document,
- un libellé pour l'hyperlien (ce qui sera entre <a...> et </a> de manière à ne pas afficher le nom du fichier mais bien un texte autre permettant à l'utilisateur de donner une information libre sur ce lien,
- et une dernière information qui est très importante dans notre cadre métier, et la référence (interne) de la documentation. Cette référence n'a aucun lien avec des informations techniques liées à Joomla ou à de la programmation, cette référence est tout simplement un code interne documentaire. Nous pourrions l'assimiler, par exemple, pour un supermarché, à un code-barre.
Shortcode de synthèse
SELECT id,title,introtext FROM `#__content` WHERE `introtext` LIKE '%{synthese-un-fichier%' and state=1Evolution ?
Code du plugin
formatfichier.php
<?php
/**
* Avec ce plugin, le contenu d'un fichier doit être déclarer AINSI : {un-fichier|type:tckit|taille:20 Mo|auteur:Sébastien LHUILLIER|date:20/09/2013|url:__DOCUMENT/fic.pdf|libelle:ceci est le libellé du fichier|ref-interne:39054-4}
*/
defined('_JEXEC') or die('Access deny');
class plgContentFormatFichier 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){
$doc = JFactory::getDocument();
$doc->addStyleSheet('plugins/content/formatfichier/style.css');
/**********************************************
* 1. Cette premiere partie ci-dessous permet de remplacer DANS L'ARTICLE la déclation du fichier sous la forme :
* {un-fichier|type:tckit|taille:20 Mo|auteur:Sébastien LHUILLIER|date:20/09/2013|url:__DOCUMENT/fic.pdf|libelle:ceci est le libellé du fichier|ref-interne:39054-4}
* en liste <li> utilisée dans le modele de fiches .
* 2. Afin de pouvoir lancer une requete avec la recherche, le prefixe toutes les balises par {synthese
**/
$re = '/\{synthese-un-fichier.*type:(.*)\|taille:(.*)\|auteur:(.*)\|date:(.*)\|url:(.*)\|libelle:(.*)\|ref-interne:(.*)\}/mi';
$str = $article->text;
$subst = "{tip title=\"[[[tiptitreapropos]]]\" content=\"<span class=\"fic-auteur\">[[[auteur]]]</span>: $3<br /><span class=\"poids-fichier\">[[[poids]]]</span> : $2<br /><span class=\"fic-date\">[[[date]]]</span> : $4\"}<a href=\"$5\" target=\"_blank\">$6<span class=\"ref-interne-seo\">$7</span></a>{/tip}<span class=\"poids-fichier\">$2</span>";
$article->text = preg_replace($re, $subst, $article->text);
/****************************************************************************************************
* 3. Cette deuxieme partie permet de récupérer la synthese des fichiers de tout JOOMLA déclarés comme ci-dessus
* pour en sortir une liste SANS DOUBLONS D'URL (on se base sur les contenus des fiches mais filtrés pour l'afficher
* qu'une seule fois les donnés pour une URL donnée
****************************************************************************************************/
$sql = "SELECT id,title,introtext FROM `#__content` WHERE `introtext` LIKE '%{synthese-un-fichier%' and state=1";
$db = JFactory::getDBO();
$db->setQuery($sql);
$articles = $db->loadObjectList();//retourne un array
/**************************************
* 4. Je déclare un tab ou je vais stocker par type, les résultats trouvés dans les articles
******************************************************/
$F = array();
$re = '/\{synthese-un-fichier.*type:(.*)\|taille:(.*)\|auteur:(.*)\|date:(.*)\|url:(.*)\|libelle:(.*)\|ref-interne:(.*)\}/mi';
$i=0;
/*****************************************************************************
* Je prends tous les articles un à un rertrournés par la requete SQL pour remplacer le contenu déclaré sous la forme
* {synthese-un-fichier|type:tckit|taille:10 Mo|auteur:Sébastien LHUILLIER|date:20/09/2013|url:__DOCUMENT/fic.pdf|libelle:ceci est le libellé du fichier|ref-interne:39054-4}
******************************************************************************/
//echo "test : ca liste PLUSIEURS articles !!!";
foreach($articles as $unArticle)
{
$str = $unArticle->introtext;
preg_match_all($re, $unArticle->introtext, $matches, PREG_SET_ORDER, 0);
foreach($matches as $M)
{
//Je stocke tous les resulttats dans un array à deux dimensions
$F[$i][0] = $unArticle->id;
$F[$i][0] = $M[0];
$F[$i][1] = $M[1]; //Type de fichier
$F[$i][2] = $M[2]; //Poids
$F[$i][3] = $M[3]; //Auteur
$F[$i][4] = $M[4]; //Date de creation du document
$F[$i][5] = $M[5]; //Lien
$F[$i][6] = $M[6]; //Libellé
$F[$i][7] = $M[7]; //Ref mat (ex : 39052-4)
$F[$i][8] = $M[8]; //VIDE !
$i++;
$article->text = preg_replace($re, $subst, $c);
}
}
//Mise en forme des résultats
foreach($F as $unRes)
{
echo '<div class="un-element-deformate">';
echo '<div class="libelle">'.$unRes[6].'</div>';
echo '<div class="reference">'.$unRes[7].'</div>';
echo '<div class="type">'.$unRes[1].'</div>';
echo '<div class="poids">'.$unRes[2].'</div>';
echo '<div class="date">'.$unRes[4].'</div>';
echo '<div class="auteur">'.$unRes[3].'</div>';
echo '<div class="url"><a href="'.$unRes[5].'" target="_blank">'.$unRes[5].'</a></div>';
echo "</div>";
}
}
}
formatfichier.xml
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="Content">
<name>Format fichier</name>
<author>Sebastien LHUILLIER</author>
<creationDate>Janvier 2023</creationDate>
<copyright>Sébastien LHUILLIER</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><![CDATA[<div style="font-weight:bold;">Afficher les homologations ou non selon les dates en param sous la forme </div>]]></description>
<files>
<filename plugin="formatfichier">formatfichier.php</filename>
<filename>formatfichier.xml</filename>
<filename>style.css</filename>
</files>
<config>
<fields name="params">
<fieldset name="basic">
<field name="Déclaration" type="note" class="alert" label="Déclaration dans vos articles" description="{un-fichier|type:tckit|taille:20 Mo|auteur:Sébastien LHUILLIER|date:20/09/2013|url:__DOCUMENT/fic.pdf|libelle:ceci est le libellé du fichier|ref-interne:39054-4}"/>
</fieldset>
</fields>
</config>
</extension>
style.css
.un-element-deformate .libelle {
float: left;
}
.un-element-deformate .type {
color: red;
float: right;
}
.auteur {
float: left;
text-align: left;
}
.date {
float: right;
}
.un-element-deformate {
border: 2px solid black;
padding: 1%;
margin: 1%;
background-color: lightgray;
}
.un-element-deformate .url a::before {
content: "\1F517";
}
.un-element-deformate .reference {
float: left;
font-weight: bold;
margin-left: 1%;
color: green;
}
