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
Réponse acceptée

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.

Lartak
Réponse acceptée

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.

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.

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

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;
    }
}

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/*.

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 :(

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

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

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 ^^