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 30) Plugin pour contenu (articles)


Dans cette partie, nous allons créer un plugin pour article (content) pour notre composant com_djguitariste afin de permettre d'ajouter des guitaristes dans un article Joomla. 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

Nous avons dans le précédent tutoriel créé un plugin de recherche dans le dossier plugins/search cette fois si nous allons créer un plugin de contenu (article) dans le dossier plugins/content (pour étendre le composant com_content). Ce plugin va permettre de rajouter des guitaristes dans un article Joomla en utilisant la syntaxe suivante:

{afficherguitariste X}

X étant l'ID du guitariste à afficher. 

2 - Structure et cheminement

Nous allons créer un dossier nommé afficherguitariste dans le dossier plugins/content pour notre plugin. Dans ce dossier, nous allons créer deux fichier afficherguitariste.xml et afficherguitariste.php. Le fichier XML sert de descripteur pour l'installation de notre plugin et contient aussi le formulaire de configuration du plugin. Le fichier PHP contiendra la classe qui s'occupera de lire la syntaxe ({afficherguitariste X}), de récupérer l'ID et d'utiliser le model DJGuitaristeModelGuitariste (guitariste.php) pour récupérer les informations du guitariste. Nous modifierons la méthode getItem() de ce model pour qu'elle supporte aussi le passage de l'ID passé en paramètre à la méthode au lieu de juste le prendre dans l'Url. Nous ajouterons pour finir deux fichiers de langue (fr-FR.plg_content_afficherguitariste.ini et fr-FR.plg_content_afficherguitariste.sys.ini) dans le dossier de langue en administration.

 

3 - Le fichier afficherguitariste.xml

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.0" type="plugin" group="content" method="upgrade">
  <name>plg_content_afficherguitariste</name>
  <author>Docteur Joomla</author>
  <creationDate>Février 2018</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_CONTENT_AFFICHERGUITARISTE_XML_DESCRIPTION</description>
  <files>
    <filename plugin="afficherguitariste">afficherguitariste.php</filename>
  </files>
  <languages>
    <language tag="fr-FR">fr-FR.plg_content_afficherguitariste.ini</language>
    <language tag="fr-FR">fr-FR.plg_content_afficherguitariste.sys.ini</language>
  </languages>
  <config>
    <fields name="params">
      <fieldset name="basic">
        <field
          name="show_category"
          type="list"
          label="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_CATEGORY_LABEL"
          description="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_CATEGORY_DESC"
          default="1"
          >
          <option value="1">JSHOW</option>
          <option value="0">JHIDE</option>
        </field>
        
        <field
          name="show_youtube"
          type="list"
          label="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_YOUTUBE_LABEL"
          description="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_YOUTUBE_DESC"
          default="1"
          >
          <option value="1">JSHOW</option>
          <option value="0">JHIDE</option>
        </field>
        
        <field
          name="show_facebook"
          type="list"
          label="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_FACEBOOK_LABEL"
          description="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_FACEBOOK_DESC"
          default="1"
          >
          <option value="1">JSHOW</option>
          <option value="0">JHIDE</option>
        </field>
        
        <field
          name="show_website"
          type="list"
          label="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_WEBSITE_LABEL"
          description="PLG_CONTENT_AFFICHERGUITARISTE_SHOW_WEBSITE_DESC"
          default="1"
          >
          <option value="1">JSHOW</option>
          <option value="0">JHIDE</option>
        </field>  
      </fieldset>

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

 

4 - Le fichier afficherguitariste.php

Ce fichier PHP est une classe qui étend la classe JPlugin.  Le reste est  basé sur des écouteurs d'évènement qui peuvent varier en fonction du composant principal. Pour le composant com_content, voici la liste des différents évènements qu'on peut écouter :

onContentBeforeDelete, onContentAfterDelete, onContentBeforeDisplay, onContentAfterDisplay, onContentBeforeSave, onContentAfterSave, onContentAfterTitle, onContentChangeState, onContentPrepare.

Donc en fonction des besoin du plugin, on va utiliser ces méthode dans notre classe pour définir les opérations à réaliser. Dans notre cas, nous avons juste un évènement à écouter "onContentPrepare" (le premier niveau à la préparation du contenu). Nous allons aussi ajouter une méthode qui chargera le modèle et utilisera la méthode getItem(ID) pour récupérer les informations du guitariste. Nous chargerons aussi le fichier de langue du composant com_djguitariste dans cette méthode pour éviter de réécrire les mêmes textes dans des fichiers de langue différents.  Voici le contenu de ce fichier:

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

JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_djguitariste/models', 'DJGuitaristeModel');

class plgContentAfficherguitariste extends JPlugin
{
  
  public function onContentPrepare($context, &$article, &$params, $page = 0)
  {
    if(strpos($article->text, 'afficherguitariste') === false){
      return true;
    }
    
    $regex = '/{afficherguitariste\s+(.*?)}/i';
    $article->text = preg_replace_callback($regex, array('self', 'process'), $article->text);
  }
  
  private function process($match){
    $return = '';
    $id = intval($match[1]);
    
    $show_category = $this->params->get('show_category');
    $show_youtube = $this->params->get('show_youtube');
    $show_facebook = $this->params->get('show_facebook');
    $show_website = $this->params->get('show_website');
    
    $language = JFactory::getLanguage();
    $ltag = $language->getTag();
    $language->load('com_djguitariste', JPATH_SITE, $ltag, true);

    if($id){
      $model = JModelLegacy::getInstance('Guitariste', 'DJGuitaristeModel', array('ignore_request'=>true));
      
      $guitariste = $model->getItem($id);
      
      if($guitariste){
        $return .= '<h3>'.$guitariste->name.'</h3>';
        
        if($show_category){
          $return .= '<p class="dg-category">'. JText::_('JCATEGORY').': '. $guitariste->category_title. '</p>';
        }
        
        if($show_youtube && !empty($guitariste->youtube_video)){
          $return .=  '<iframe width="560" height="315" src="https://www.youtube.com/embed/'.$guitariste->youtube_video.'" frameborder="0" allowfullscreen></iframe>';
        }
        
        if($show_facebook && !empty($guitariste->facebook)){
          $return .= '<p><a href="'.$guitariste->facebook.'">'.JText::_('COM_DJGUITARISTE_FACEBOOK').'</a></p>';
        }
        
        if($show_website && !empty($guitariste->website)){
          $return .= '<p>'. JText::_('COM_DJGUITARISTE_WEBSITE').' : '. $guitariste->website. '</p>';
        }
        
        $return .= '<h4>'. JText::_('COM_DJGUITARISTE_BIOGRAPHY') .'</h4>';
        $return .= '<div>'.$guitariste->biography.'</div>';
        
        return '<div class="guitariste">'.$return.'</div>';
      }
      else{
        return '';
      }
    }
  }
  
}

 

5 - Modification de la méthode getItem() du modèle  DJGuitaristeModelGuitariste (guitariste.php)

Dans la méthode process(), nous voulons récupérer les informations du guitariste par la ligne suivante:

$guitariste = $model->getItem($id);

Cependant la méthode getItem() ne prenait pas de paramètre jusqu'à présent. Donc nous allons nous rendre dans le fichier de modèle guitariste.php pour faire les modifications nécessaire afin que cet appel puisse fonctionner correctement. Voici le contenu du fichier guitariste.php (les modifications sont en couleur) :

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

class DJGuitaristeModelGuitariste extends JModelItem
{
  
  public function getItem($id = null)
  {
    $app = JFactory::getApplication();
    
    if(!$id){
      $id = $app->input->getInt('id');
    }
    
    $db = $this->getDbo();
    $query = $db->getQuery(true);
    $query->select('a.*');
    $query->from($db->quoteName('#__djguitariste_items'). ' AS a');
    $query->where('a.id = '.$id);
    
    //Jointure avec catégorie
    $query->select('c.title AS category_title');
    $query->join('LEFT', $db->quoteName('#__categories').' AS c ON c.id = a.catid');
    
    //Sélection du nom l'auteur
    $query->select("CASE WHEN a.created_by_alias > '' THEN a.created_by_alias
                    ELSE ua.name END AS author");
    $query->join('LEFT', $db->quoteName('#__users').' AS ua ON ua.id = a.created_by');
                    
    
    $dateNull = $db->Quote($db->getNullDate());
    $now = $db->Quote(JFactory::getDate()->toSql());
    $query->where('(a.publish_up = '. $dateNull .' OR a.publish_up <= '.$now.')');
    $query->where('(a.publish_down = '. $dateNull .' OR a.publish_down >= '. $now.')');
    
    $query->where('a.state = 1');
    
    $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';
    $query->select($case_when);
    
    $case_when2 = ' CASE WHEN ';
    $case_when2 .= $query->charLength('c.alias', '!=', '0');
    $case_when2 .= ' THEN ';
    $c_id = $query->castAsChar('c.id');
    $case_when2 .= $query->concatenate(array($c_id, 'c.alias'), ':');
    $case_when2 .= ' ELSE ';
    $case_when2 .= $c_id.' END as catslug';
    $query->select($case_when2);
    
    $db->setQuery($query);
    $result = $db->loadObject();
    
    return $result;
  }
  
}

6 - Les fichiers de langue

Nous allons ajouter 2 fichiers de langue (fr-FR.plg_content_afficherguitariste.ini et fr-FR.plg_content_afficherguitariste.sys.ini) dans le dossier administrator/language/fr-FR/ .

fr-FR.plg_content_afficherguitariste.sys.ini va contenir :

; @date        2018-01-29
; @author      Docteur Joomla!

PLG_CONTENT_AFFICHERGUITARISTE="Contenu - Afficher un Guitariste"
PLG_CONTENT_AFFICHERGUITARISTE_XML_DESCRIPTION="Système d'affichage de guitariste dans des contenus en interprétant la syntaxe suivante : {afficherguitariste X}
Remplacez la valeur X par l'ID du guitariste souhaitée. Exemple pour le guitariste qui a l'ID 1 : {afficherguitariste 1}."

 

Et fr-FR.plg_content_afficherguitariste.ini aura comme contenu :

; @date        2018-01-29
; @author      Docteur Joomla!

PLG_CONTENT_AFFICHERGUITARISTE="Contenu - Afficher un Guitariste"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_CATEGORY_LABEL="Catégorie"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_CATEGORY_DESC="Afficher ou masquer la catégorie"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_YOUTUBE_LABEL="Youtube Player"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_YOUTUBE_DESC="Afficher ou masquer le player Youtube"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_FACEBOOK_LABEL="Facebook"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_FACEBOOK_DESC="Afficher ou masquer le lien Facebook"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_WEBSITE_LABEL="Site Web"
PLG_CONTENT_AFFICHERGUITARISTE_SHOW_WEBSITE_DESC="Afficher ou masquer le site web"
PLG_CONTENT_AFFICHERGUITARISTE_XML_DESCRIPTION="Système d'affichage de guitariste dans des contenus en interprétant la syntaxe suivante : {afficherguitariste X}
Remplacez la valeur X par l'ID du guitariste souhaitée. Exemple pour le guitariste qui a l'ID 1 : {afficherguitariste 1}."

 

7 - Fichier d'installation

Créez un dossier nommé plg_content_afficherguitariste.1.0 à un emplacement de votre choix. Copiez y tous les fichiers de notre plugin. Vous devez avoir les fichiers suivants:

- afficherguitariste.php

- afficherguitariste.xml

- fr-FR.plg_content_afficherguitariste.ini

- fr-FR.plg_content_afficherguitariste.sys.ini

Faites un clic droit sur ce dossier puis Envoyer vers->Dossier compressé pour que le dossier soit compresser en plg_content_afficherguitariste.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 est installé sur le site de préférence avant l'installation de ce 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 jeudi, 22 février 2018 05:07
  • 291
Docteur Joomla

Après plus de 10 ans d'expérience en Joomla, je lance ce Blog pour partager mes connaissances avec les autres développeurs Joomla.