Salut,
Voila j'ai une question sur mon site à la place d'avoir des URL du genre :
/page/contact-13
Je peux pas n'avoir tous simplement "contact" ?
Le problème c'est que j'utilise le système de page grâce au tuto est je ne vois pas comment faire :/
Merci
Pour les améliorations oui il y en a probablement, mais je suis confus, au début tu semblais ne pas vouloir de slug dans ton URL, ensuite tu bases ton routage et donc la logique de ton controller sur ce même slug (*Router::connect('/:slug',...*). Puis au bout de plusieurs ligne qui se base sur le slug, même chose il n'apparait nul part! Et le plus génant c'est que tu te tape une redirection 301 si ton slug (que tu n'utilises pas dans tes urls) ne correspond pas à l'ID J'ai comme l'impression que tu utilises ton slug comme identifiant à la place de l'ID, une facon de chercher son oreille gauche avec sa main droite, tu perds du temps dans ton routage et dans tes accès SQL. En quelques mots, "penses efficacité, optimisation et performance". Enlève ce slug, Utilise directement ton index primaire l'id** Et sauf dans le cas ou tu utilises le behavior containable (que je te conseils fortement) met dans ton appController ta recursivité à -1 (en rajoutant cette ligne lors de la déclarations des helpers et components: *public $recursive = -1;*). Tu verras que tes requêtes SQL (que tu affiches dans ton default.ctp par *echo $this->element('sql_dump');*) peuvent passé de plusieurs dizaines à quelques requêtes J'espère que ca t'aidera et que surtout j'ai bien compris tes besoins Bonne continuation
Faut enlever l'utilisation du slug au niveau du routage :)
Ainsi que dans les controllers
Si tu as notepad++ fait une recherche dans ton répertoire de travail App le terme "$this->URL" comme ca tu sera fixé sur où tu dois intervenir
Video sur le routage CakePhp à la 5ème minutes 50
Il ne trouve aucun "$this->url" dans tous le dossier App
Pour afficher mais page j'utilise sa dans le menu.ctp
<?php foreach($pages as $k=>$v): $v = current($v); ?>
<li><?php echo $this->Html->link('<span>'.$v'name'].'</span>',$v'link'],array('escape' => false)); ?></li>
<?php endforeach; ?>
Donc sur les liens j'obtiens : "http://localhost/site/page/contact-13"
Seulement le résultat que je veut c'est juste avoir : "http://localhost/site/contact"
J'ai essayer de mettre dans mais routes :
Router::connect('/:slug',array('controller'=>'pages','action'=>'show'),array('pass'=> array('slug'),'slug'=>'[a-z0-9\-]+'));
Pour récupérer que le slug mais le problème c'est quant je mais "http://localhost/site/contact"
Et bien dans les requete SQL il me dit
WHERE `slug` IS NULL
Voici la fonction show je pense que sa viens de la car le routing et bon la mais je ne c'est pas quoi modifier
function show($id = null,$slug = null){
if(!$id)
throw new NotFoundException('Aucune page ne correspond à cet ID');
$page = $this->Post->find('first',array(
'conditions' => array('slug' => $slug,'type'=>'page')
));
if(empty($page))
throw new NotFoundException('Aucune page ne correspond à cet ID');
if($slug != $page'Post']'slug'])
$this->redirect($page'Post']'link'],301);
$d'page'] = current($page);
$this->set($d);
}
premièrement:
je pense que la fonction devrait être modifiée en ceci:
function show($id = null){
if(!$id)
throw new NotFoundException('Aucune page ne correspond à cet ID');
$page = $this->Post->find('first',array(
'conditions' => array('type'=>'page')
));
if(empty($page))
throw new NotFoundException('Aucune page ne correspond à cet ID');
$d'page'] = current($page);
$this->set($d);
}
ca c'est de 1
secondement:
le problème c'est par defaut n'a pas dans ces templates la vue show (il y a les index,view,edit, add et les même fonctions préfixées par admin_)
donc cet appel viens de ton router, il faudrait donc également que tu enlèves la ligne qui aiguilles vers la vue/action show et garder quelquechose par défaut (en rajoutant tes routes persos)
app/Config/routes.php
/**
* ...une ligne de route perso -> ici pour www.exemple.com/recherche
*/
Router::connect('/recherche', array('controller' => 'posts', 'action' => 'recherche'));
/**
* ...une autre route perso -> ici pour www.exemple.com/connect
*/
Router::connect('/connection', array('controller' => 'users', 'action' => 'login'));
/**
* ...les routes par defaut (page de base/home et l'affichage des pages que moi j'appelle statique genre y a pas trop de logique dedans)
*/
Router::connect('/', array('controller' => 'pages', 'action' => 'display','home'));
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
troisièmement:
Il reste la dure tache de faire un tour dans tes vue et d'enlever les accès à la vue/action show
<?php echo $this->Html->link('<span>'.$v'name'].'</span>',$v'link'],array('escape' => false)); ?>
et laisser ceci
<?php echo $this->Html->link('<span>'.$v'name'].'</span>', array('controller'=>'TONMODEL', 'action'=>'view', $v'id']), array('escape'=>false)); ?>
Remarques:
C'est un avis perso, vu que je penses que le slug c'est vachement bien (même niveau SEO) tu aurais pu également une fois que tu récupère l'id grâce au slug faire une redirection en te basant sur l'id
De plus pour ce qui est de la fonction show j'ai oublié de précisé que si tu as changé tes liens et donc ne sollicite plus cette ligne de route (relié au slug) tu peut carrément effacer les deux (la ligne dans routes.php et la fonction show() dans PostsController.php)
J'espère que cela répond à ta question
Bonne continuation
Merci de m'avoir aider seulement je vient d'y passer une heure à me casser la tête et j'ai réussi ^^
Je vous poste ma méthode car je pense pas qu'elle soit super si vous voyer des erreurs dite le moi
Alors dans mon routes j'ai mis seulement sa :
Router::connect('/:slug', array('controller' => 'pages', 'action' => 'page_list'),array('pass'=> array('slug'),'slug' =>'[a-z0-9\-]+'));
Dans mon PagesController j'ai crée cette fonction :
function page_list($slug,$id = null){
if(!empty($this->params'slug'])){
$page = $this->Post->find('first',array(
'conditions' => array('slug' => $slug),
'fields' => array('id','slug')
));
$id = $page'Post']'id'];
if(empty($page))
throw new NotFoundException('Aucune page ne correspond à cet ID');
if($id != $page'Post']'id'])
$this->redirect($page'Post']'link'],301);
$find = $this->Post->find('first',array(
'conditions' => array('id' => $id),
));
$d'find'] = current($find);
$this->set($d);
}
}
Puis maintenant je peux appeler directement mon slug et sa fonctionne, mais je pense pas que ma fonction ne sois top je débute sur cakephp ^^
Donc si vous voyer une amélioration sa serait sympas :)