Bonjour à tous,

J'ai créé le modèle suivant:

public $validate = array(
        'username' => array(
            array(
                'rule' => 'alphanumeric',
                'required' => true, 
                'allowEmpty' => false,
                'message' => "Votre pseudo n'est pas valide"
            ),
            array(
                'rule' => 'isUnique',
                'message' => "Ce pseudo est d?©j?† utilis?©"
            )
        ),

        'email' => array(
      array(
                'rule' => 'email',
                'required' => false,
                'allowEmpty' => true,
                'message' => "Votre email n'est pas valide",
        'on' => 'create'
            ),
            array(
                'rule' => 'isUnique',
                'message' => "Cet email est d?©j?† utilis?©"
            )
        )
)

Mais il se trouve que la validation de l'email s'applique tout le temps et pas uniquement sur l'action create. Il y a t-il d'autres choses à faire pour que ceci soit pris en compte ?

Merci pour votre aide

26 réponses


antho07
Réponse acceptée

Je comprends mieux, en effet c'est très problématique ..

Bah va falloir contrer le js par du js alors...

au chargement de la page pour update, il faut retirer l'attribut required ou le mettre à false sur l'input email

Bonjour,
on peut avoir le code de l'action dans laquelle le problème se pose?

cakeuser
Auteur

Le voici :)

public function update(){
        $user_id= $this->Auth->user('id');
        if(!$user_id){
            $this->redirect('/');
            die();
        }
        $this->User->id = $user_id;
    $user = $this->User->read(null, $user_id);
        if (!$this->User->exists()) {
            throw new NotFoundException(__('Invalid user'));
        }
        if($this->request->is('post')){
            $data = $this->request->data;
            $data'User']'id'] = $user_id;
      $message ='';
      if(!empty($data'User']'email']) && !empty($data'User']'confirmation_email'])){
        if($data'User']'email'] == $data'User']'confirmation_email']){
          $user'User']'active'] = 0;
          $message = "Vous avez modifiée votre adresse email, afin de la valider vous allez recevoir un email, suivez ses instructions";

        }
        else{
          $this->redirect('/users/update/' . $user_id);
        }
      }

      if(!empty($data'User']'password']) && !empty($data'User']'confirmation_password'])){
         if($user'User']'password'] == Security::hash($data'User']'old_password'], null, true)){
           if($data'User']'password'] == $data'User']'confirmation_password']){
              $data'User']'password'] = Security::hash($data'User']'password'], null, true);
           }
           else{
             $this->redirect('/users/update/' . $user_id);
           }
         }
         else{
             $this->redirect('/users/update/' . $user_id);
         }
      }

            if($this->User->save($data, true, array('password', 'email'))){
                $this->Session->setFlash('Vos informations ont bien été modifiées ' . $message, 'notif', array('type' => 'success', 'notification'));

            }
            else{
                $this->Session->setFlash('Erreur', 'notif', array('type' => 'error', 'notification'));
            }
            $this->redirect('/users/view/' . $user_id);
        }
        $this->set('user', $user);
    }

Essaye de virer l'id de data,
de pas faire ça : ($data'User']'id'] = $user_id;) pour voir ?

La validation de l'email , laquelle ?

cakeuser
Auteur

La validation javascript qui bloc lorsque l'on valide le formulaire. J'ai oublié quelque chose pour la validation php ?

Merci pour ton aide

cakeuser
Auteur

J'ai enlevé la ligne dont tu parlais mais ça ne change rien.

La validation javascript ???
T'as donné du code php là..., pouvais pas deviner que le problème venait du js... , il faut le code javascript alors mais là va falloir être astucieux pour distinguer les cas si c'est le meme formulaire qui crée ou qui update

cakeuser
Auteur

En fait, je n'ai pas rajouté de javascript mais quand je mets le champs required j'ai bien du javascript qui m'empêche de continuer car dans le formulaire le champs est "required" à cause de la validation

Je pensais que de rajouter "on" => "created" retirait l'attribut required de mon champ.

Je ne sais pas si je suis très claire ?

Non pas trop :s, ton code enleve le require coté php pour la creation , pas pour la mise à jour,

on peut avoir le code de la vue ??:s

'email' => array(
array(
'rule' => 'email',
'required' => false,
'allowEmpty' => true,
'message' => "Votre email n'est pas valide",
'on' => 'create'
),

La tu lui dis d'appliquer cette règle uniquement pour la création ,
Maintenant t'as peut être mis quelque chose dans la vue qui pose pb, à voir

cakeuser
Auteur

Voici la vue:
Merci ! :)

<?php echo $this->Form->create('User', array('url' => '/users/update'));
              echo $this->Form->input('email', array('value' => $user'User']'email'], 'label' => 'email:'));
              echo $this->Form->input('confirmation_email', array('label' => 'confirmation email:', 'value' => ''));
              echo $this->Form->input('old_password', array('label' => 'ancien mot de passe: ', 'type' => 'password', 'value' => ''));
              echo $this->Form->input('password', array('label' => 'nouveau mot de passe', 'type' => 'password', 'value' => ''));
              echo $this->Form->input('confirmation_password', array('label' => 'confirmation mot de passe', 'type' => 'password', 'value' => ''));
              echo $this->Form->end(__('Valider'));
            ?>

'on' => 'create' remplace par 'on'=>'update' pour voir ..

cakeuser
Auteur

Ca ne change rien.
Je ne sais pas comment faire !

En tout cas merci pour ton aide, si tu as d'autres idées n'hésite pas :)

C'est la validation php qui bloque ??
la première règle de l'email c bien ça ?

cakeuser
Auteur

Je viens de comprendre quelques chose, l'attribut required="required" ajouté par la validation à l'input email est interprété automatiquement en javascript par chrome et firefox qui empêche donc de continuer si ce n'est pas renseigné (ce n'est pas le cas sous IE c'est bien le PHP qui me bloque).
C'est donc bien du javascript qui me bloque mais il n'est pas généré par cakephp.

Mais je ne sais pas comment contourner le problème puisque c'est cakephp qui ajoute required="required". Je suis claire ? :)

cakeuser
Auteur

Oui je vais essayer ça :)
Merci pour ton aide !

Heu ça veut dire que cakePhp met automatiquement un required="true" aux emails sans se soucier des validations ? C'est ça le comportement du helper de base??? ça me semble fortement suspicieux ça..:s

cakeuser
Auteur

Non il met required="required" à l'input (email ou autre) si dans ta validation tu as dis que ce champ est required.

Oui mais là dans ton cas tu l"as pas mis ....

cakeuser
Auteur

J'ai collé le mauvais code.. car j'ai fait plusieurs tests. et donc quand c'est à required ça l'ajoute à l'input.
C'est bizarre que personne n'est soulevé ce petit bug ?

Bah non si tu le mets en required tous le temps, c'est pas incohérent qui mette cet attribut. Cela évite un échange serveur/client pour rien

cakeuser
Auteur

Oui mais quand je dis "on" => "created" dans la validation, il ne devrait pas mettre required=required dans le formulaire de modification non ?

c'est pas created mais create je crois

Mais oui il est pas sensé le mettre, si il le met quand même c'est une anomalie du framework

cakeuser
Auteur

Oui j'ai bien mis "create", je pense donc que c'est une anomalie mais c'est bizarre que personne ne l'ai relevée..