Bonjour à tous.

J'ai besoin d'aide pour ajouter un formulaire d'inscription sur le résultat de la série 'Développez un site avec CakePHP'.

J'ai des champs de confirmation pour le mot de passe et l'email, et je passe par le modèle pour la validation de ces champs. Le but est d'avoir un message d'erreur pour avertir l'utilisateur que les champs ne concordent pas.

Mon problème, c'est que ces règles semblent ne pas s'appliquer et je ne comprends pas pourquoi.

Voilà le formulaire :

<?php echo $this->Form->create('User'); ?>
    <?php echo $this->Form->input('username',array('label'=>"Choisissez un login")); ?>
    <?php echo $this->Form->input('password',array('label'=>"puis un mot de passe")); ?>
    <?php echo $this->Form->input('passwordconfirm',array('label'=>"Confirmez le mot de passe", 'type' => 'password')); ?>
    <?php echo $this->Form->input('email',array('label'=>"Entrez un email")); ?>
    <?php echo $this->Form->input('emailconfirm',array('label'=>"Confirmez l'email")); ?>
<?php echo $this->Form->end("S'enregister"); ?>

et le modèle :

<?php
class User extends AppModel{
    public $validate = array(
        'username' => array(
            array(
                'rule' => 'alphanumeric',
                'allowEmpty' => false,
                'required' => true,
                'message' => 'Pseudo non valide !'),
            array(
                'rule' => 'isUnique',
                'message' => "Ce pseudo existe déjà !")
            ),
        'email' => array(
            array(
                'rule' => 'email',
                'allowEmpty' => false,
                'required' => true,
                'message' => "E-mail non valide !"),
            array(
                'rule' => 'isUnique',
                'message' =>'Cet email est déjà pris!')
            ),
        'emailconfirm' => array(
            'rule' => array('equalToField', 'emailconfirm'),
            'message' => 'Les email ne correspondent pas !'
            ),
        'password' => array(
            'rule' => 'notEmpty',
            'message' => "Vous devez choisir un mot de passe !"
            ),
        'passwordconfirm' => array(
            'rule' => array('equalToField', 'password'),
            'required' => true,
            'allowEmpty' =>false,
            'message' => 'Les mots de passe ne correspondent pas !'
            )
        );

        /**
        * Renvoie true si les valeurs des champs concordent
        * $field : nom du champ à comparer
        * $check de la forme array('nom_du_champ' => 'valeur')
        **/

    function equalToField($check,$field){
        die();
        return (current($check) === $this->data'User']$field]);
    }

Le die dans la fonction equalToField ne se fait pas lors des tests.
Ma règle de validation est correcte puisque si je l'applique aux champs email ou password, ça fonctionne.

j'ai beau chercher, je ne vois pas d'où ça vient, donc si quelqu'un pouvait m'aider :D

Merci d'avance.

4 réponses


Salut,

A tout hasard, essaye de mettre public devant la déclaration de function. Sinon à la place de emailconfirm ligne 26, tu devrais pas avoir email ?

Pour t'aider, voilà ce que j'utilise pour confirmer deux mots de passe:

$validate = array(
                        'password' => array(
                'required' => array(
                    'rule' => 'notEmpty',
                    'message' => 'Veuillez entrer un mot de passe'),
                                'to_short' => array(
                                            'rule' => array('minLength', '6'),
                                            'message' => 'Le mot de passe doit contenir au moins 6 caractères')
                            ),
            'temppassword' => array(
                'rule' => 'confirmPassword',
                'message' => 'Vous avez entré deux mots de passe différents'));

public function confirmPassword($password = null) {

        if ((isset($this->data$this->alias]'password']) && isset($password'temppassword']))
            && !empty($password'temppassword'])
            && ($this->data$this->alias]'password'] === $password'temppassword'])) {
            return true;
        }
        return false;
    }
Lhyrwaen
Auteur

Merci tu as raison c'est bien email et pas emailconfirm, erreur de copier-coller... Par contre, passer la fonction en public ne change rien.

J'avais une règle du style de la tienne au départ, mais je trouve plus pratique d'avoir une seule fonction de vérification.

Tout se passe comme si les règles emailconfirm et passwordconfirm étaient ignorées, car le die de equalToField ne se fait toujours pas, et je n'ai pas d'erreur non plus si je laisse le champs vide.

Je pense que c'est la manière dont tu appelles ta règle qui n'est pas bon.

Essaye de remplacer les lignes 26 et 34 ci-dessus par 'rule' => 'equalToField', en appelant juste ta fonction, sans rien lui passer en paramètre pour voir si déjà ta fonction est bien appelée.

Lhyrwaen
Auteur

J'ai trouvé... J'suis un peu à l'ouest des fois!
Le problème venait en fait de mon contrôleur. Dans ma fonction register, j'avais la condition suivante :

if($this->User->save($d, true, array('username','password', 'email')))

En n'ayant pas spécifié les champs de confirmation, leurs règles de validation étaient effectivement ignorées.

Merci encore de t'être penché sur mon problème ;)