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
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
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);
}
La validation javascript qui bloc lorsque l'on valide le formulaire. J'ai oublié quelque chose pour la validation php ?
Merci pour ton aide
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
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
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'));
?>
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 :)
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 ? :)
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
Non il met required="required" à l'input (email ou autre) si dans ta validation tu as dis que ce champ est required.
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
Oui mais quand je dis "on" => "created" dans la validation, il ne devrait pas mettre required=required dans le formulaire de modification non ?
Mais oui il est pas sensé le mettre, si il le met quand même c'est une anomalie du framework
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..