Bonjour,

j'aimerai bien formaté mes url pour optimiser mes reférencements. j'ai une table avec une table realisation(titre, id, slug,content,created)
j'aimerai que lorsque l'on choisit afficher les détails d'une réalisation, que mon URL soit de la forme www.mondomaine.com/realisation/detail/conception-template-2 ou conception_template est la valeur du slug et 2 l'id.

Ce que je fais

voici comment je procède dans mon fichier de route, j'ai ceci:

 $routes->connect('/realisation/:slug-:id', ['plugin'=>false,'controller' => 'realisation', 'action' => 'detail'],['pass' => ['slug','id'],'id'=>'[0-9]+','slug'=>'[a-z0-9\-]+']);

et dans ma vue j'ai ce lien:

<= $this->Html->link('detail',['plugin' => false,'controller'=>'Realisation','action' => 'detail','slug'=>$value->slug,'id'=>$value->id],['class'=>'overlay-link']); ?>

lorsque je clicque sur le lien j'ai ceci: www.mondomaine.com/realisation/detail?slug=Campagne-digital-MAKALA&id=6

Ce que je veux

que mon URL soit de la forme www.mondomaine.com/realisation/detail/conception-template-2 ou conception_template est la valeur du slug et 2 l'id.

Ce que j'obtiens

j'ai ceci: www.mondomaine.com/realisation/detail?slug=Campagne-digital-MAKALA&id=6
je ne sais pas ce que j'ai louper.
SVP

19 réponses


Kareylo
Réponse acceptée

Je viens de trouver d'où ça vient.
De ta route, tu n'as pas mis l'action vers laquelle tu rediriges :

 $routes->connect('/Realisation/detail/:slug-:id', ['controller' => 'Realisation', 'action' => 'detail'],['pass' => ['slug','id'],'id'=>'[0-9]+','slug'=>'[a-z0-9\-]+']);

Dans ton RealisationsController, tu dois avoir ceci :

public function detail($slug = null, $id = null) {
    //ton code
}
romses
Auteur

c'est déjà fait je récupère bien les valeurs mais plutôt avec $this->request->query('id') pour l'id et $this->request->query('slug') pour le slug
mon soucis c'est que lorsque l'on clique sur détail que j'ai l'url de la forme :
www.mondomaine.com/realisation/detail/conception-template-2 ou conception_template est la valeur du slug et 2 l'id.

Fait ce que je t'ai dis et ça fonctionnera. Vraiment.
Et utilise $slug et $id à la place de $this->request->query() aussi :)

romses
Auteur

Voila ce que j'ai dans mon action detail

public function detail( $slug = null,$id = null)
    {

      debug($id);
      die();
         $projects = TableRegistry::get('Administration.Projets');
        // $projects = TableRegistry::get('Administration.Projets');

          $projet = $projects->find()
                    ->where(['Projets.id' => $id])
                    ->contain(['Clients'])
                    ->first();

            $imageprojets = TableRegistry::get('Administration.Imageprojets');
            $listimage = $imageprojets->find()
                    ->select(['id','fichierimage'])
                    ->where(['projet_id' => $id])
                    ->toArray();
            $listprojets = $projects->find()
                    ->select(['id','titre','image'])
                    ->where(['client_id' => $projet->client->id])
                    ->toArray();

        $this->set(compact('projet','listimage','listprojets'));
        $this->set('_serialize', ['projet','listimage','listprojets']);

    }

lorsque je fait le débug($id) j'ai le résultat null

romses
Auteur

par contre si je fait le
debug($this->request->query(['id']));
die();

  j'ai bien la valeur de mon Id ce qui est normale car les valeurs ne respectes pas la configuration de mon fichier de routing

Donc, à partir de là, la route me semble correcte (même si le 'plugin' => false est inutile, car false par défaut, à passer à true si tu passes par un plugin), et ton link généré a l'air correct.
A partir de là, ton URL doit être correctement formatée, et tu dois pouvoir récupérer les données passées dans l'url grâce à $slug et à $id...

Après, ce qui me semble bizarre, c'est le nom de ton controller "realisation" ? Ca serait pas plutôt "Realisations" ?

j'ai bien la valeur de mon Id ce qui est normale car les valeurs ne respectes pas la configuration de mon fichier de routing

Ton problème vient donc de là. Essaie de faire en sorte que ton slug soit correct.

romses
Auteur

oui au début j'ai cru cétait le problème car j'ai renommé et tourjours rien. le choix du singulier a été exigé donc renommé en Realisations et rien

Le problème vient du fait que ton slug match pas ton patern dans ton routing. Fait en sorte qu'il match tout le temps ou change le patern.

Bonjour.
C'est tout à fait normal, tu dis que tu veux /realisation/detail/:slug-:id mais tu définis dans le routing /realisation/:slug-:id.
Et puis, si tu transmets des majuscules pour le helper Html, alors que ne définis que des lettres minuscules et des chiffres dans le routing, ça ne peut pas fonctionner.

romses
Auteur

Merci @Lartak, mais voici ce que je fais dans ma route:

 $routes->connect('/Realisation/detail/:slug-:id', ['controller' => 'Realisation'],['pass' => ['slug','id'],'id'=>'[0-9]+','slug'=>'[a-z0-9\-]+']);

et dans mon ma vue j'ai ceci:

<= $this->Html->link('detail',['plugin' => false,'controller'=>'Realisation','action' => 'detail','slug'=>strtolower($value->slug),'id'=>$value->id],['class'=>'overlay-link']); ?>

toujours pareil le même résultat:
http://mondomaine.com/realisation/detail?slug=campagne-digital-makala&id=6

toujours avec le & commercial pour séparer les variables

Et ton controller ?

romses
Auteur

mon controlleur à ceci:

 public function detail($slug = null,$id = null)
    {

         $projects = TableRegistry::get('Administration.Projets');

          $projet = $projects->find()
                    ->where(['Projets.id' => $id])
                    ->contain(['Clients'])
                    ->first();

            $imageprojets = TableRegistry::get('Administration.Imageprojets');
            $listimage = $imageprojets->find()
                    ->select(['id','fichierimage'])
                    ->where(['projet_id' => $id])
                    ->toArray();
            $listprojets = $projects->find()
                    ->select(['id','titre','image'])
                    ->where(['client_id' => $projet->client->id])
                    ->toArray();

        $this->set(compact('projet','listimage','listprojets'));
        $this->set('_serialize', ['projet','listimage','listprojets']);

    }

Et le nom de ton controller est bien "RealisationController" ?

romses
Auteur

Et le nom de ton controller est bien "RealisationController" ? oui

romses
Auteur

Super cool merci Kareylo very happy, j'ai été trop con.
merci ça marche

Un plaisir !
Par contre, pour éviter de mettre le strtolower($value->slug), pense à le faire lorsque tu créés le slug.

romses
Auteur

Par contre, pour éviter de mettre le strtolower($value->slug), pense à le faire lorsque tu créés le slug.

ok je le fais