Cakephp et les sous domaines

Par winPROG'005, il y a 10 ans


Salut à tous,

j'ai suivi ce doc http://book.cakephp.org/2.0/fr/appendices/new-features-in-cakephp-2-0.html#routes-peuvent-retourner-des-urls-completes

pour avoir cette résultat dans l'URL : http://test.localhost/posts/add
mais j'obtiens le lien suivant http://localhost/posts/add/subdomain:test

Avez vous des idées!!

Merci d'avance

11 réponses

Lartak, il y a 10 ans

Bonjour.
Il ne suffit pas de créer une classe personnalisée pour le Router, pour qu'elle soit prise en compte par l'application.
Je te conseille fortement de consulter la documentation plus en profondeur, surtout concernant les routes personnalisées.

winPROG'005, il y a 10 ans

Bonjour,

voila mon code :

//SubdomainRoute.php <?php App::uses('CakeRoute', 'Routing/Route'); class SubdomainRoute extends CakeRoute { public function match ($params) { $subdomain = isset($params['subdomain']) ? $params['subdomain'] : null; unset($params['subdomain']); $path = parent::match($params); if ($subdomain) { $path = 'http://' . $subdomain . '.localhost' . $path; } return $path; } } // view.ctp echo $this->Html->link( 'add', array('subdomain' => 'test', 'controller' => 'posts', 'action' => 'add') ); //routes.php App::uses('SubdomainRoute', 'Routing/Route'); Router::connect('/:slug', array('controller' => 'posts', 'action' => 'add'), array('routeClass' => 'SubdomainRoute') );

résultat : test.localhost (Page Web inaccessible) au lieu de test.localhost/posts/add

Lartak, il y a 10 ans

Bonjour.
Pourquoi l'url de la route contient :slug?
Si tu veux que ça retourne http://test.localhost/posts/add il te faudrait mettre quelque chose comme /posts/add au lieu de /:slug.

winPROG'005, il y a 10 ans

C bn il m'affiche le lien http://test.localhost/posts/add
mais :( The requested URL /posts/add was not found on this server.
par exemple si je veux afficher la liste des annonces dans une ville
il faut l'afficher avec cette url nice.localhost/annonce/liste_annonces

//dans mon controlleur public function liste_annonces($ville=null){ $this->paginate['Annonce']['limit'] = 4; $this->paginate['Annonce']['conditions'] = array( 'Annonce.ville LIKE' => $ville ); $this->set('annonces', $this->paginate()); } // liste_annonces.ctp parcourir la liste 'annonces' //home.ctp <?php echo $this->Html->link('Liste des annonces', array('subdomain' => 'nice','controller'=>'annonces','action'=>'liste_annonces') ); //routes.php App::uses('SubdomainRoute', 'Routing/Route'); Router::connect('/annonces/liste_annonces', array('controller' => 'annonces', 'action' => 'liste_annonces'), array('routeClass' => 'SubdomainRoute','pass'=>array('ville')) ); //SubdomainRoute.php <?php App::uses('CakeRoute', 'Routing/Route'); class SubdomainRoute extends CakeRoute { public function match ($params) { $subdomain = isset($params['subdomain']) ? $params['subdomain'] : null; unset($params['subdomain']); $path = parent::match($params); if ($subdomain) { $path = 'http://' . $subdomain . '.localhost' . $path; } return $path; } }
Lartak, il y a 10 ans

Bonsoir.
Si tu veux que le router match l'url /annonce/liste_annonces, il te faut mettre dans le Router::connect /annonce/liste_annonces et non /annonces/liste_annonces.
Au passage, si tu veux qu'il puisse prendre l'argument passé (ville) dans le cas où il soit présent dans l'url, fais comme ceci : /annonce/liste_annonces/*.

winPROG'005, il y a 10 ans

Bonjour,
j'ai corrigé les erreurs il me donne URL que je veux mais la Page Web inaccessible
je crois que j'ai oublié quelque chose :(

Lartak, il y a 10 ans

Bonjour.
Est-ce que tu as fait le lien du sous-domaine dans ton fichier hosts ?

winPROG'005, il y a 10 ans

non mais je souhaite qu'il soit dynamique car j'ai + de 1000 villes
y a-t-il une solution ??

Lartak, il y a 10 ans

Non, les déclarations de sous-domaine doivent être faites dans le fichier hosts et si tu es tenté de faire quelque chose comme :

127.0.0.1 localhost 127.0.0.1 *.localhost

Ce n'est pas possible.

winPROG'005, il y a 10 ans

Tt marche bien le seul probléme c'est comment acceder au subdomain et l'utiliser comme param dans la fonction

<?php echo $this->Html->link('Liste des annonces', array('subdomain' => 'nice','controller'=>'annonces','action'=>'liste_annonces') ); public function liste_annonces(){ $this->paginate['Annonce']['limit'] = 4; $this->paginate['Annonce']['conditions'] = array( //'subdomain' => 'nice' 'Annonce.ville LIKE' => ' param subdomain (nice)' ); $this->set('annonces', $this->paginate()); }

Merciiii bcp Lartak ^^