Bonjour à tous,
Actuellement en phase de développement d'un site permettant la création de profil, je fais face à un problème de routing.
Le site en question devrait permettre la création de profil en ligne accessible à une adresse personnalisable du type www.site.com/nom_du_profil. Le problème est que je n'arrive pas à faire la distinction entre controller et nom_du_profil.
La logique serait de taper une adresse : www.site.com/qlqchose de vérifier si d'abord qlqchose est un profil, si non, de vérifier si c'est un controller et de rediriger vers lui si c'est le cas, sinon de rediriger vers la page d'accueil du site. Chose que je n'arrive pas à faire :D
Si quelqu'un a une idée, je suis preneur !
En vous remerciant d'avance pour vos réponses.
Merci pour ta réponse BenFarhat,
J'ai d'abord commencé par utiliser ta méthode dans un premier temps. Ca fonctionnait, mais ça mettait beaucoup de temps à se faire.
J'ai donc poursuivi mes recherches et je suis tombé sur une autre méthode qui fonctionne mieux avec moi de code.
Dans mon fichier routes.php, j'inclus ces deux lignes :
// La première servant à rediriger vers l'action de routes
Router::connect('/:lienprofil', array('controller' => 'pages', 'action' => 'routes'), array('pass' => array('lienprofil')));
// La seconde permettant de m'afficher un lien du type www.site.com/profil/lienprofil lorsque le route a été fait
Router::connect('/profil/*', array('controller' => 'profil'));
Ensuite, dans mon fichier PagesController, j'ai rajouté ça :
public function routes($lienprofil) {
$this->loadModel('Option');
$candidat = $this->Option->find('first', array(
'conditions' => array('lienprofil' => $lienprofil),
));
if($candidat){
$this->redirect(array('controller' => 'profil', $lienprofil));
}
}
Et là ça marche nickel :)
Voila en espérant que ça puisse aider quelqu'un s'il fait fasse au même problème que moi ^^
Merci encore pour ton aide BenFarhat.
Ca doit se faire en plusieurs étapes: tu cherches la listes des utilisateurs tu cherches la liste des controlleurs ensuite tu enlèves de la liste des utilisateurs la liste des controlleurs puis tu routes** [code]// je récupère la liste des utilisateurs $utilisateur = ClassRegistry::init('User'); $utilisateurs = $utilisateur->find('all',array('fields'=>'username')); foreach($utilisateurs as $u) $abonnes[]=$u['User']['username']; // je récupère la liste des controllers foreach(App::objects('controller') as $ctrl) if($ctrl"AppController") $listctrl[]=str_replace("Controller","",$ctrl); // je crée ma liste de routes (j'enleve de la liste des abonnées ceux qui ont un nom identique a celui d'un controller $mesroutes = array_diff($abonnes, $listctrl); foreach($mesroutes as $rt){ Router::connect("'/".$rt."'", array('controller' => 'users', 'action' => 'profil',$rt)); }[/code] Tu dois également faire un controle dans ton models User.php et vérifier avant d'ajouter ou éditer un utilisateur son nom (qu'il ne soit pas "contraignant") [code] public function beforeSave($options = array()) { parent::beforeSave(); foreach(App::objects('controller') as $ctrl) if($ctrl"AppController") $listctrl[]=str_replace("Controller","",$ctrl); if(in_array($this->data['User']['username'],$listctrl)) return false; if (isset($this->data['User']['password']) && $this->data['User']['password'] '') { $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); } else { unset($this->data['User']['password']); } return true; } // on ne test pas la présence du username vu qu'elle est dans les règles de validaiton public $validate = array( 'username' => array( 'notempty' => array( 'rule' => array('notempty'), ), 'isUnique' => array ( 'rule' => 'isUnique', 'message' => 'Ce nom a déjà été attribué.' ), 'minLength' => array( 'rule' => array('minLength', '3'), 'message' => 'Le nom d\'utilisateur doit contenir plus de 3 caractères.' ) ), ...[/code] Ensuite au niveau de ta fonction "profil" (dans le controller UsersController.php) tu dois faire une recherche de l'utilisateur avec une code proche de celui ci [code] public function profil($profil = null) { $this->set('title_for_layout', "Votre profil")); $this->User->find('first',array( 'conditions' => array('User.username' => $profil))); $this->set('user', $this->User->read(null, $id)); } [/code] J'espère que ca t'aidera PS: je n'ai testé que la génération des routes, pour le reste il se peut qu'une parenthèse ou virgule soit mal placée :)