Bonsoir,
Alors mon mon site à des url comme ceci: http://www.monsite.com/categorie/cakephp-1
cakephp-> correspond au titre de la catégorie
1 -> correspond à l'id de la catégorie
Ce que j'essaye de faire c'est que si on tape http://www.monsite.com/categorie/cakephp alors on est redirigé sur une erreur 404 comme dans la page tutoriels de Grafikart mais non cakephp me dit que la fonction cakephp() n'est pas dans mon fichier.
Voici mon route.php
Router::connect('/categorie', array('controller' => 'categorie', 'action' => 'index'));
Router::connect(
'/categorie/:title-:id',
array(
'controller' => 'categorie',
'action' => 'viewCat'
),
array(
'pass' => array('title', 'id'),
'title' => '[a-zA-Z0-9_-]+',
'id' => '[0-9]+'
)
);
Router::connect(
'/categorie/fiche/:title-:id',
array(
'controller' => 'categorie',
'action' => 'fiche'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Et voici ma fonction viewCat:
function viewCat($title = null, $id = null) {
echo $id.' /// '.$title;
if(!is_numeric($id) || $id == null){
$this->cakeError('e404');
exit();
} else {
echo 'id et titre correct';
}
}
Je sais plus quoi faire!!!
Merci d'avance.
Essaie plutôt du côté des messages d'erreurs de Cake.
Tu prends tous les fichiers de {racine}/cake/libs/view/errors et tu les colles dans {racine}/app/views/errors et tu modifies tous les fichiers avec l'affichage d'erreur que tu veux. Dans ce genre.
<h1>Erreur 404 - La page demandée n'existe pas</h1>
<p>La page que vous demandez n'existe pas.</p>
C'est pas exactement ce que tu veux, mais ça aura le mérite de fonctionner et d'afficher une vraie page "Erreur 404".
Non ça fonctionne pas cakephp me dit toujours que ma fonction cakephp n'est pas dans le controller au lieu de mettre mon erreur 404
Dans le fonction viewCat tu as mis que si $id n'était numeric(numérique ou pas on s'en fou) ou que si $id était égal à null ça renvoyait à une erreur 404. C'est ce qui se passe lorsque tu ne me pas l'idée. Elle vaut null.
En faites j'ai encore un petit problème sur grafikart quand tu vas à cette adresse http://www.grafikart.fr/tutoriels/multi-langue-cakephp-154 ça fonctionne et si tu vas à celle-ci http://www.grafikart.fr/tutoriels/multi-langue-cakephp tu as une erreur 404 et moi je cherche à faire mais après ça merde.
Car ça http://www.monsite.com/recettes/category/cakephp-1 -> OK il affiche bien viewCat
Ca http://www.monsite.com/recettes/mon-truc-113 -> OK il affiche bien fiche
Ca http://www.monsite.com/recettes/mon-truc -> OK il affiche bien error
Ca http://www.monsite.com/recettes/category/cakephp -> Pas ok il demande la fonction cakephp
Voici mon fichier route.php:
/* Router Recettes */
Router::connect('/recettes', array('controller' => 'recettes', 'action' => 'index'));
Router::connect('/recettes/pages/*', array('controller' => 'recettes', 'action' => 'index'));
Router::connect(
'/recettes/category/:title-:id',
array(
'controller' => 'recettes',
'action' => 'category'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Router::connect(
'/recettes/:title-:id',
array(
'controller' => 'recettes',
'action' => 'fiche'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Router::connect('/recettes/*', array('controller' => 'recettes', 'action' => 'error' ));
Donc j'attends votre avis!!!!!!
Merci d'avance.
Je te montre avec les url de Grafikart.
Pour voir un tutoriel tu va ici: http://www.grafikart.fr/tutoriels/calendrier-php-157
Mais si tu tape http://www.grafikart.fr/tutoriels/calendrier-php ça te met une erreur 404.
Et ben moi il me demande la fonction calendrier-php du controller tutoriels.
Pour moi tutoriels correspond à recettes, et calendrier-php sera le titre renvoyé à la fonction fiche ou je vérifie si le titre et l'id existe.
Et j'aimerais bien savoir comment il a fait pour mettre cette erreur quand on retire l'id de l'url.
C'est normal djtec.
La chose est que le système est codé comme dans won tuto à savoir que la page est récupérée s'il existe un id transmis.
S'il n'y a pas d'id transmis il n'y a pas de requete sql possible et donc une erreur 404.
function taFonction($id, $url){
if(!id) throw new NotFoundException('Aucune page de correspond à cette URL');
}
Mais tu peux aussi faire le choix de vérifier que le slug est bon... mais ce n'est pas "bien" puisqu'il est amené à être modifier contrairement à l'id.
J'ai déjà fait ça mais lui il me cherche une fonction du nom du slug
Exemple:
http://www.monsite.com/recettes/cakephp-1 allias recettes/category/cakephp-1 OK il me charge le controller recettes et l'action catégorie
Par contre:
http://www.monsite.com/recettes/category/cakephp allias recettes/category/cakephp il me charge le controller recettes et la fonction cakephp
Pour lui ça rentre pas dans la règle de la première url donc pour lui cakephp est une fonction et pas un slug vu qu'il y a pas d'id c'est pour cela que je voulais que Grafikart m'explique comment lui il a fait.
Je n'avais pas compris que c'était à ton problème.
J'ai rencontré exactement ce soucis hier et j'ai poster la solution ici : rewriting URL avec catégories
Ca marche pas.
Voici mon url http://www.monsite.com/recettes/mon-titre au lieu de http://www.monsite.com/recettes/mon-titre-12
Et il cherche toujours la fonction mon-titre au lieu de la fonction view.
Voilà mes routes:
Router::connectNamed(array('title'));
Router::connect('/recettes', array('controller' => 'recettes', 'action' => 'index'));
Router::connect('/recettes/pages/*', array('controller' => 'recettes', 'action' => 'index'));
Router::connect(
'/recettes/category/:title-:id',
array(
'controller' => 'recettes',
'action' => 'category'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Router::connect(
'/recettes/:title-:id',
array(
'controller' => 'recettes',
'action' => 'view'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Voilà mon controller:
function view($id = null, $title = null) {
echo $id.' /// '.$title;
if($id == null) {
throw new NotFoundException('Aucune page de correspond à cette URL');
}
}
Et voilà l'erreur:
Missing Method in RecettesController
Error: The action ma-recette is not defined in controller RecettesController
Error: Create RecettesController::ma-recette() in file: app/Controller/RecettesController.php.
<?php
class RecettesController extends AppController {
public function ma-recette() {
}
}
ce qu'il faut que tu définisses dans ton connectNamed c'est pas title mais category.
Je crois que du coup il faut que tu écrives quelque chose comme ça. (je suis pas sur n'ayant jamais testé cette forme la).
Router::connectNamed(array('category'));
Router::connect(
'/recettes/category:category/:title-:id',
array(
'controller' => 'recettes',
'action' => 'category'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Il faut du coup peut-être faire passer $category à l'action view($id, $title, $category)
Sinon explique moi pourquoi tu fais appelles dans ta route à l'action category alors que tu veux utiliser l'action "view"? Ya un soucis sur ce point aussi je pense.
Plutôt que d'écrire ça
if($id == null) {
throw new NotFoundException('Aucune page de correspond à cette URL');
}
écrit plutôt ça
if(!$id) {
throw new NotFoundException('Aucune page de correspond à cette URL');
}
ou
if(empty($id)) {
throw new NotFoundException('Aucune page de correspond à cette URL');
}
Les == par moment ne marchent pas dans les conditions pour je ne sais plus quelle raison. donc autant les éviter dans ce cas.
C'est pas la règle que tu viens de cité qui pose problème mais celle ci:
Router::connect(
'/recettes/:title-:id',
array(
'controller' => 'recettes',
'action' => 'view'
),
array(
'pass' => array('id', 'title'),
'id' => '[0-9]+',
'title' => '[a-zA-Z0-9_-]+'
)
);
Car c'est à cet endroit que si l'id est pas défini et bien il cherche :title comme fonction.