Conception d’un plugin

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 un sous-dossier pour chacun d’eux, mais seulement un sous-dossier par type de plugin. 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 (voir le Listing 15.26) 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 auto.php et auto.xml. (Pour écrire un plugin de type User, vous décidez des noms des fichiers par rapport à l’objectif du plugin.)

Dans notre exemple, nous faisons directement référence au composant com_auto. 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 par voiture). De nombreuses possibilités de recherche restent donc inutilisées ici.

<?php
defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );
$mainframe->registerEvent( ‘onSearch’, ‘plgSearchAuto’ );
$mainframe->registerEvent( ‘onSearchAreas’, ‘plgSearchAutoAreas’ );
function &plgSearchAutoAreas() {
  static $areas = array(‘auto’ => ‘Auto’);
  return $areas;
}
function plgSearchAuto( $text, $phrase=’’, $ordering=’’, $areas=null ){
  $db =& JFactory::getDBO();
  $user =& JFactory::getUser();
  if (is_array( $areas )) {
    if (!array_intersect( $areas, array_keys( plgSearchAutoAreas() ) )) {
    return array();
  }
}
$plugin =& JPluginHelper::getPlugin(‘search’, ‘auto’);
$pluginParams = new JParameter( $plugin->params );
$limit = $pluginParams->def( ‘search_limit’, 50 );
$text = trim( $text );
if ($text == ‘’) {
  return array();
}
$section = JText::_( ‘Auto’ );
$wheres = array();
switch ($phrase){
  case ‘exact’:
    $text = $db->getEscaped($text);
    $wheres2 = array();
    $wheres2[]= "LOWER(a.type) LIKE ‘%$text%’";
    $wheres2[]= "LOWER(a.constructeur) LIKE ‘%$text%’";
    $where = ‘(‘ . implode( ‘) OR (‘, $wheres2 ) . ‘)’;
  break;
  case ‘all’:
  case ‘any’:
  default:
    $words = explode( ‘ ‘, $text );
    $wheres = array();
    foreach ($words as $word) {
      $word = $db->getEscaped($word);
      $wheres2 = array();
      $wheres2[] = "LOWER(a.type) LIKE ‘%$word%’";
      $wheres2[] = "LOWER(a.constructeur) LIKE ‘%$word%’";
      $wheres[] = implode( ‘ OR ‘, $wheres2 );
    }
    $where= ‘(‘ . implode( ($phrase == ‘all’ ? ‘) AND (‘ : ‘) OR (‘),
    $wheres ) . ‘)’;
  break;
  }
  switch ( $ordering ) {
    default:
    $order = ‘a.type ASC’;
    break;
  }
  $query = "SELECT * FROM #__auto AS a"
        . "\n WHERE ( $where )"
        . "\n AND published = ‘1’"
        . "\n ORDER BY $order";
  $db->setQuery( $query, 0, $limit );
  $rows = $db->loadObjectList();
  foreach($rows as $key => $row) {
    $rows[$key]->href = ‘index.php?option=com_auto&view=auto’;
  }
  return $rows;
}
?>

Listing 15.26 : auto.php

Le fichier d’installation auto.xml contient la description des fichiers du plugin (voir Listing 15.27).

<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="search">
<name>Search - Auto</name>
<author>Hagen Graf</author>
<creationDate>November 2007</creationDate>
<copyright>(C) 2007 cocoate.com. All rights reserved.</copyright>
<license>GNU/GPL</license>
<authorEmail>hagen.graf@gmail.com</authorEmail>
<authorUrl>www.cocoate.com</authorUrl>
<version>0.1</version>
<description>Plugin de recherche pour composant com_auto</description>
<files>
<filename plugin="auto">auto.php</filename>
</files>
</install>

Listing 15.27 : auto.xml

Installez le plugin puis activez-le par la commande EXTENSIONS > 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! (voir Figure 15.18).

 

Figure 15.18 Exemple d’utilisation du plugin de recherche plu_auto.

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.

Commentaires

Certains plugins peuvent être insérés facilement dans un article en ajoutant un bout de code de ce genre dans l'editeur tinyMCE : {gallery}folder{/gallery}
Sauriez-vous comment définir ce genre de raccourci?
Merci d'avance.

bonjour j obtiens un message d'erreur :
Warning: Invalid argument supplied for foreach() in C:\wamp\www\test_joomla\plugins\search\auto.php on line 90 c'est au niveau du foreach apparemment le $rows n'est pas un tableau, je n arrive pas a résoudre mon problème!!merci d avance