Routeurs, contrôleurs et référencement : définir les routes pour la réécriture d'URL

  • De le 14 juillet 2010
  • Difficulté : 4/4

Routeurs, contrôleurs et référencement : définir les routes pour la réécriture d'URL Ce tutoriel aborde la mise en place d'une route personnalisée pour la réécriture de l'URL permettant à un contrôleur d'exécuter les actions demandées. Il est parfois intéressant d'incorporer dans l'URL d'une nouvelle page issue d'une extension des mots clés dans le but de favoriser son positionnement dans les moteurs de recherche.

L'ajout d'une nouvelle page personnalisée (formulaire, action spécifique...) demande généralement la création d'une nouvelle extension comportant un contrôleur (accessible). Celui-ci reçoit les événements issus des utilisateurs et réagit en conséquence.

L'objectif est de transformer l'URL permettant l'accès aux actions d'un contrôleur, afin de rendre l'adresse de la nouvelle page plus lisible et d'y incorporer des mots clés bénéfiques au positionnement dans les moteurs. On doit pour cela définir nos propres règles en initialisant un routeur spécifique.

Les routes permettent de trouver dynamiquement quel module et quelle action doit être appelée suivant l'URL.

Le routeur personnalisé nous permettra de dicter et de décortiquer les éléments présents dans l'URL afin de faire appel à l'événement adéquat.

Une URL traditionnelle se présente de cette façon :

Route

http://www.domain.tld/frontname/controllername/actionname/param/1/

Nous souhaitons transformer cette adresse afin d'obtenir :

Route

http://www.domain.tld/keywords/1/keywords.html

Architecture du module

  • app/code/local/Magentix/TutoRouter/Controller/
  • Router.php
  • app/code/local/Magentix/TutoRouter/controllers/
  • MagentixController.php
  • app/code/local/Magentix/TutoRouter/etc/
  • config.xml
  • app/etc/modules/
  • Magentix_TutoRouter.xml

Développement du module

1. Mise en place du contrôleur

Le contrôleur de notre module sera volontairement simplifié à l'extrême. Dans un premier temps nous allons le déclarer dans le fichier de configuration :

app/code/local/Magentix/TutoRouter/etc/config.xml

<?xml version="1.0"?>
<config>
     <modules>
          <Magentix_TutoRouter>
               <version>0.1.0</version>
          </Magentix_TutoRouter>
     </modules>
     <frontend>
          <routers>
               <tutorouter>
                    <use>standard</use>
                    <args>
                         <module>Magentix_TutoRouter</module>
                         <frontName>tutorouter</frontName>
                    </args>
               </tutorouter>
          </routers>
     </frontend>
</config>

Le frontName défini ici est tutorouter. La page est donc accessible depuis l'URL /tutorouter.

Route

http://www.domain.tld/tutorouter/

A ce stade, si l'URL indique uniquement /tutorouter, la méthode exécutée par défaut sera indexAction du fichier IndexController.php. Ce contrôleur n'existe pas, nous obtenons pour le moment une erreur 404.

Note : pour la mise en place d'un routeur spécifique le contrôleur doit obligatoirement porter un autre nom que Index.

Dans notre module le nom du contrôleur est Magentix. Ce contrôleur présente une unique action pageAction :

app/code/local/Magentix/TutoRouter/controllers/MagentixController.php

<?php

class Magentix_TutoRouter_MagentixController extends Mage_Core_Controller_Front_Action {

    public function pageAction() {
        $id = $this->getRequest()->getParam('id');
    
        $this->loadLayout();
        $this->renderLayout();
    }

}

L'action s'attend à recevoir un paramètre nommé id. Ce paramètre pourrait être exploité par la suite. Nous chargeons ensuite le layout par défaut (soit l'affichage d'une page structurée mais sans contenu).

Nous disposons à présent d'un nouvel événement accessible depuis l'URL suivante :

Route

http://www.domain.tld/tutorouter/magentix/page/id/1/
2. Initialisation du Router

Reste maintenant à initialiser une nouvelle route et à établir son comportement. Cela se gère par l'intermédiaire d'un observer sur l'événement controller_front_init_routers. Cet événement va nous permettre d'ajouter une nouvelle règle de routage.

Reprenons notre fichier de configuration :

app/code/local/Magentix/TutoRouter/etc/config.xml

<?xml version="1.0"?>
<config>
     <modules>
          <Magentix_TutoRouter>
               <version>0.1.0</version>
          </Magentix_TutoRouter>
     </modules>
     <frontend>
          <routers>
               <tutorouter>
                    <use>standard</use>
                    <args>
                         <module>Magentix_TutoRouter</module>
                         <frontName>tutorouter</frontName>
                    </args>
               </tutorouter>
          </routers>
     </frontend>
     <global>
          <events>
               <controller_front_init_routers>
                    <observers>
                         <tutorouter>
                              <type>singleton</type>
                              <class>Magentix_TutoRouter_Controller_Router</class>
                              <method>initControllerRouters</method>
                         </tutorouter>
                    </observers>
               </controller_front_init_routers>
          </events>
     </global>
</config>

La méthode initControllerRouters se chargera d'initialiser le routeur. Afin d'établir le lien entre l'URL et l'action, la méthode match sera systématiquement interrogée.

app/code/local/Magentix/TutoRouter/Controller/Router.php

<?php

class Magentix_TutoRouter_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract {

     public function initControllerRouters($observer) {
          $front = $observer->getEvent()->getFront();
          $tutorouter = new Magentix_TutoRouter_Controller_Router();
          $front->addRouter('tutorouter', $tutorouter);
     }

     public function match(Zend_Controller_Request_Http $request) {

          if(!Mage::isInstalled()) {
               Mage::app()->getFrontController()->getResponse()
                          ->setRedirect(Mage::getUrl('install'))
                          ->sendResponse();
               exit;
          }

          $identifier = trim($request->getPathInfo(), '/');
        
          $params = explode('/',$identifier);

          if(count($params) != 3
               || $params[0] != 'magentix'
               || !is_numeric($params[1])
               || !preg_match('#.html$#',$params[2])) return false;

          $request->setModuleName('tutorouter')
                  ->setControllerName('magentix')
                  ->setActionName('page')
                  ->setParam('id', $params[1]);

          return true;
     }
}

Détaillons la méthode match. Elle vérifie dans un premier temps que Magento est bien passé par la phase d'installation avant de tenter d'exécuter quoique ce soit. Il nous faut ensuite décortiquer les paramètres de l'URL. Le but est de vérifier qu'ils correspondent bien à ce que nous souhaitons et surtout d'éviter que l'on puisse y indiquer n'importe quoi. Ici 4 conditions sont requises :

  • Le nombre de paramètres doit être strictement égal à 3
  • Le premier paramètre doit contenir magentix
  • Le second paramètre doit être de type numérique
  • Le troisième et dernier paramètre doit contenir l'extension .html

Si une de ces conditions n'est pas respectée alors on envoie une page d'erreur 404. Dans le cas contraire je demande l'exécution de l'action d'un contrôleur du module de mon choix, accompagné de paramètres optionnels (ici l'identifiant).

Note 1 : il faut évidemment prendre garde que la route ne rentre pas en conflit avec une route déjà existante. Eviter également que le nom du premier paramètre soit le même que le nom d'une catégorie ou d'une page CMS.

Note 2 : le nom du module (setModuleName) doit être identique au nom du frontname défini dans le fichier de configuration.

Nous pouvons à présent accéder à l'action depuis l'URL suivante :

Route

http://www.domain.tld/magentix/1/tutoriel-router.html
commentaires

Commentez cet article : Routeurs, contrôleurs et référencement : définir les routes pour la réécriture d'URL