Salut à toutes et à tous!
C'est mon premier message sur le forum et je tiens à remercier Jonathan pour son travail formidable!
Ceci étant dit, Je me suis retrouvé confronté à un petit souci sur le tuto.
Ca se passe au moment au je désire modifier une page. Je clique sur éditer, je supprimer le slug et là il m'affiche le message d'erreur sur le champs "L'url n'est pas valide" au lieu de me rediriger vers la page admin index et me remplir le slug automatiquement.
En gros, le slug ne se remplit pas, s'il est vide, il me demande de le remplir.
Voici mes codes :

Model -> Post.php

<?php
class Post extends AppModel{

    public $validate = array(
        'slug' => array(
            'rule' => '/^[a-z0-9\-]+$/',
            'allowEmpty' => 'true',
            'message' => "L'url n'est pas valide"
        ),
        'name' => array(
            'rule' => 'notEmpty',
            'message' => "Vous devez préciser un titre"
        )
    );

    public function afterFind($data){
        foreach($data as $k=>$d){
            if(isset($d'Post']'slug']) && isset($d'Post']'id'])){
                $d'Post']'link'] = array(
                  'controller' => 'pages',
                  'action' => 'show',
                  'id' => $d'Post']'id'],
                  'slug' => $d'Post']'slug']
                );
            }
            $data$k] = $d;
        }
        return $data;
    }

    public function beforeSave(){
        if(empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name'])) {
            $this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'], '-'));
        }
        return true;
    }

}

Controller -> PagesController.php

<?php
class PagesController extends AppController {

    public $uses = array('Post');

    /**
    * RequestAction, permet d'avoir la liste des contenus pour le menu
    **/
    function menu(){
        $pages = $this->Post->find('all', array(
          'conditions' => array('type' => 'page', 'online' => 1),
          'fields' => array('id', 'slug', 'name')
        ));
        return $pages;
    }

    /**
    * RPermet d'afficher une page
    **/
    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('id' => $id)
        ));
        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);
    }

    /**
    * 
    **/
    function admin_index(){
        //$this->paginate = array('Post' => array('limit' => 1));
        $d'pages'] = $this->Paginate('Post', array('type' => 'page'));
        $this->set($d);
    }

    function admin_edit($id = null){
        if($this->request->is('put') || $this->request->is('post')){
            if($this->Post->save($this->request->data)){
                $this->Session->setFlash("Le contenu a bien été modifié", "notif");
                $this->redirect(array('action' => 'index'));
            }
        }elseif($id){
            $this->Post->id = $id;
            $this->request->data = $this->Post->read();
        }
    }
    function admin_delete($id){
        $this->Session->setFlash('La page a bien été supprimé', 'notif');
        $this->Post->delete($id);
        $this->redirect($this->referer());
    }

}

Voilà, je pense que le problème doit se situer dans un de ces 2 fichiers, sinon je n'ai aucune idée de l'endroit après y avoir planché un moment.

Merci d'avance pour votre aide! :)

8 réponses


Gyuki
Réponse acceptée

Je sais pas mais ne serait ce pas a cause de ton

'allowEmpty' => 'true',

au lieu de

'allowEmpty' => true,

1er cas string qui vaux false
2nd cas boolean qui vaut false

kal-el
Réponse acceptée

@Gyuki, pas sur en faite, car PHP étant un langage assez souple et peu restrictif, une égalité de ce type marche par exemple :

$value = 'true';
if($value == true){
    // code
}

alors que sa non :

$value = 'true';
if($value === true){
    // code
}

Apres, faut voir comment Cake vérifie cette valeur :)

@LivinInChina, essaye ce que Gyuki ta dis et vois si sa marche, sinon, je pense alors que le problème vient de ta regex. Je n'ai malheureusement rien sur moi tout de suite pour vérifier.

Salut,

Etant donnee que tu creer toi-meme le slug via Inflector , tu sais normalement que tu creer une url valide. Par contre a la place de verifier si l'url est valide :

public $validate = array(
        'slug' => array(
            'rule' => '/^[a-z0-9\-]+$/',
            'allowEmpty' => 'true',
            'message' => "L'url n'est pas valide"
        ),
        // name
);

Tu peux verifier que cette url est unique dans tes regles de validations :

public $validate = array(
        'slug' => array(
            'rule' => 'isUnique',
            'required' => true,
            'message' => "L'url existe deja"
        ),
        // name
);

Merci à toi kal-el

Etant donné que je suis le tuto scrupuleusement, j'aurai aimé savoir pourquoi mon code ne fonctionnait pas.
Je me suis relu plusieurs fois et je ne comprends pas pourquoi ça ne fonctionne pas.

Sans tenter de détourner le système, tu vois un endroit où j'aurai oublié quelque chose?

En tout cas merci du tuyau, ça me sauve la mise, mais j'aimerai vraiment comprendre d'où vient ce problème.

Merci d'avance :)

Merci à tous les deux pour votre intérêt.

@Gyuki : Bien vu! C'était exactement ça le problème. En effet, true doit être un boolean dans ce cas, cette option du code ne prend pas de chaine de caractère ou du moins, ne comprend pas un boolean en string.

Merci encore, problème résolu :)

Bonjour kal-el,

Ce que tu dit est a demi-correct, en effet la condition ci-dessous affichera le code dans la partie VRAI mais pas parce que le test fonctionne mais parce qu'en PHP, une chaîne de caractère non vide est VRAI. Donc dans l'état actuel du code, quoi que tu mette dans $value autre que $value = ''; sera VRAI même si tu met $value = 'false';

$value = 'true';
if($value == true){
    // code
}

Merci pour la révision Gyuki, c'est une erreur que dorénavent j'éviterai en sachant ça.

@Gyuki, oui en effet tu as raison :)
Je voulais juste en faite démontrer qu'il se pourrai (tout dépendant du code utiliser par Cake) que la condition marche quand meme. Je m'y prendrai mieux dans ma demarche la prochaine fois xD
Bon en tout cas le sujet est bien résolu, c'est le principal :)

a+