Bonjour à tous,

J'ai un petit souci concernant la réécriture d'URL.
J'ai changé mon "Router.php" par celui donné en bas du tutoriel, je ne sais pas si le problème vient de là par contre...

J'ai rajouté un controller pour les pages afin de pouvoir les modifier, supprimer, etc...
Mais dans ma vue (hors administration), lorsque j'essaie d'afficher une page, l'URL se formate comme ceci :

/pages/view/id:2/slug:ma-deuxieme-page (Si je retire le slug: et id: de l'URL ça marche évidemment)

Je n'ai pas le problème avec les posts par contre et le code des 2 méthodes view est quasi identique...

Code de ma méthode view dans PagesController.php

function view($id, $slug) {
        $this->loadModel('Post');
        $d'post'] = $this->Post->findFirst(array(
            'fields' => 'id, slug, content, name',
            'conditions' => array('online' => 1, 'id' => $id, 'type' => 'page')
                ));

        if (empty($d'post'])) {
            $this->e404('Page introuvable');
        }

        if ($slug != $d'post']->slug) {
            $this->redirect("pages/view/id:$id/slug:" . $d'post']->slug, 301);
        }
        $this->set($d);
    }

PS : Je n'ai aucun souci concernant le admin_index(), admin_edit() et admin_delete().

Merci de votre aide !

3 réponses


Mats
Auteur
Réponse acceptée

J'ai trouvé mon erreur...

Je n'avais pas connecté l'URL dans le fichier conf.php

Router::connect('pages/:slug-:id','pages/view/id:([0-9]+)/slug:([a-z0-9\-]+)');

Désolé ! Je n'y avais pas pensé.
Merci quand même d'avoir voulu aider !

Bonne journée !

Salut,
Tu poses le code de Router.php

Mats
Auteur
<?php
/**
 * Classe de routing à utiliser pour un MVC 
 * Permet de rediriger des URLs vers des URL au format MVC controller/action/param/param/param....
 * Router::prefix('cockpit','admin');
 * Router::connect('','posts/index');
 * Router::connect('cockpit','cockpit/posts/index');
 * Router::connect('blog/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
 * Router::connect('blog/*','posts/*');
 *
 * */
class Router {
    static $routes = array();
    static $prefixes = array();
    /**
     * Ajoute un prefix au Routing
     * */
    static function prefix($url, $prefix) {
        self::$prefixes$url] = $prefix;
    }
    /**
     * Permet de parser une url
     * @param $url Url à parser
     * @return tableau contenant les paramètres
     * */
    static function parse($url, $request) {
        $url = trim($url, '/');
        if (empty($url)) {
            $url = Router::$routes[0]'url'];
        } else {
            $match = false;
            foreach (Router::$routes as $v) {
                if (!$match && preg_match($v'redirreg'], $url, $match)) {
                    $url = $v'origin'];
                    foreach ($match as $k => $v) {
                        $url = str_replace(':' . $k . ':', $v, $url);
                    }
                    $match = true;
                }
            }
        }
        $params = explode('/', $url);
        if (in_array($params[0], array_keys(self::$prefixes))) {
            $request->prefix = self::$prefixes$params[0]];
            array_shift($params);
        }
        $request->controller = $params[0];
        $request->action = isset($params[1]) ? $params[1] : 'index';
        $request->params = array_slice($params, 2);
        return true;
    }
    /**
     * Permet de connecter une url à une action particulière
     * */
    static function connect($redir, $url) {
        $r = array();
        $r'params'] = array();
        $r'url'] = $url;
        $r'originreg'] = preg_replace('/([a-z0-9]+):(^\/]+)/', '${1}:(?P<${1}>${2})', $url);
        $r'originreg'] = str_replace('/*', '(?P<args>/?.*)', $r'originreg']);
        $r'originreg'] = '/^' . str_replace('/', '\/', $r'originreg']) . '$/';
        // MODIF
        $r'origin'] = preg_replace('/([a-z0-9]+):(^\/]+)/', ':${1}:', $url);
        $r'origin'] = str_replace('/*', ':args:', $r'origin']);
        $params = explode('/', $url);
        foreach ($params as $k => $v) {
            if (strpos($v, ':')) {
                $p = explode(':', $v);
                $r'params']$p[0]] = $p[1];
            }
        }
        $r'redirreg'] = $redir;
        $r'redirreg'] = str_replace('/*', '(?P<args>/?.*)', $r'redirreg']);
        foreach ($r'params'] as $k => $v) {
            $r'redirreg'] = str_replace(":$k", "(?P<$k>$v)", $r'redirreg']);
        }
        $r'redirreg'] = '/^' . str_replace('/', '\/', $r'redirreg']) . '$/';
        $r'redir'] = preg_replace('/:([a-z0-9]+)/', ':${1}:', $redir);
        $r'redir'] = str_replace('/*', ':args:', $r'redir']);
        self::$routes] = $r;
    }
    /**
     * Permet de générer une url à partir d'une url originale
     * controller/action(/:param/:param/:param...)
     * */
    static function url($url = '') {
        trim($url, '/');
        foreach (self::$routes as $v) {
            if (preg_match($v'originreg'], $url, $match)) {
                $url = $v'redir'];
                foreach ($match as $k => $w) {
                    $url = str_replace(":$k:", $w, $url);
                }
            }
        }
        foreach (self::$prefixes as $k => $v) {
            if (strpos($url, $v) === 0) {
                $url = str_replace($v, $k, $url);
            }
        }
        return BASE_URL . '/' . $url;
    }
    static function webroot($url) {
        trim($url, '/');
        return BASE_URL . '/' . $url;
    }
}