Drupal 7 – Réécriture d’url dynamique

logo_drupal

Il arrive parfois que certaines urls soient dynamiques, et que l'on souhaite les réécrire par des urls statiques.

Par rapport à la réécriture d'url statique, que ce soit une page custom ou une page de contenu (cela pourrait réaliser via le backoffice Drupal. Et éventuellement de définir des patterns par type de contenu avec Pathauto), ce sera un peu plus compliqué pour la réécriture d’une url dynamique.

Nous allons voir comment faire cette réécriture.

HOOK à utiliser

Pour faire ce travail, on a besoin de deux hooks :

Ces deux hooks servent comme une boîte noire. L'idée est de transformer l'url (statique) d'entrée à l'url dynamique dans hook_url_inbound_alter pour que Drupal charge la page correctement et de re-transformer l'url en statique dans hook_url_outbound_alter à la fin.

Cas d'utilisation : url de tunnel d'achat de Drupal commerce

Les urls de tunnel d'achat pour Drupal commerce sont checkout/ID_ORDER/ID_PAGE par défaut. Et si l'on souhaite la réécrire par mypage/ID_PAGE (sans l'ID_ORDER qui est dynamique en fonction d’utilisateur), voici l'exemple de codes pour implémenter ces deux hooks dans un module custom, mymodule par exemple.

function mymodule_url_inbound_alter(&$path, $original_path, $path_language)
{
    if (empty($path)) {
        $path = $original_path;
    }
    global $user;
    //Récupérer la commande par l'id d'utilisateur
    $order_id = commerce_cart_order_id($user->uid);
    if ($order_id) {
        $custom_path = 'mypage/ID_PAGE';//Les pages qu'on souhaite réécrire leur url, par exemple, pour la page review : ID_PAGE = review
        if ($path == $custom_path) {
            $temp_path = "checkout/$order_id/ID_PAGE";
            //Vérifier si c'est un lien valide
            if (drupal_valid_path($temp_path)) {
                $path = $temp_path;
            }
        }
    }
}

function mymodule_url_outbound_alter(&$path, &$options, $original_path)
{
    if (empty($path)) {
        $path = $original_path;
    }
    //Retransformer l'url en statique
    $parts = explode('/', $original_path);
    if ($parts[0] == 'checkout') {
        $order_id = !empty($parts[1]) ? $parts[1] : NULL;
        $id_page = !empty($parts[2]) ? $parts[2] : 'checkout';
        $custom_path = '';
        switch ($id_page) {//Ici on fait le mapping des urls customs
            case 'xxx':
            default:
                $custom_path = 'mypage/' . $id_page;//Par exemple, pour la page review : $id_page = review
        }
        if ($custom_path) {
            $path = $custom_path;
        }
    }
}

Conclusion

En effet, comme Drupal gère les paramètres de paniers/commandes dans la session d’utilisateur, cela n'impacte pas le fonctionnement de tunnel d'achat avec l'url statique. Dans les autres cas d'utilisation, il faut donc penser à passer les paramètres autrement que dans l'url quand on souhaite faire une réécriture d'url en statique. Une fois que l’on a trouvé la solution pour passer les paramètres, il n’a plus qu'à implémenter ces deux hooks pour la réécriture.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.