Salut,
Depuis quelque jours j'ai un problème avec ma gestion des utilisateur. Le problème est qu'il y a une règle de validation que j'ai créer moi même. Pour vérifier que l'utilisateur rendre deux mots de passe identique. J'ai essayer avec un beforeSave et ça fonctionne du coté administration, mais plus quand l'utilisateur veux modifier les informations de son compte. J'ai essayé de trouver via la documentions de CakePHP.

La fonction admin_edit

public function admin_edit($id=null){
         if($this->request->is('post') || $this->request->is('put') ){
            $d = $this->request->data'User'];
            if($d'password'] != $d'password2']){
                $this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'error'));
            }else{
                if(empty($d'password']))
                    unset($d'password']);
                if($this->User->save($d)){
                    $this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
                }
            }
        }elseif($id){
            $this->User->id = $id; 
            $this->request->data = $this->User->read('username,role,id'); 
        }
        $d = array(); 
        $d'roles'] = array(
            'admin' => 'admin',
            'user' => 'membre'
        );
        $this->set($d);
    }

La règle de validation personalisé :

'password' => array(
            'rule' => 'notEmpty'
        ),
        'password2' => array(
            'rule' => 'identicalFields',
            'required' => false,
        ),

Ps la règle de validation vient de la formation sur Apprendre CakePhp.
Merci de votre aide en avance.

5 réponses


kal-el
Réponse acceptée

Pourquoi avoir une validation a la fois dans ton model et dans ton controlleur? D on't R epeat Y ourself

Dans ton model User tu peux faire ça :

public $validate = array(
    'password' => array(
        array(
            'rule' => 'notEmpty',
            'message' => "Le mot de passe ne peut pas être vide",
            'allowEmpty' => false
        ),
        array(
            'rule' => array('identicalFieldValues', 'password2'),
            'message' => "Les passwords doivent être identique"
        )
    )
);

public function identicalFieldValues( $field=array(), $compare_field=null ){
    foreach( $field as $key => $value ){ 
        $v1 = $value; 
        $v2 = $this->data$this->name]$compare_field];                  
        if($v1 !== $v2) return false;
        else continue;
    } 
    return true; 
}
philieric
Réponse acceptée

Pour pouvoir encoder ton mot de passe tu le fait dans le modèle user avec une fonction beforeSave

public function beforeSave() {
    if (isset($this->data$this->alias]'password'])) {
        $this->data$this->alias]'password'] = AuthComponent::password($this->data$this->alias]'password']);
    }
    return true;
}

Hum je vais peut-être dire un truc idiot mais là tu es dans ta fonction admin_edit. Pour l'utilisateur c'est la fonction edit (sans le prefix admin) fait la vérification aussi à ce niveau là.

if($d'password'] != $d'password2']){

est-ce que les champs de ton formulaires, ont les mêmes noms ? (password et password2) dans ta vue edit d'utilisateur.

lakamark
Auteur

Pour en codé le mot de passe je fait un return AuthComponent::password($v1) pour encodé le mot de passe. Pour que celui-ci ne soi pas claire dans ma BDD. Je veux utilisé toute la puissance des models pour éviter d'alourdir mes controllers.

lakamark
Auteur

Merci beaucoup à kal-el et philieric
@kal-el : Je vais tenir compte de ton conseille " D on't R epeat Y ourself" pour mes code source.