ShareThis

    Routage d’url sur Codeigniter

    codeigniterJe vous propose une alternative de routage des pages sur la plate-forme de développement Codeigniter, pour l’utiliser à la fois comme un CMS et comme support d’applications en ligne.

    L’idée est partie d’un constat : MVC, le modèle de développement utilisé sur Codeigniter, c’est pratique, sauf lorsqu’on veut mettre en place un simple CMS (Content Management System – en français : Système de Gestion de Contenu): Il faut créer un contrôleur pour chaque page, alors que le contrôleur fait chaque fois la même chose : afficher une page. Pour éviter ce gaspillage d’énergie et de temps, l’idée est que toutes les pages appelées arrivent sur un contrôleur unique. Celui-ci va se charger d’afficher la page dont le nom correspond à l’adresse de la page demandée.

    Jusque-là, tout va bien. Mais comment accéder sur la même plate-forme à d’autres contrôleurs “métier”, qui afficheraient des pages d’applications en ligne, telles qu’une gestion de stock, une comptabilité, un suivi d’affaire, un planning, etc. ?

    Définir un routage d’adresse

    Le routage d’adresse est un processus qui intercepte la demande d’une page que l’internaute a sollicitée depuis son navigateur, puis la filtre pour orienter la demande vers un programme (contrôleur) précis.

    Sur un simple site en HTML, l’internaute qui demande la page http://example.com/nos-destinations verra s’afficher le contenu du fichier nos-destinations.html enregistré sur le serveur. Avec le routage d’adresse, le processus peut rediriger la demande vers un programme qui va:

    1. vérifier si le fichier nos-destinations.php existe, et alors rediriger vers ce programme,
    2. si ce fichier n’existe pas, afficher simplement le contenu de la page nos-destinations.html.

    Il y a un problème:

    Si la page demandée attend des données en provenance d’un formulaire ($_POST), la redirection perd le contenu du formulaire en cours de route. Il faut donc rester dans la règle de base MVC : les pages d’applications doivent être accessibles directement. Mais, en même temps, les pages d’affichage (CMS) doivent transiter par un contrôleur spécialisé dans l’affichage des pages.

    Au regard de ces deux scénarios, nous allons créer une règle de routage d’adresse:

    Les pages CMS ont un seul élément pour les identifier. Par exemple, l’adresse example.com/nos-sejours-en-promotion ne contient qu’un seul élément : nos-sejours-en-promotion, tandis que la page example.com/planning/janvier contient deux éléments : planning et janvier.

    Voici donc la règle de routage que nous allons mettre en oeuvre dans le fichier /application/config/route.php.
    Cette règle doit être inscrite après la ligne $route['scaffolding_trigger']

    1
    2
    3
    // Routage des pages CMS

    $route['([a-z0-9\-]+)'] = "/cms";

    Cette règle indique que toute requête qui contient un seul élément délimité par des crochets [] (en acceptant tout les caractères alphanumériques et le tiret) doit être redirigée vers le contrôleur cms.php. S’il y a plusieurs éléments séparés par des barres obliques “/”, aucune règle n’est définie. Dans ce cas, l’url est traitée directement sans passer par cms.php. C’est la règle MVC par défaut. Avec ce paramètre de routage, toute page ne contenant qu’un seul élément d’adresse sera redirigée vers le contrôleur cms.php. Celui-ci se contente d’afficher la vue (view) correspondant à l’élément d’adresse demandée. Les adresses de page contenant plusieurs éléments seront traitées directement, sans passer par le contrôleur cms.php.

    Comment accéder à une page CMS se trouvant dans un sous-dossier ?

    Puisque l’adresse de page CMS ne doit contenir qu’un élément, il est impossible d’utiliser la barre oblique pour ajouter un dossier. L’adresse example.com/sejours/destination/asie sera réputée être une page d’application, alors qu’il s’agit d’une page d’information !

    L’astuce est de remplacer le caractère “/” par le tiret “-”. La page devra être formulée ainsi : example.com//sejours-destinations-asie. Là, nous avons bien un seul élément : sejours-destinations-asie.

    Cette requête sera donc traitée par le contrôleur cms.php, qui va:

    1. remplacer les tirets “-” par des barres obliques “/”,
    2. … puis afficher la page asie.html qui se trouve dans le sous-dossier sejours/destinations.

    Comment accéder directement à une page d’application avec un seul élément d’adresse ?

    Une adresse avec un seul élément est redirigée vers le contrôleur de page cms.php, même s’il s’agit d’une application. Ainsi, exemple.com/planning sera traitée par le programme cms.php alors qu’il s’agit d’une application. L’astuce consiste alors à ajouter dans cms.php, une fonction de recherche pour vérifier si l’élément adresse suivi du suffixe .php correspond effectivement à un fichier présent parmi les contrôleurs. Dans notre cas, si planning.php est un contrôleur, il suffira de rediriger la suite de l’éxécution vers ce programme. Sinon, on affiche la page d’information planning.html demandée.

    Le contrôleur cms.php

    Voici le contenu du fichier cms.php. On récupère l’url de page demandé, on le recherche dans la liste des contrôleurs et on l’exécute, s’il existe, sinon, on affiche simplement la page correspondant à l’adresse demandée.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    class Cms extends Controller {
       function __construct()
           {
                parent::Controller();
           }
         
      function index()
      {
        $uri = uri_string();        // Récupérer l'url
        if(!$uri) $uri = '/home';     // l'url de la page d'accueil n'a pas d'élément: ajouter /home
        $uri = str_replace('-', '/', $uri); // Remplacer les tirets par des barres obliques
        $application = "/apps/$uri";    // Les applications sont dans le sous-dossier app
        $app = trim_slashes($application);  // Supprimer les barres obliques aux extrémités pour chercher le contrôleur
        if($this->exists->controller($app)) redirect ($application); // Si le contrôleur existe, le traiter
        $this->load->view($uri);
      }
    }

    Notez que nous avons placé les applications dans un sous-dossier apps afin d’obtenir systématiquement une adresse d’application avec au moins deux éléments (comme example.com/apps/planning), et éviter ainsi que la redirection ne tourne en boucle sur le fichier cms.php.

    Dans ce script, la fonction exists->controller() vient d’une librairie récupérée sur le forum de Codeigniter.

    Précision à propos des vues (views) : Sur Codeigniter, tous les fichiers portent le suffixe .php, y compris les vues. Mais j’ai choisi dans cet exposé de les mentionner comme “html” pour faciliter la présentation.

    Références

    Pour plus d’informations…
    Codeigniter (en)
    MVC (fr)

    This entry was posted in Techniques and tagged , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

      Déposer un commentaire

      Votre courriel ne sera jamais publié ni communiqué. Les champs obligatoires sont indiqués par *

      *
      *

      Spam Protection by WP-SpamFree Plugin

      Get Adobe Flash playerPlugin by wpburn.com wordpress themes

      Bad Behavior has blocked 39 access attempts in the last 7 days.

      This site is protected with Urban Giraffe's plugin 'HTML Purified' and Edward Z. Yang's Powered by HTML Purifier. 2734 items have been purified.

      Performance Optimization WordPress Plugins by W3 EDGE