Connexion S'inscrire

Connectez-vous

Login *
Mot de passe *
Se souvenir de moi

Créer un compte

Les champs marqués d'un astérisque (*) sont requis.
Nom *
Login *
Mot de passe *
Vérification mot de passe *
Email *
Vérification email *
Captcha *

Création d'un composant Joomla (partie 29) Plugin de recherche


Dans cette partie, nous allons créer un plugin de recherche pour le composant com_djguitariste pour que les guitaristes apparaissent dans les résultats de recherche. Sans ce plugin, les recherches faites sur le site ne tiendront pas compte des données de notre composant. Le tutoriel est fait comme une suite à la série de tutoriels sur la création de composant Joomla mais vous pouvez l'appliquer à n'importe quel autre composant que vous voulez. Cliquez ici si vous aimeriez commencer depuis le début.

1 - Introduction

Par défaut, Joomla ne fait pas de recherche dans les composants tiers sauf ceux qui ont un plugin de recherche. C'est ce que nous allons faire dans ce tutoriel pour notre composant com_djguitariste. À la fin de ce tutoriel, nous allons créer un fichier d'installation pour le plugin.

2 - Structure

Les plugins sont dans le dossier plugins qui est à la racine de votre site Joomla. En général un plugin sert à étendre les fonctionnalités d'un composant et ils sont rajoutés dans le repertoire portant le nom du composant. Voici l'image du contenu du dossier plugins:

Donc content est le dossier qui va contenir les plugin de com_content et search de com_search... Dans le présent tutoriel, c'est le dossier search qui nous intéresse.

Dans le dossier search, nous allons ajouter un nouveau dossier nommé djguitariste (le nom de notre composant). Tout plugin a besoin d'au moins deux fichiers. Un fichier PHP et un fichier XML portant le même nom que le dossier (dans notre cas djguitariste.php et djguitariste.xml). Nous ajouterons 2 fichiers de langue plus tard mais pour l'instant commençons par créer ces deux fichier dans le dossier de notre plugin (djguitariste).

3 - Le fichier XML "djguitariste.xml"

C'est le fichier d'installation. La section en haut, comme dans tous les extensions Joomla, présente des détails sur le type d'extension, l'auteur, la date, la version... c'est aussi dans ce fichier que sont définis tous les fichiers et dossiers à charger lors de l'installation du plugin. Il comporte aussi une section config pour définir le formulaire de configuration du plugin. Voici le contenu de notre fichier djguitariste.xml:

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.0" type="plugin" group="search" method="upgrade">
  <name>plg_search_djguitariste</name>
  <author>Docteur Joomla</author>
  <creationDate>December 2017</creationDate>
  <authorEmail>Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.</authorEmail>
  <authorUrl>www.docteurjoomla.com</authorUrl>
  <version>1.0</version>
  <description>PLG_SEARCH_DJGUITARISTE_XML_DESCRIPTION</description>
  <files>
    <filename plugin="djguitariste">djguitariste.php</filename>
  </files>
  <languages>
    <language tag="fr-FR">fr-FR.plg_search_djguitariste.ini</language>
    <language tag="fr-FR">fr-FR.plg_search_djguitariste.sys.ini</language>
  </languages>
  <config>
    <fields name="params">
      <fieldset name="basic">
        <field
          name="search_limit"
          type="text"
          label="JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL"
          description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
          default="50"
          size="5"
        />
        
        <field name="Itemid" type="menuitem"
               class="btn-group" default="0"
               label="PLG_SEARCH_DJGUITARISTE_MENU_ITEM_LABEL"
               description="PLG_SEARCH_DJGUITARISTE_MENU_ITEM_DESC" 
        />
      </fieldset>

    </fields>
  </config>
</extension>

Les fichiers de langue seront rajoutés plus tard mais ils sont déjà définis car ils seront dans le dossier d'installation comme ça nous n'aurons plus besoin de modifier ce fichier après. 

Nous avons deux paramètres de configuration. Le nombre de limite d'éléments à sélectionner et l'Itemid d'un lien de menu sous lequel on veut afficher la page de guitariste à la suite de la recherche. 

4 - Le fichier PHP "djguitariste.php"

Ce fichier étend la classe JPlugin et aura besoin de définir deux méthodes:

onContentSearchAreas : va importer le fichier de langue et définir le texte de label du checkbox qui sera affiché sur la page de recherche pour permettre à l'utilisateur de faire sa recherche uniquement dans la table des guitaristes.

onContentSearch : va prendre les information venant du formulaire de recherche et des paramètres de configuration du plugin pour faire la recherche dans la table des guitariste et retourner les résultats.

Voici le contenu du fichier djguitariste.php:

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

class plgSearchDJGuitariste extends JPlugin
{
  public function onContentSearchAreas()
  {
    JPlugin::loadLanguage('plg_search_djguitariste', JPATH_ADMINISTRATOR);
    
    static $areas = array(
      'djguitariste' => 'PLG_SEARCH_DJGUITARISTE_GUITARISTES'
    );

    return $areas;
  }
  
  public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
  {
    $searchText = $text = trim($text);
    if($text === ''){
      return array();
    }
    
    if (is_array($areas) && !array_intersect($areas, array_keys($this->onContentSearchAreas())))
    {
      return array();
    }
    
    $db     = JFactory::getDbo();
    $app    = JFactory::getApplication();
    $user   = JFactory::getUser();
    $groups = implode(',', $user->getAuthorisedViewLevels());
    
    $section = JText::_('PLG_SEARCH_DJGUITARISTE_GUITARISTES');
    
    $limit  = $this->params->def('search_limit', 50);
    $Itemid = $this->params->def('Itemid');
    
    $nullDate  = $db->getNullDate();
    $date      = JFactory::getDate();
    $now       = $date->toSql();
    
    switch ($phrase)
    {
      case 'exact':
        $text      = $db->quote('%' . $db->escape($text, true) . '%', false);
        $wheres2   = array();
        $wheres2[] = 'a.name LIKE ' . $text;
        $wheres2[] = 'a.intro LIKE ' . $text;
        $wheres2[] = 'a.biography LIKE ' . $text;
        $wheres2[] = 'a.metakey LIKE ' . $text;
        $wheres2[] = 'a.metadesc LIKE ' . $text;
        $where     = '(' . implode(') OR (', $wheres2) . ')';
        break;

      case 'all':
      case 'any':
      default:
        $words = explode(' ', $text);
        $wheres = array();

        foreach ($words as $word)
        {
          $word      = $db->quote('%' . $db->escape($word, true) . '%', false);
          $wheres2   = array();
          $wheres2[] = 'LOWER(a.name) LIKE LOWER(' . $word . ')';
          $wheres2[] = 'LOWER(a.intro) LIKE LOWER(' . $word . ')';
          $wheres2[] = 'LOWER(a.biography) LIKE LOWER(' . $word . ')';
          $wheres2[] = 'LOWER(a.metakey) LIKE LOWER(' . $word . ')';
          $wheres2[] = 'LOWER(a.metadesc) LIKE LOWER(' . $word . ')';
          $wheres[]  = implode(' OR ', $wheres2);
        }

        $where = '(' . implode(($phrase === 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
        break;
    }
    
    switch ($ordering)
    {
      case 'oldest':
        $order = 'a.created ASC';
        break;

      case 'alpha':
        $order = 'a.name ASC';
        break;

      case 'category':
        $order = 'c.title ASC, a.name ASC';
        break;

      case 'newest':
      default:
        $order = 'a.created DESC';
        break;
    }
    
    $return = array();
    
    $query = $db->getQuery(true);
    $case_when  = ' CASE WHEN ';
    $case_when .= $query->charLength('a.alias', '!=', '0');
    $case_when .= ' THEN ';
    $a_id       = $query->castAsChar('a.id');
    $case_when .= $query->concatenate(array($a_id, 'a.alias'), ':');
    $case_when .= ' ELSE ';
    $case_when .= $a_id.' END as slug';
    
    $case_when1  = ' CASE WHEN ';
    $case_when1 .= $query->charLength('c.alias', '!=', '0');
    $case_when1 .= ' THEN ';
    $c_id        = $query->castAsChar('c.id');
    $case_when1 .= $query->concatenate(array($c_id, 'c.alias'), ':');
    $case_when1 .= ' ELSE ';
    $case_when1 .= $c_id.' END as catslug';
    
    $query->select('a.name AS title, a.metadesc, a.metakey, a.created AS created, a.catid')
        ->select($query->concatenate(array('a.intro', 'a.biography')) . ' AS text')
        ->select('c.title AS section, ' . $case_when . ',' . $case_when1 . ', ' . '\'2\' AS browsernav')
        ->from('#__djguitariste_items AS a')
        ->join('INNER', '#__categories AS c ON c.id=a.catid')
        ->where(
          '(' . $where . ') AND a.state=1 AND c.published = 1 AND c.access IN (' . $groups . ')'
            . 'AND (a.publish_up = ' . $db->quote($nullDate) . ' OR a.publish_up <= ' . $db->quote($now) . ') '
            . 'AND (a.publish_down = ' . $db->quote($nullDate) . ' OR a.publish_down >= ' . $db->quote($now) . ')'
        )
        ->group('a.id, a.name, a.metadesc, a.metakey, a.created, a.catid, a.intro, a.biography, c.title, a.alias, c.alias, c.id')
        ->order($order);
    
    
      $db->setQuery($query, 0, $limit);

      try
      {
        $list = $db->loadObjectList();
      }
      catch (RuntimeException $e)
      {
        $list = array();
        JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
      }
      $limit -= count($list);

      if (isset($list))
      {
        foreach ($list as $key => $item)
        { 
          $link = 'index.php?option=com_djguitariste&view=guitariste&id='.$item->slug.'&catid='.$item->catslug.'&Itemid='.$Itemid;
          $list[$key]->href = $link;
        }
      }

      $rows = $list;
      $return = array();
      if(count($rows)){
        foreach($rows as $guitariste){
          if (SearchHelper::checkNoHtml($guitariste, $searchText, array('text', 'title', 'metadesc', 'metakey')))
          {
            $return[] = $guitariste;
          }
        }
      }
      
      return $return;
  }
   
}

5 - Le fichiers de langue 

Nous allons maintenant dans le dossier administrator/language/fr-FR pour créer nos deux fichiers de langue  fr-FR.plg_search_djguitariste.ini et fr-FR.plg_search_djguitariste.sys.ini.

Voici le contenu du fichier fr-FR.plg_search_djguitariste.ini:

; @date        2017-12-21
; @author      Docteur Joomla
PLG_SEARCH_DJGUITARISTE_GUITARISTES="Guitaristes"
PLG_SEARCH_DJGUITARISTE_MENU_ITEM_LABEL="Sélectionnez un élément de menu"
PLG_SEARCH_DJGUITARISTE_MENU_ITEM_DESC="Sélectionnez un élément de menu dont l'Itemid sera utilisé pour afficher les éléments venant de la page de recherche. Ceci permet entre autres d'afficher des modules sur la page."

Voici le contenu du fichier fr-FR.plg_search_djguitariste.sys.ini:

; @date        2017-12-21
; @author      Docteur Joomla
PLG_SEARCH_DJGUITARISTE_GUITARISTES="Guitaristes"
PLG_SEARCH_DJGUITARISTE="DJ Guitariste - Recherche"
PLG_SEARCH_DJGUITARISTE_XML_DESCRIPTION="Ce plugin permet d'afficher les guitaristes dans les résultats de recherches"

6 - Installation

Pour installer le plugin, connectez-vous à l'administration de votre site avec un compte Super Utilisateur.

- Cliquez sur le menu Extension, en suite Gérer et enfin sur Découvrir.

 - Si votre plugin ne s'affiche pas, cliquez sur le bouton découvrir dans la barre d'outils

- Si tout est bon, vous devez avoir un tableau avec les extensions non installées qui sont sur le site (C'est normal que ça soit juste notre plugin).

- Sélectionnez notre plugin et cliquez sur le bouton installer de la barre d'outils. Une fois le plugin installé, cliquez sur le menu Extension->Plug-ins.

- Utilisez le formulaire de recherche pour chercher notre plugin avec les mots clés comme DJ, Guitariste...

- Cliquez sur notre plugin pour le configurer. Choisir un élément de menu pour que son Itemid soit utiliser pour l'affichage des liens de guitaristes sur la page de recherche, sélectionnez Activé pour rendre le plugin actif et cliquez sur Enregistrer.

Voilà maintenant vous pouvez voir des guitaristes dans les résultat des recherches. Vous pouvez chercher des noms de guitaristes pour tester.

7 - Création d'un fichier d'installation

Créez un dossier nommé plg_search_djguitariste.1.0 à l'emplacement de votre choix. Copiez tous les fichiers de notre plugin dans ce dossier. Vous devez avoir les fichiers suivants:

- djguitariste.php

- djguitariste.xml

- fr-FR.plg_search_djguitariste.ini

- fr-FR.plg_search_djguitariste.sys.ini

Faites un clic droit sur ce dossier puis Envoyer vers->Dossier compressé pour que le dossier soit compresser en plg_search_djguitariste.1.0.zip

Et voilà votre fichier d'installation peut être installé dans l'administration de site Joomla mais rassurez-vous que le composant com_djguitariste soit installé sur le site de préférence avant l'installation du plugin. Vous pouvez télécharger le plugin un peu plus bas sur cette page.

Si vous avez des questions, veuillez utiliser le formulaire de contact ou notre page Facebook.

Lire la suite...

 

 


  • Dernière modification le lundi, 05 février 2018 19:09
  • 307