Il y a maintenant 15 jours, je me suis attaqué ou développement d'un petit module pour le CMS Joomla, module sans paramètre, permettant d'afficher sous la forme hierarchisée, l'intégralité des tags enregistrés dans votre Joomla. Je m'intéresse uniquement des tags associés à des articles de JoomlaContent. (je ne parlerai pas donc des tags K2, JEvent ou autre composants)

Avec une formation de programmeur plutôt procédural, je dois avouer que les concepts objet ne sont pas du tout mon fort, et j'ai dû faire face à pas mal d'interrogation, grâce notamment au groupe Lorraine, dont les développeurs m'ont aidé à comprendre des concepts, qui m'ont permis d'arriver au résultat que je vais vous présenter.
Petite note à tout les puristes qui vont lire cet article : je vous rappelle que je ne connais absolument pas grand-chose en programmation objet, je ne connais que quelques concepts. En revanche je suis ouvert à tout commentaire.
Dans cet article que je vais donc vous présenter cet affichage sous la forme d'un arbre simple, c'est-à-dire des listes à puce intégrées les unes aux autres.
Le gros point faible je trouve dans la programmation objet, c'est que nous avons besoin d'une multitude de fichiers différents pour se conformer au développement en couches. Même si je comprends le concept, même si je comprends la façon de faire, même si je suis entièrement d'accord avec toute la théorie, je trouve particulièrement pénible et fatiguant de jongler entre les différentes les différentes couches !
Pour les débutants comme moi qui ne comprennent pas de quoi je parle dans les couches, il s'agit de différencier la partie données, la partie interface graphique, et de fabriquer une troisième partie on pourrait symboliser comme ciment de l'ensemble des fonctions. C'est troisième partie qui permet de relier les différentes couches entre elles.
Dans notre cas, les couches vont être des fichiers différents, chacun d'entre eux ayant sa propre fonctionnalité technique, dont voici la présentation.

Un fichier XML

À partir de fichier existant, j'ai fabriqué ce fichier XML dans lequel nous retrouvons de grandes familles d'informations, des métadonnées comme le nom des modules, son auteur, sa version, une description. Parallèlement à ces métadonnées, nous allons rester dans une deuxième partie, l'ensemble des fichiers composants le module que nous sommes en train d'écrire. 
 
Description du module grâce à un fichier XML
 
Comme vous pouvez le voir sur la copie d'écran, dans la balise files, nous allons chaque fichier mis les uns en dessous des autres. L'ensemble de ces fichiers formant le module, on va se référer à ce fichier XML pour savoir de quoi il en retourne.
Sur cet exemple précis, nous voyons un premier fichier XML, c'est-à-dire ce fichier présentement de description compose d'une description, c'est-à-dire à la fois la partie graphique, la partie programme, ainsi qu'une template simple de mon module.
Je vous passe la description de chacune des balises utilisé dans mon fichier XML, vous comprendrez facilement ce que veut dire même, auteur, version, description ainsi que file si vous êtes un tant soit peu anglophones.
 

Capture décran 2021 02 08 à 21.18.53

Le fichier Helper

Grâce à un groupe joomia lorraine sur Facebook, j'ai compris la définition du terme Helper. Suite à ma question "c'est quoi un fichier Helper", un développeur joomla m'a répondu que c'était une classe générique permettant de répertorier des fonctions utiles partout et qui ne sont pas liées à des vues ou actions."
Du coup, le développeur souligne le fait mais cela tombe sous le sens, c'est une classe statique pouvant être appelée de n'importe où. On peut donc voir un fichiers helper comme une trousse à outils, dans laquelle nous allons piocher les outils dont nous avons besoin au moment où ce besoin se présente. Pour celles et ceux qui comme moi ne maîtrisent pas entièrement encore la programmation objet, le développeur souligne qu'un fichier helper n'a pas besoin de sa classe pour être instanciée puisqu'elle est statique.
Dans l'exemple que je vous propose, je crée une méthode qui s'appelle getHello() - je dois vous avouer que j'ai travaillé à partir d'autres fichiers qui comportent ce nom, le nom de cette méthode n'est donc pas logique -, méthode qui dans notre cas va récupérer des informations issues de ma base de données afin de les afficher.
Comme nous sommes en programmation objet avec différentes couches bien séparées, ces informations, une fois récupérées, je ne devrais pas les afficher directement, mais les balancer dans une vue. (je ne l'ai pas fait ici)
Je vais donc dans un premier temps, récupérer ces informations. Cette action s'effectue par l'ensemble de ma classe GetHello(). Une fois ces informations récupérées dans un curseur, c'est-à-dire un espace mémoire où je récupère toutes les informations issues de ma base de données, je vais les afficher.
Je parcours donc mon curseur de résultats, et pour chacun d'entre eux, je vais rechercher la propriété level , propriété affichant le niveau du tags. Je compare si ce niveau est supérieur ou inférieur au niveau lu précédemment dans ma boucle. Dans la mesure où j'affiche mes tags dans des listes à puce imbriquées, je dois pouvoir détecter si mon élément courant je suis en train de lire est au même niveau que le précédent, s'il est enfant du précédent, ou bien s'il est parent du précédent, afin de pouvoir organiser les <ul> et <li>.
Pour pouvoir faire le faire, étant donné que nous sommes dans une boucle, j'utilise une variable tampon qui stocke le niveau de l'élément précédent, cette valeur et en stocker dans la base de données, afin de pouvoir dans cette même boucle, comparer si l'élément courant est fis où ancêtre de l'élément lu précédemment.
En fonction du cas, je crée une liste à puce enfant où je reviens au niveau parents dans ma liste, symbolisé dans mon code par l'affichage de <il> ou</ul>.
Désormais que j'ai la liste des tags lus depuis ma base de données, je dois, pour chacun d'entre eux, lui affecter un lien permettant, lorsque l'utilisateur cliquer dessus, au programme joomia de relier les enregistrement taggés avec ce tag. J'ai codé ici l'adresse url en récupérant l'adresse courante à partir des variables d'environnement serveur que PHP nous donne. Je me suis inspirée des url fourni dans Joomla à partir d'un tag.
 <?php
public static function getHello($params) {
// Obtain a database connection

$db = JFactory::getDbo(); // Retrievetheshout
$query = $db
  ->getQuery(true) //retourne un nouvel objet avec TRUE
  ->
select($db->quoteName('title')) //Nomdu champs ds laBDD
  ->from($db->quoteName('joomla_tags')) //nom de la table
  ->order('path ASC');

$db- >setQuery( $query);
$column = $db- >loadColumn();
$t = $db->loadRowList();
echo '<div class="hashtags" >' ;
echo '<div style="background-color: yellow;color:red;border:2px solid blue;">Plan des hashtags</div>';
$result = $db->loadObjectList();
echo "<ul>";
$sav_niveau=0;
for ($i=0;$i<count($result) ; $i ++) {
  if ($result[$i]->level < $sav_niveau){
 echo "</ul>"; 
}
  if ($result[$i]->level > $sav_niveau){
        echo "<ul>";
  }
   // "calcul de l'URL du lien à mettre
     $URL = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE?'http' : 'https';
   $URL .= "://". $_SERVER['HTTP_HOST'];
   $URL . = $_SERVER['SCRIPT_NAME'] ;
   $URL . = $_SERVER['QUERY_STRING'] ;
   $URL .= "/component/tags/tag/";
   echo '<li><a href="'.$URL.$result[$i]->alias.'">'. $result[$i]->title.' ('.$result[$i]->level.')</a></li>';
   $sav_niveau=$result[$i]->level ;

   $sav_niveau=$result[$i]->level ;
   }
   echo "</ul>";
   echo "</div>";
}
}
?>

Le fichier tmpl/default.modTree.php

Afficher permet le point d'entrée du mobile. Je ne vous cacherai pas que c'est un simple copier-coller adapté avec, que je n'ai pas touché. À priorie, ce fichier permet de définir une variable à jumia, intégrer le fichier Helper.php, et de définir cake paramètres ainsi que afficher le layout.
<?php 
// Nodirect access 
defined('_JEXEC') or die;// Include the syndicate functions only once 
require_once dirname(__FILE__) . '/helper.php';
$hello = modHelloWorldHelper::getHello($params);
require JModuleHelper::getLayoutPath('mod_treeTags'); 
?>

Le fichier modèle

Dans mon répertoire de modèle, qui s'appelle TMPL, nous allons créer le fichier par défaut intitulé default.php.
Un fichier défini _JEXEC, correspondant à un point d'entrée sécurisée dans le code de joomia. 
<?php 
// Nodirect access 
defined('_JEXEC') or die;// Include the syndicate functions only once 
require_once dirname(__FILE__) . '/helper.php';
$hello = modHelloWorldHelper::getHello($params);
require JModuleHelper::getLayoutPath('mod_treeTags'); 

Mon Github

slhuilli1's GitHub repositories