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.
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
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.
j'ai ceci: www.mondomaine.com/realisation/detail?slug=Campagne-digital-MAKALA&id=6
je ne sais pas ce que j'ai louper.
SVP
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
}
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 :)
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
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.
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.
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
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']);
}
Un plaisir !
Par contre, pour éviter de mettre le strtolower($value->slug)
, pense à le faire lorsque tu créés le slug.
Par contre, pour éviter de mettre le strtolower($value->slug), pense à le faire lorsque tu créés le slug.
ok je le fais