Nouveauté : des plugins Joomla

Nouveauté pour le développeur uniquement. Car les plugins, ca existe depuis bien longrtemps.

Difficile de placer ce nouvel article dans mon site internet consacré à mes activités, temps la question de positionnement dans une catégorie est délicate. Je viens donc de créer une catégorie plugin mais vais-je en réécrire plus tard ? Poru l'instant je ne sais pas... Ne soyez pas à l'affût de codes de plugins de ma part :)

Mais en voyant la puissance des plugins Joomla, je pense que de nouveaux plugins verront le jour mais uniquement en fonction de mes besoins... C'est la raison pour laquelle je viens d'ouvrir cette nouvelle rubrique consacrée aux plugins. Toutefois, je ne suis pas du tout professionnel de tous ces langages événementiels, je connais leurs principe de fonctionnemeent, je sais comment cela fonctionne mais ne suis actuellement pas un adepte de ce genre utilisation. Ce n'est pas mes 5 ou 6 ans de Delphi qui m'ont fait un professionnel de cette manière de voir. (Bon je me confesse : j'ai aussi fait de l'Hypertalk. Désolé de vous décevoir...)
Cependant, après lecture de la documentation, je pense que je vais véritablement me mettre tant la puissance de l'outil est fabuleuse !! 
 

Commençons par définir le rôle de l'outil plugin dans le Joomla et à quoi il sert.

Dans le CMS Joomla, on appelle un plugin un composant logiciel qui répond à des événements récupérés par le "cœur" (core) de Joomla. Ces événements peuvent être de plusieurs ordres : les événements sont pré-définis par les développeurs de Joomla, et finalement nous ne faisons que les utiliser.
Je ne vais pas vous lister l'intégralité des événements prévus dans le Joomla, je vous conseille simplement de jeter un œil sur la page qui les définit
 
Vous pourrez vous rendre compte qu'une grande diversité d'événements existe dans Joomla. Vous pouvez, selon l'action souhaitée par votre utilisateur, lancer une action qui vous est propre, au travers de votre plugin, en l'affectant sur "l'interruption évènementielle" de votre choix. Pour celles et ceux qui ont développé sur Delphi ou encore Visual Basic, c'est ce que l'on appelle des événements, ceux qui commencent par On comme OnClick. J'insiste sur ce parallèle fort intéressant car il m'a permis de comprendre la philosophie des plugins.
 
Si je résume, je choisis les événements sur une action qui sera lancée, et en fonction de cet événement j'écris mon propre code que je souhaite lancer.
Dans l'exemple que je vous propose d'étudier, un exemple dont j'ai un véritable besoin, l'événement sur lequel nous allons travailler s'appelle oncontentebeforedisplay.
Si nous traduisons cet événement, il s'agit du moment où le contenu est connu par le coeur de Joomla, alors qu'il n'est encore pas affiché sur l'écran de l'utilisateur. A priori, c'est un événement qui est très couramment utilisé. Notons que dans cet événement, 4 paramètres existent que vous pouvez récupérer pour travailler avec. Il s'agit :
  • du contexte,
  • de l'article,
  • de parametre que l'on récupère dans l'action
  • ainsi qu'une limite

Nous reverrons en détail les trois premiers paramètres. N'ayant pas (encore) utilisé le 4e, je ne peux rien dire...

La structure de votre plugin.

Joomla propose de classifier vos plugins selon plusieurs (8) catégories :
  1. Authentification : des plugins en relation avec l'authentification de utilisateur courant
  2. Content : des plugins en relation avec le contenu
  3. Editors : des plugins en relation avec les éditeurs de texte intégrés comme TinyMCE
  4. Editors xtd : des plugins lorsque vous lancez un éditeur particulier.
  5. Extension : des plugins lorsque vous installez, mettez à jour ou désinstallez des extensions
  6. Search : des plugins en relation avec l'action de recherche sur votre site
  7. System : des plugins variés dédiés à l'exécution de commande, de vos sessions, des requêtes de routage, dispatchage et du rendu visuel de vos pages.
  8. User : l'ensemble des plugins lorsque vous créez, éditer ou supprimer des utilisateurs, lorsque ses utilisateurs se loggent où se déloggent de votre site.
Dans l'exemple que je vous propose, vous l'aurez sûrement compris, comme nous allons toucher au contenu des articles. Les plugins devant être "rangés" dans l'arborescence Joomla que je viens de vous détailler, nous allons "ranger" notre plugin dans le sous-dossier content puisque ce plugin est un plugin de contenu.
plugin1
 

L'organisation du répertoire de votre plugin

Tout comme ce que vous pouvez retrouver sur mon site concernant les modules, la structuration du répertoire qui hébergera votre plugin sera exactement la même que celle d'un module Joomla. Nous avons dans notre cas 3 fichiers intéressants et importants que nous allons détailler. Dans mon exemple, à l'habitude de tout informaticien, nous commençons notre premier plugin en l'intitulant Hello World.
 
Nous avons :
  • helloworld.xml : un premier fichier XML qui regroupe à la fois des métadonnées sur le plugin, mais aussi sa structuration et son nom
  • helloworld.php : ce fichier php est le cœur du plugin, c'est dans ce fichier que nous allons écrire la classe qui le compose
  • index.html : le fichier index a comme unique but de protéger l'accès via un navigateur dans le dossier qui contient le plugin. Ce fichier de 6 lignes mais simplement qu'un fichier HTML vide.

Explications

Nous allons donc nous concentrer sur le cœur du plugin au travers du fichier PHP. Encore une fois et comme à ma mauvaise habitude je vais écrire le résultat directement dans ce fichier. Ce dernier de devrait aucunement contenir du HTML mais nous allons le faire afin de comprendre le mécanisme du plugin. Pour mémoire, afin de bien séparer les couches du MVC, nous devrions retourner un tableau de données vers un dernier fichier, qui n'aurait uniquement pour rôle de gérer un affichage. Mais nous ne le feront pas afin de nous concentrer sur la structuration et le fonctionnement d'un plugin Joomla.
Ce fichier contient une méthode principale qui en fait, répond à mes événements d'exécution du code qu'elle contient et à l'affichage de l'article, d'où son nom normalisé par le CMS jumia onContentBeforeDisplay que nous pourrions expliciter comme "ces actions à faire avant d'afficher le contenu de l'article".
 
Je souligne bien le fait que cet événement prend quatre paramètres qui vont nous servir pour réutilisation dans notre code. Il s'agit :
  • du contexte,
  • de l'article,
  • des paramètres que l'on configure dans le plugin,
  • ainsi que limitstart que je n'ai pas utilisé (et donc pour lequel je ne sais pas (encore) à quoi ça sert.

L'ensemble des paramètres passés dans cette méthode est expliqué dans la documentation officielle de Joomla. Je ne reviendrai pas dessus de manière détaillée. Toutefois, il faut comprendre que nous allons nous intéresser au paramètre article car nous allons travailler sur son contenu.

Une fois l'entête de votre méthode écrite, nous allons rentrer dans le code de manière très très simple.
Nous voulons les récupérer deux balises, une ouvrante l'autre fermente, afin de récupérer son contenu.
Vous l'aurez compris nous allons utiliser une expression régulière pour extraire ce contenu balisé. En effet, c'est ce que l'on appelle sur Joomla un shortcode. C'est un court code qui peut prendre ou non à l'intérieur un paramètre. Ainsi le plugin va pouvoir l'exploiter pour en faire ce que l'on souhaite.
 
Le reste de mon exemple étant relativement simple à comprendre je ne vais pas le détailler mais je vais plus tout vous expliquer la philosophie du plugin. Ayez bien en tête que le plugin de conteu "chapeaute" l'article et efectuer le traitement au moment du chargement de l'article dans le navigateur.
 
Lorsque celui-ci va trouver dans un article ou plutôt sur une page (puique le plugin ne chapeaute pas unarticle mais une page), un short tag dénommé Soundcloud est recherché. Le plugin va récupérer le contenu entre la balise ouvrante et la balise fermante de ce shorttag. Ce contenu, qui est en une identification unique d'une playlist Soundcloud,  le contenu trouvé va être substitué au code d'intégration HTML fourni par Soundcloud.
 
Cependant, si nous nous arrêtons à ce code que je viens de vous expliquer, seule la première balise de l'article sera remplacé par l'iframe souhaitée pusique le premier réflexe PHP est d'utiliser preg_match). Il est donc nécessaire, d'utiliser la fonction PHP preg_match_all qui a la particularité de remplacer l'ensemble des expressions régulières rencontrées, contrairement à sa petite sœur preg_match qui ne remplacera de la première expression régulière rencontrée. L'ensemble des shortcodes trouvés dans l'article sont ainsi substituées.
 
Voilà pour le principe de fonctionnement, que j'assimile en fait ni plus ni moins car un rechercher-remplacer dynamique au moment du chargement de article dans la page de votre navigateur.

Alors nous allons résumer les actions :
  • on recherche ce que l'on souhaite modifier dans le contenu de la page, c'est-à-dire une sorte de rechercher remplacer de votre short code
  • on remplace le code par votre code personnalisé qui prend en paramètre un élément intégré au shortcode
Et une fois le remplacement effectué nous retournons le résultat correct au core Joomla, celui-ci ayant pour objet de renvoyer au navigateur et donc à l'utilisateur une page HTML propre avec l'intégrationcorrespondant au short code intégré dans votre article.