Aujourd'hui, je vous présente l'un des besoins que j'ai dans mon cadre professionnel, la présentation sous la forme tabulaire, d'un type de champs que Joomla 3 appelle type répetable ou repeatable en anglais.
Juste un petit rappel, ce type de champs vous permet de définir un type structuré, qui va pouvoir être répété dans un article par exemple. Et pour celles et ceux qui ne connaissent pas la notion ou la terminologie de type structuré que nous utilisions quand nous étions étudiants dans l'académie Lorraine, (ce formalisme étant un formalisme que tous les enseignants utilisaient pour corriger les copies des développeurs), le type structuré ou structure vous permet de définir un ensemble de champs dans un seul et même élément. Cela ressemble grosso modo pour les développeurs qui connaissent la programmation orientée objet, à une classe dépourvue de ses méthodes.
Comme Joolmla permet la définition de ce type de champ structuré, je l'utilise en définissant 4 éléments, à savoir :
- un titre,
- un demandeur (initiateur du n° de documentation)
- une date,
- une référence ainsi que sa terminologie claire (simplement une chaine de caractere qui explique un contenu)
En d'autres termes, ce dernier élément est une description compréhensible par n'importe quel lecteur.
Ma problématique
J'essaie dans un maximum du possible de réutiliser ou d'utiliser les éléments déjà pré-implémentés dans Joomla. C'est la raison pour laquelle dans ce cadre j'utilise un champ répétable. En terme de répétabilité, je définis donc 5 champs que je souhaite remplir. Je ne rentrerai pas dans les détails techniques de chacun de ces champs notamment sous leur terminologie, mais il s'agit pour chacun d'entre eux de simples champs de type texte. Afin d'effectuer un contrôle de saisie, j'ai affecté un filtre texte pour chacun de ces champs.
Ces éléments, je les affecte donc à une catégorie spécifique dans mon Joomla, cette catégorie ayant pour but de suivre une numérotation documentaire, nommée suivi de numérotation. Ainsi lorsque je vais créer un nouvel article de type suivi de numérotation, je vais pouvoir rajouter l'ensemble des numéros que je dois attribuer.
Voilà pour la définition de l'article, je souligne aussi le fait que comme j'utilise un champ réputable, je n'aurais qu'à gérer un seuil article dans lequel je vais pouvoir remplir ces informations. Sans rentrer dans les détails poétique de notre organisation, ce type d'article n'est utilisable et accessible uniquement par son auteur, c'est-à-dire l'administrateur du site. Dans notre politique de gestion, c'est administrateur du site qui doit attribuer des numéros de documentation. C'est la raison pour laquelle l'article dans lequel je vais affecter cette catégories ne sera accessible qu'à administrateur du site.
Dans un deuxième temps, une fois la définition des champs effectués, je dois donc créer mon fameux article dans lequel je vais pouvoir lister et intégralité de mes numérostation.
Cette liste va se présenter sous la forme d'un tableau, que je n'ai pas voulu lui appliquer des filtres de tri car il faut rentrer dans du javascript c'est une technologie que je ne maîtrise pas ( et dont j'ai une sainte horreur).
Définition des champs
Comme vous pouvez le voir sur la copie d'écran suivante, j'ai défini les champs de la manière suivante.
Création de l'article
Une fois de plus, je vous colle une copie d'écran de ce que j'ai dans ma console d'administration pour pouvoir ajouter des informations. Je ne rentre pas dans le détail, nous sommes encore une fois dans du Joomia pur. J'utilise le shortcode que je me suis définis : {affichersuivi}
Un plugin
Étant de moins en moins fan du développement de module car je les trouve relativement lourds à administrer, j'ai développé un petit plugin, (qui de plus se développe beaucoup plus rapidement qu'un module), qui vous permet d'impliquer et d'intégrer dans votre propre article d'ailleurs, le champ qui vous permet d'afficher l'ensemble des suivis de numérotation.
Comme à mon habitude, je vous spécifie ci-dessous le code que j'ai créé pour fabriquer ce plugin. Afin de l'utiliser, dans mon article, j'ai choisi le short tag {affichersuivi} afin d'appliquer et d'afficher le suivi documentaire dans l'article dédié à cette fonctionnalité. J'ai donc mieux plugin qui joue le rôle d'affichage, que vous pouvez télécharger ci-dessous.
suivi.xml
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="Content">
<name>Suivi des demandes de n° de doc matériels</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>Suivi de la gestion des demandes de n° de doc matériels</description>
<files>
<filename plugin="suivinromat">suivinromat.php</filename>
<filename>suivinromat.xml</filename>
<filename>style.css</filename>
</files>
</extension>
suivi.php
<?php
defined('_JEXEC') or die('Access deny');
class plgContentSuivinromat 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){
$document = JFactory::getDocument();
$re = '/{affichersuivi}/m';
$subst = "TOTOTOTOT";
$document->addStyleSheet('plugins/content/suivinromat/style.css');
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
$customFields = FieldsHelper::getFields('com_users.user', JFactory::getUser(), true);
$a = FieldsHelper::getFields('com_content.article', $article);
foreach($a as $ligne)
{
if ($ligne->title == "Suivi de numerotation")
{
$json = $ligne->rawvalue; //retourne un JSON
$T = array();
$T = json_decode($json, true);
echo '<table class="tab-suivi-nro-mat"><tr>
<th>Titre</th>
<th>Demandeur</th>
<th>Date</th>
<th>CODE</th>
<th>DESCRIPTION</th>
<th>Type</th>
</tr>';
foreach ($T as $UneLigne)
{
echo '<tr> <td>'.$UneLigne["Ttire"].'</td>
<td>'.$UneLigne["Demandeur"].'</td>
<td>'.$UneLigne["Date"].'</td>
<td>'.$UneLigne["CODE"].'</td>
<td>'.$UneLigne["DESCRIPTION"].'</td>
<td>'.$UneLigne["Type"].'</td>
</tr>';
}
echo "</table>";
}
}
$article->text = preg_replace($re, $subst, $article->text);
}
}
?>
style.css
.tab-suivi-nro-mat tr th {
font-weight: bold;
text-align:left;
}
.tab-suivi-nro-mat {
border: 4px solid red;
padding:5%;
width: 100%;
}
.tab-suivi-nro-mat tr td {
text-align: left;
margin-right: 1%;
}
.tab-suivi-nro-mat tr:nth-child(1n) {
background-color: rebeccapurple;
color: white;
}
.tab-suivi-nro-mat tr:nth-child(2n) {
background-color: linen;
color: black;
}
Cet article ne contient aucune pièce jointe dans la mesure où des données sensibles peuvent etre affichées. Je les ai masquées dans le code ci dessus, à vous de recréer les fichiers :)