Intro
Aujopurd'hui je vous partage un petit module que j'ai dû écrire dans le cadre de mon travail, afin de pouvoir d'une part prendre en compte les définitions contenues dans un article, mais surtout de pouvoir les recenser à un unique et même endroit. Pour effectuer l'affichage de cette synthèse, dans mon cas, je dédie un artyicle complete spéficique à cette fonctionnalité. Voyons en détail ce fonctionnement...
Philosophie et concept du module
Travaillant dans un cadre technique, mes utilisateurs (tout comme moi d'ailleurs) ne connaissent pas forcément les acronymes techniques, les termes (mots du dictionnaires) employés dans mes articles dans un cadre technique (et oui, le contexte joue beaucoup dans la langue française) et j'ai vite vu la nécéssité de pouvoir synthétiser tout ca dans un article.
Mais vous me connaissez désormaius, j'ai toujours de vieux reflexes merisiens : :une donnée ne doit être définie qu'à un seule endroit. le cas contraire pourrait viter, très vite même (à une virgule près par exemple) engendrer des incohérences des données (vive les CIF ! - Contraintes d'intégrités fonctionnelles).
Applisué à notre cas, je ne voudrais pas avoir un mot à définir dans un article, et avoir un deuxieme article en texte pur où je reprenne le mot et lui donne une definition !
Utilisation et fonctionnement de ce module
Le fonctionnement de ce miodule est super simple sur le principe : après avoir recherché tous les articles publiés (ce qui peut se discuter selon le contexte fonctionnel) de Joomla (personnellement, je n'utilise pas les classes de Joomla mais bien une requete SQL, ce qui me permet de limiter les résultats en fonction de la condition de restriction WHERE), je parcours le curseur retourné. Ma requete SQL prenant en compte la présence du tag de mon plugin dans le champs INTROTEXT, à l'issue de l'execution de ma requele SQL, je suis sûr et certain que mon curseur renferme des articles où des definitions ont été rédigées. (pouyr rappel, un curseur en base de données est un ensemble d'enregistrements)
Le curseur retourné, il ne me suffit plus qu'a le parcourir, élément par éléments, afin, au moyen d'une éxpression rationnelle (regex), d'extraire les informations qui m'interesse.
NOTE : je n'ai abolument rien fait au hasard et me suis appuyé sur deux balises html (version 5) qui donnent un tout petit peut de sémantique à HTML : <dfn> et sa "sous-balise" <abbr>
Reste à votre charge de modifier mon style CSS pour l'adapter à votre code
helper.php
<?php
class modDefinitions{
public static function getDefinitions($params){
$document = JFactory::getDocument()->addStyleSheet("modules/mod_definitions/style.css");
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$sql = "SELECT #__content.id, #__content.title, #__content.introtext
FROM #__content,#__categories
WHERE `introtext` LIKE '%<dfn%'
AND #__categories.id = #__content.catid
and #__content.state=1
ORDER BY #__content.id DESC";
$db = JFactory::getDBO();
$db->setQuery($sql);
$row = $db->loadObjectList();
$str = '<div class="liste-definitions">';
$str .='<div class="titre">'.$params->get("titre").'</div>';
$i=0;
foreach($row as $uneDef)
{
$re = '/<dfn.*>(.*)<\/dfn>.*<abbr.*title\s*?=\s*?"(.*)".*>(.*)<\/abbr>.*<span\s*class\s*?=\s*?"definition">(.*)<\/span>/msU';
preg_match_all($re, $uneDef->introtext, $matches, PREG_SET_ORDER, 0);
foreach($matches as $unMotDefini)
{
/*echo "<pre>";
print_r($unMotDefini);
echo "</pre>";*/
$str .= "<div class=\"glossary-item\">\r\n";
$str .= "\t<span class=\"article-id\">".$uneDef->id."</span>\r\n";
$str .= "\t<span class=\"article-title\">".$uneDef->title."</span>\r\n";
$str .= "\t<span class=\"mot-defini\">".$unMotDefini[1]."</span>\r\n";
$str .= "\t<span class=\"abbreviation\">".$unMotDefini[3]."</span>\r\n";
$str .= "\t<span class=\"definition\">".$unMotDefini[4]."</span>\r\n";
$str .= "</div>";
}
}
$i++;
$str.= '</div>';
echo $str;
}
}
?>
mod_definitions.php
<?php
defined('_JEXEC') or die;
require_once dirname(__FILE__).'/helper.php';
$hello = modDefinitions::getDefinitions($params);
require JModuleHelper::getLayoutPath('mod_definitions');
mod_definirtion.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1.0" client="site" method="upgrade">
<name>Définitions</name>
<author>sebastien lhuillier</author>
<version>1.0.0</version>
<description>Module recherchant dans la documentation l'ensemnle des mots définis.</description>
<files>
<filename>mod_definitions.xml</filename>
<filename module = "mod_definitions">mod_definitions.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
</files>
<config>
<fields name="params">
<fieldset name="basic">
<field name="titre" type="text" default="" label="Titre à afficher" description="" size="10" />
</fieldset>
</fields>
</config>
</extension>
style.css
.glossary-item {
display: flex;
border-bottom: 1px solid white;
padding: 1.5rem 0;
}
.glossary-item dd,
.glossary-item dl {
display: flex;
flex-direction: row;
}
.glossary-item dd {
flex: 3;
}
.glossary-item dl {
flex: 1;
margin-right: 1rem;
}
dd,
dl,
a,
code,
p {
font-size: 1rem;
}
code {
display: inline;
padding: 0 0.125rem;
font-family: monospace;
}
.article-title{
color:red;
font-size:110%;
font-weight:bold;
display:none;
}
.liste-definitions .glossary-item .article-id{
color:red;
}
.liste-definitions .glossary-item .article-id:before{
content:"Article ";
}
.liste-definitions .glossary-item .mot-defini{
font-weight:bold;
padding-left:2%;
padding-right:2%;
}
.liste-definitions .glossary-item .abbreviation::before {
content: "Abbr : ";
font-style: italic;
}
.liste-definitions .titre {
color: white;
font-size: 250%;
text-align: center;
border: 2px solid red;
padding: 2%;
background-color: red;
font-weight: bold;
border-radius: 20px;
}