bonjour,
je me suis lancé dans un nouveau projet et j'utilise pour la premiere fois les routes et je voulais savoir comment je pouvais réécrire l'url des formulaires parce que l'url générée est de typ /:controller/:action/:id et si dans le tableau d'option de create je met
'url' => array('controller' => 'types', 'action' => 'editer', 'id' => $this->data'Type']'id'], 'nom' => strtolower(Inflector::slug($this->data'Type']'nom'])))
ca me fait cette url : /types/editer/5/id:5/nom:boisson

si quelqu'un peut m'aider ca me debloquerais franchement parce que je vois pas comment faire a part en mettant 'url' => '/types/editer-'.$id.'-'.$nom.'.html' (le format que je veux)

5 réponses


Flohw
Auteur
Réponse acceptée

j'ai trouvé ! (en cherchant complètement autre chose que ca :p )
il suffit, dans le parametre url de la fonction create, de mettre :
$this->Html->url(array('controller' => 'types', 'action' => 'editer', 'id' => $this->data'Type']'id'], 'nom'] => $this->data'Type']'nom']), true);
le seul bémole c'est que là l'action est l'url absolue (qui commence par http://) mais bon c'est pas dramatique ^^

Bonjour,
Normalement ceci devrait faire l'affaire comme route :

Router::connect('/types/editer-:id-:nom.html',
    array('controller' => 'types', 'action' => 'editer'),
    array('pass' => 
        array('id','nom'),
            'nom' => '[a-zA-Z0-9\-]+',
            'id' => '[0-9]+',
    )
);
Flohw
Auteur

je l'ai mais ca marche pas... en fait la création du formulaire ajoute automatiquement l'id apres l'action editer mais sans le nommer, comme un parametre normal d'une fonction, l'attribut action du formulaire est : /types/editer/5/id:5/nom:boisson et comme il y a 5 apres editer/, le routing fonctionne pas comme il faut
par contre, si je met dans l'option url du create, l'url au format que je veux en absolut, avec les variables au bon endroit et tout ca marche...

Je comprends le problème en effet, par contre je ne comprends pas trop la raison pour laquelle tu voudrais faire ça sur un formulaire, après le traitement des données tu ne rediriges pas ta page ?
Sinon je vais voir si je trouve une solution, la doc ne me l'a pas apporté :/

Flohw
Auteur

a moi non plus la doc ne me l'a pas apporté :s

je cherche a le faire parce que dans mon action, je teste le parametre nom, s'il correspond ou non a la base de donnée, s'il ne correspond pas, je redirige.
voila mon code :

function editer($id = null, $slug = null)
{
    $id = (int) $id;
    if ($id == null OR $id == 0)
        $this->redirect(array('controller' => 'types', 'action' => 'nouveau'));
    if (isset($this->data))
    {
        $this->Type->set($this->data);
        if ($this->Type->validates())
        {
        $this->Type->save();
            $this->Session->setFlash('Le type a bien été édité', 'succes');
            $this->redirect(array('controller' => 'types', 'action' => 'nouveau'));
        }
        else
            $this->Session->setFlash('Le type n\'a pas été édité', 'erreur');
    }

    $this->Type->recursive = -1;
    $this->data = $this->Type->findById($id);
    $nom = strtolower(Inflector::slug($this->data'Type']'nom']));
    if (empty($this->data))
    {
        $this->Session->setFlash('Ce type de recette n\'existe pas', 'erreur');
        $this->redirect(array('controller' => 'types', 'action' => 'nouveau'));
    }
    elseif ($nom != $slug)
        $this->redirect(array('controller' => 'types', 'action' => 'editer', 'id' => $id, 'nom' => $nom));
}

donc, dans mon premier if, si les données ne sont pas validées, on va au else qui fait juste $this>Session->setFlash(...); puis on sort du premier if, on fait le blabla et on va au elseif, là la variable $nom n'e correspondra jamais à $slug puisque $nom contient id:5 (ou un autre nombre) donc je suis redirigé, le message de session n'ayant pas été affiché, il s'affiche apres la redirection mais les messages d'erreur qui s'affichent en dessous des champs du formulaire ne s'affichent pas, là j'ai qu'un seul champ, c'est pas trop genant et mais pourquoi le champ est erroné, y'a 3 possibilités donc un peu plus embetant...

merci beacoup de te pencher sur le probleme (j'espere que la fin a été claire :))

je viens de penser aussi, que je pourrais rediriger vers /types/editer/5/boissons par exemple, lorsque le formulaire serait erroné, on aurait pas une jolie url mais est ce que ca serait vraiment grave ? ^^