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.

21 réponses


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".

djtec
Auteur

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.

djtec
Auteur

Ah oui en inversant la fonction is_numeric et $id == null ça fonctionne.

Merci ++

N'oublie pas de mettre en résolu

djtec
Auteur

Et comment on fait car j'ai aucun bouton pour ça????

djtec
Auteur

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.

djtec
Auteur

Personne????

djtec
Auteur

Toujours personne?

Il te demande la fonction cakephp pour quel controller dans le message d'erreur?

djtec
Auteur

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.

djtec
Auteur

???

djtec
Auteur

Personne peut m'aider car j'ai vraiment besoin que cela fonctionne.

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.

djtec
Auteur

Et comment tu fais si y a pas de id dans l'url pour afficher 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.

djtec
Auteur

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

djtec
Auteur

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.

djtec
Auteur

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.