Vendredi, 30 Juillet 2010
Création d'un plugin Joomla
Vendredi, 21 Mai 2010 08:24

Nous allons nous intéresser aux plugins du CMS Joomla 1.5. Pour rappel les plugins sont des scripts permettant d'effectuer certaines tâches sur le site comme l'ajout de fonctionnalités ou d'enrichir certaines données.

1. Architecture des plugins

Il existe de base plusieurs types de plugins, chacun s'exécutant à un endroit précis dans Joomla! et pour chacun existe un sous-dossier dans le dossier plugins. La liste est la suivante :

  • authentication : permet l'authentification à Joomla suivant différentes sources, par exemple un compte Google ou plus généralement un compte du site Joomla.;
  • content : permet de modifier ou d'ajouter des fonctions au contenu affiché, par exemple les sauts de page dans Joomla sont gérés de cette façon ;
  • editors : ce sont les différent éditeurs de contenue (éditeur WYSIWYG) ;
  • editors-xtd : permet d'ajouter des boutons supplémentaires aux éditeurs, par exemple celui des sauts de pages ;
  • search : permet la recherche dans les composants, par exemple les articles ;
  • system : permet d'effectuer des actions pendant l'exécution de Joomla ;
  • user : permet d'effectuer des actions en rapport aux utilisateurs, généralement utilisé pour l'identification ou l'enregistrement d'un utilisateur ;
  • xmlrpc : ils permettent d'ajouter des services web (XML-RPC) pour le site Joomla.

Il n'existe, généralement, qu'un seul fichier pour un plugin, que Joomla atteint de la manière suivante :

  1. Joomla cherche le sous-dossier du type de plugin appelé.
  2. Il cherche dedans le fichier appelé plugin.php.
  3. Il exécute le contenu de ce fichier.

L'architecture même des plugins est de faite très simplifiée. Elle est généralement la suivante :

  • TypePlugin/NomPlugin.php : le point d'entré fonctionnel du plugin ;
  • TypePlugin/Nomplugin.xml : le fichier d'installation et contenant les paramètres du plugin.

Il est bon de noter qu'il n'existe pas de plugins dans le backend de Joomla.

2. Plugin de recherche HelloWorld

Terminons ce tour d’horizon en permettant à la fonction de recherche standard de Joomla! de scruter les données gérées par notre nouveau composant. À cet effet, nous devons concevoir un plugin du type search. Au niveau des plugins, il n’y a pas de sous-dossier pour chacun d’eux, mais seulement un sous-dossier par type de plugin comme nous l'avons vu. Nous allons donc travailler dans le sous-dossier [CheminJoomla]/plugins/search puisque c’est un plugin de recherche. Il faut prévoir au minimum un fichier PHP pour la logique de recherche (Listing 1) et le traditionnel fichier XML de description pour l’installateur. Les noms des fichiers doivent dériver du nom du composant qui est ainsi enrichi, les deux fichiers s’appelleront donc hello.php et hello.xml.

Dans notre exemple, nous faisons directement référence au composant com_hello. Comme les autres extensions, les plugins doivent être inscrits dans une table de gestion, qui s’appelle dans ce cas jos_plugins. L’installateur se charge d’ajouter un enregistrement dans cette table. Notre fonction de recherche est assez complète et pourrait être rendue encore plus souple en prévoyant des paramètres.

Le code source qui suit donne une idée des possibilités. Notre composant ne conserve pas trace de la date de création des enregistrements ni du nombre d’accès à chacun d’eux (nous n’avons pas prévu de page des détails). De nombreuses possibilités de recherche restent donc inutilisées ici.

<?php
defined( '_JEXEC'
) or die( 'Restricted access' );

$mainframe->registerEvent(
'onSearch', 'plgSearchHello' );

$mainframe->registerEvent( 'onSearchAreas', 'plgSearchHelloAreas'
);

function &plgSearchHelloAreas()
{

static $areas
= array('hello' => 'Hello');

return $areas;

}

function plgSearchHello(
$text, $phrase='', $ordering='', $areas=null ){

$db =&
JFactory::getDBO();

$user =& JFactory::getUser();

if (is_array(
$areas )) {


if (!array_intersect( $areas, array_keys( plgSearchHelloAreas() ) ))
{


return array();

}

}

$text = trim( $text
);

if ($text == '')
{

return array();

}

$section = JText::_(
'Hello' );

$wheres = array();
switch ($phrase){
case 'exact':

case 'all':

case 'any':

default:


$words = explode( ' ', $text );


$wheres = array();


foreach ($words as $word) {


$word = $db->getEscaped($word);


$wheres2 = array();

$wheres2[] = "LOWER(title) LIKE
'%$word%'";

$wheres2[] = "LOWER(a.language)
LIKE '%$word%'";

$wheres[] = implode( ' OR ', $wheres2
);


}


$where = '(' . implode( ($phrase == 'all' ? ') AND (' : ') OR ('),

$wheres ) . ')';

break;

}

$query =
"SELECT a.*, a.name AS title FROM #__hello AS a"

. "\n WHERE ( $where
)"

. "\n AND published
= '1'"

. "\n ORDER BY a.name
ASC";

$db->setQuery(
$query, 0, 50 );

$rows =
$db->loadObjectList();

foreach($rows
as $key => $row) {


$rows[$key]->href = 'index.php?option=com_hello&view=hello';

}

return $rows;

}

?>

Code source de hello.php
<?xml version="1.0"
encoding="utf-8"?>

<install version="1.5"
type="plugin" group="search">

<name>Search
- Hello</name>

<author>Auteur</author>

<description>Plugin de recherche pour composant com_hello</description>

<files>

<filename plugin="hello">hello.php</filename>

</files>

</install>

Le fichier d’installation hello.xml contient la description des fichiers du plugin

Installez le plugin puis activez-le par la commande Extentions > Gestion des plugins. Vous pouvez essayer de faire chercher un terme n’existant que dans les données du composant. Les deux champs du type et du constructeur sont scrutés dans la base et les résultats affichés dans le masque de résultat de recherche standard de Joomla!.

Ce plugin est volontairement simple. Il faudrait par exemple ajouter un lien dynamique dans les résultats de recherche pour se rendre directement à la vue détaillée de l’enregistrement trouvé. Mais nous n’avons pas prévu dans le composant de vue détaillée et ne pouvons donc pas mettre en place un tel lien.


 
<< Début < Préc 1 2 3 4 5 6 Suivant > Fin >>

Page 1 de 6