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 18) SEF URL


Dans cette partie,  nous allons travailler sur la réécriture des URLs (SEF) sur le site (côté client). Tout se passera au côté client donc pas dans le dossier administrator. Si vous êtes arrivés directement sur cette page, peut-être que vous aimeriez commencer par le début: Partie 1 | Partie 2 | Partie 3 | Partie 4 | Partie 5 | Partie 6 | Partie 7 | Partie 8 | Partie 9 | Partie 10 | Partie 11 | Partie 12 | Partie 13 | Partie 14 | Partie 15 | Partie 16 | Partie 17

1 - Introduction

SEF signifie en anglais Search Engine Friendly. Elle consiste à rendre l'url plus facile à lire par un être humain et surtout permettre un bon référencement car les moteurs de recherches vont aussi chercher les mots recherchés dans l'URL.

2 - Modification des modèles

Nous allons modifier les modèles pour retourner une concatenation du id avec l'alias séparée par ":". Nous utiliserons cette concatenation à la place du ID dans l'url. Notre url pourra ressemble à ceci : 

http://www.docteurjoomla.com/index.php?option=com_djguitariste&view=guitariste&id=1:tommy-emmanuel&catid=11-fingerstyle&Itemid=50

 Mais grâce au Router que nous allons voir plus bas, l'url qui sera visible dans la barre d'adresse du navigateur sera: 

http://www.docteurjoomla.com/11-fingerstyle/1-tommy-emmanuel

 Nous modifierons la méthode getListQuery dans trois fichiers de modèles (guitaristes.php, categories.php, category.php). Dans chaque cas, nous vérifierons si le champ alias n'est pas vide avant de procéder à la concatenation si oui, nous retournerons juste l'id.

2 -1 Le modèle guitaristes

Dans le dossier models, le fichier guitaristes.php. Le code à rajouter est la partie en couleur :


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

class DJGuitaristeModelGuitaristes extends JModelList
{
  
  public function getListQuery()
  {
    $db = $this->getDbo();
    $query = $db->getQuery(true);
    $query->select('a.id, a.name, a.state, a.publish_up, a.publish_down');
    $query->from($db->quoteName('#__djguitariste_items').' AS a');
    
    $query->select('c.title AS category');
    $query->join('LEFT', $db->quoteName('#__categories').' AS c ON c.id = a.catid');
    $query->where('a.state = 1');
    
    $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.')');
    
    //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');
    
	
    $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);   
    
    
    return $query;
  }
  
}

2 - 2 Le modèle categories

Dans le dossier models, le fichier categories.php :


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

class DJGuitaristeModelCategories extends JModelList
{
  
  public function getListQuery()
  {
    $db = $this->getDbo();
    $query = $db->getQuery(true);
    $query->select('id, title');
    $query->from($db->quoteName('#__categories'));
    $query->where('extension = "com_djguitariste"')
          ->where('published = 1')
          ->where('access = 1');
          
    $case_when = ' CASE WHEN ';
    $case_when .= $query->charLength('alias', '!=', '0');
    $case_when .= ' THEN ';
    $a_id = $query->castAsChar('id');
    $case_when .= $query->concatenate(array($a_id, 'alias'), ':');
    $case_when .= ' ELSE ';
    $case_when .= $a_id.' END as slug';
    $query->select($case_when);
        
    return $query;
  }
  
}

2 - 3 Le modèle catégorie

dans le dossier models, le fichier categorie.php :


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

class DJGuitaristeModelCategorie extends JModelList
{
  
  public function getListQuery()
  {
    
    $app = JFactory::getApplication();
    $id = $app->input->getInt('id', 0);
    
    $db = $this->getDbo();
    $query = $db->getQuery(true);
    $query->select('a.id, a.name, a.state, a.publish_up, a.publish_down');
    $query->from($db->quoteName('#__djguitariste_items').' AS a');
    
    $query->select('c.title AS category');
    $query->join('LEFT', $db->quoteName('#__categories').' AS c ON c.id = a.catid');
    $query->where('a.catid = '.(int)$id);
    $query->where('a.state = 1');
    
    $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.')');
    
    $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);
    
    return $query;
  }
  
}

3 - Modification des URLs

Dans les vues liste, nous allons faire les modifications des urls pour utiliser la concatenation au lieu du ID. Donc nous utiliserons slug à la place de l'ID du guitariste et catslug à la place de l'ID de la catégorie.

3 - 1 Vue Guitaristes

Nous allons modifier le fichier default.php. Voici le chemin complet : views/guitaristes/tmpl/default.php. La seul modification ici concerne la propriété href de la balise "a".


<a href="/<?php echo JRoute::_("index.php?option=com_djguitariste&view=guitariste&catid=".$guitariste->catslug."&id=".$guitariste->slug); ?>">
  <?php echo $guitariste->name; ?>
</a> <span class="small"> - (<?php echo $guitariste->category; ?>)</span>

3 - 2 La vue Categorie

Comme nous venons de le faire pour la vue guitaristes, nous allons aussi faire la même chose pour la vue categorie. Voici le chemin complet : views/guitariste/tmpl/default.php. La seul modification ici concerne la propriété href de la balise "a".


<a href="/<?php echo JRoute::_("index.php?option=com_djguitariste&view=guitariste&catid=".$guitariste->catslug."&id=".$guitariste->slug); ?>">
  <?php echo $guitariste->name; ?>
</a> <span class="small"> - (<?php echo $guitariste->category; ?>)</span>

 3 - 3 La vue Categories

Pareil que pour les deux autres sauf qu'ici on a juste un seul élément (la catégorie).


<td>
	<a href="/<?php echo JRoute::_("index.php?option=com_djguitariste&view=categorie&id=".$item->slug); ?>">
	  <?php echo $this->escape($item->title); ?>
	</a>  
</td>

4 -  Le fichier Router

Pour faire le SEF url, il faut créer dans le dossier du composant un fichier nommé router.php. Dans ce fichier il faut créer deux fonctions nommées sous la forme nom_du_composantBuildRoute et nom_du_composantParseRoute. Dans notre cas, les fonctions auront pour nom DJGuitaristeBuildRoute et DJGuitaristeParseRoute. BuildRoute récupère les valeur et efface les  noms de variable. ParseRoute permet d'analyser les information dans l'url. Voici le contenu du fichier router.php


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


function DJGuitaristeBuildRoute(&$query){
  $segments = array();
  
  if(isset($query['catid'])){
    $segments[] = $query['catid'];
    unset($query['catid']);
  }
  if(isset($query['id'])){
    $segments[] = $query['id'];
    unset($query['id']);
  }
  
  unset($query['view']);
  
  return $segments;
}

function DJGuitaristeParseRoute($segments){
  $vars = array();
  $app = JFactory::getApplication();
  $menu = $app->getMenu();
  $mItem = $menu->getActive();
  
  $count = count($segments);
  $id = explode(':', $segments[$count - 1]);
  $vars['id'] = (int)$id[0];
  
  switch($mItem->query['view']){
    case 'categories':
    case 'categorie':
      if($count == 1){
        $vars['view'] = 'categorie';
      }
      if($count == 2){
        $vars['view'] = 'guitariste';
      }
      break;
    case 'guitaristes':
      $vars['view'] = 'guitariste';
      break;
  }
  
  return $vars;
}

Maintenant vous devez avoir des URLs plus intéressants pour les pages de notre composant. Si vous avez des questions, veuillez utiliser le formulaire de contact ou notre page Facebook. 

Lire la suite...


  • Dernière modification le lundi, 16 octobre 2017 15:01
  • 375
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.