Salut tous :)

Bon voilà je suis actuellement le tutoriel de Grafikart sur cakephp, mais j'ai actuellement un souci. J'ai un modèle quelconque (ici c'est un User), une base de données (users) et un formulaire (qui fait bien un

<?php echo $this->Form->create('User'); ?>

). Le problème c'est que lorsque je valide le formulaire, j'ai l'impression que la validation dans le modèle ne s'effectue pas (j'ai tout simplement ceci) :

public $validate = array(
            'username' => array(
                'rule' => 'alphanumeric',
                'message' => "Lettres et chiffres"
            )
        );

Je ne comprends pas pourquoi il ne le valida pas ... (je mets des ignes ou quoi rien ne s'affiche comme message). J'ai ma base de données users reliée à un modèle dans le bon dossier qui s'appelle User et le formulaire faire appel au modèle User également. Quelqu'un a une idée ?

12 réponses


Maenhyr
Réponse acceptée

Si tu ne fais rien dans ton Controller, il est normal que ta validation ne s'effectue pas. La validation est effectuée de 2 manières :

  • soit dans save()

  • Soit en direct avec validates()

La méthode save() va d'abord lancer la méthode validates().

public function signup(){
    $this->User->set($this->request->data);
    debug($this->User->validates());
}

Peux tu envoyer le code de ta vue stp ?

<div class="row">
    <div class="span12">
        <div class="page-header">
            <h3>S'inscrire sur XXXXXX !</h3>
        </div>
        <?php echo $this->Form->create('User'); ?>
            <?php echo $this->Form->input('username'); ?>
        <?php echo $this->Form->end("S'inscrire"); ?>
    </div>
</div>

Le plus simple que j'ai trouvé :p

D'après la doc, c'est alphaNumeric au lieu de alphanumeric.

public $validate = array(
            'username' => array(
                'rule' => 'alphaNumeric',
                'message' => "Lettres et chiffres"
            )
        );

En effet. Mais quand je dis que la validation ne se fait pas c'est qu'elle ne se fait pas. Je peux mettre 'rule' => array('minLength', '8') que ça ne marche pas non plus ^^

Change ton code de validation

public $validate = array(
            'username' => array(
                'rule' => 'alphanumeric',
                'message' => "Lettres et chiffres"
            )
        );

en ca :

public $validate = array(
        'username' => array(
            'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'required' => true,
                'message' => 'Chiffres et lettres uniquement !'
            ), ..

je te refiles un exemple de ce que j'utilise:

public $validate = array(
        'username' => array(
            'notempty' => array(
                'rule' => array('notempty'),
                'message' => 'Vous devez rentrer un nom d\'utilisateur',
            ),
            '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.'
            )          
    ),
...

j'espère que cela fonctionnera :)

Comme je l'ai dit, j'ai beau mettre tes validations, elle ne s'effectue jamais.

<?php
    class User extends AppModel
    {
        public $validate = array(
            'username' => array(
                'notempty' => array(
                    'rule' => array('notempty'),
                    'message' => 'Vous devez rentrer un nom d\'utilisateur',
                ),
                '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.'
                )
            )          
        );
    }

J'ai beau valider le formulaire avec un champ vide ou quoi aucun message comme s'il n'y avait pas de validations

Peux tu nous envoyer ton Controller stp ?

Bonjour,

Est-ce que tu parles de la validation manuel des données pour vérifier leur intégrité dans ton controlleur ou bien de leur validation via la méthode save? Car pour le premier cas, si tu veux faire ça dans ton controlleur :

public function register(){
    if($this->User->validates()){
        // Si tout est ok, on sauvegarde
    }
}

Tu as peux-être oublié de fournir les données à ton model via la méthode set , comme ceci :

public function register(){
    $this->User->set($this->request->data);
    if($this->User->validates()){
        // Si tout est ok, on sauvegarde
    }
}

1 - un pr($this->validationErrors); dans ton code qu'est ce que cela t'affiche?
2 - tu n'as pas dans ton model un beforeFIlter dont le code annulerait ta validation
3 - ou dans ton controller tu n'aurais pas comme deuxieme argument de la fonction save un false qui annule la validation
if ($this->MODEL-> save ($this->request->data, false ))
4 - Donner comme à dit Pierre Baron le controller mais également le model :)

pr($this->validationErrors); n'affiche rien
Pas de before filter
Pas de vérification dans le controlleur

<?php
    class UsersController extends AppController
    {
        public $uses = array('User');
        public function signup()
        {

        }
    }

<?php
    class User extends AppModel
    {
        public $validate = array(
            'username' => array(
                'notempty' => array(
                    'rule' => array('notempty'),
                    'message' => 'Vous devez rentrer un nom d\'utilisateur',
                ),
                '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.'
                )
            )
        );
    }

Mhh ok c'est si con que ça. Merci je pensais que la validation s'effectuait toute seule une fois le formulaire relié au modèle. Encore merci pour tout.