Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Form
Zend_Form Forum d'entraide pour le composant Zend_Form du Zend Framework (création de formulaires, helpers, AJAX etc.). Avant de poster -> FAQ Zend_Form.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/03/2008, 16h30   #1
Membre actif
 
Inscription : décembre 2002
Messages : 325
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2002
Messages : 325
Points : 187
Points : 187
Par défaut Zend_Form Validation sur deux champs simultanément

Bonjour à tous, je continue mon exploration du Zend Framework, et j'ai vu avec joie que la classe Zend_Form était enfin apparue dans le RC1.5.

Mon problème est assez basique, j'ai un formulaire dans lequel je demande de saisir un mot de passe et ensuite de le confirmer. Donc coté serveur je voudrais faire une validation vérifiant que le deux champs saisis sont bien identiques.

J'avais réussi à le faire il y a quelques temps, lorsque la Zend_Form n'existait pas, en utilisant un code ressemblant à ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
$validators = array('password' => array (
				new Zend_Validate_StringLength(6, 30),
				'messages' => array(Zend_Validate_StringLength::TOO_LONG => 'Le mot de passe ne doit pas dépasser 30 caractères',
									Zend_Validate_StringLength::TOO_SHORT=> 'Le mot de passe doit contenir au moins 6 caractères')				
			),
                  'passwordEqual' => array(
			        'StringEquals',
				'fields' => array('password', 'passwordConfirm'),
				'messages' => 'Veuillez vérifier la confirmation du mot de passe'
			)
		);
$input = new Zend_Filter_Input(null, $validators, $this->data);
$input->addNamespace('MyValid');
if (!$input->isValid()) {
   return $input->getMessages();
}
j'ai donc créé une classe MyValid_StringEquals qui étend Zend_Validate_Abstract et ça fonctionnait bien.

Seulement avec le Zend_Form j'utilise maintenant cette syntaxe :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$form = new Zend_Form();
		//$form->setAction('/user/submitcreate');
		//$form->setMethod('post');
 
		// création du champ login
		$pseudo = new Zend_Form_Element_Text('pseudo');
		// TODO écrire la bonne regex
		$pseudoRegexValidator = new Zend_Validate_Regex('/^[a-zA-Z]+[-+a-zA-Z0-9_]*$/');
		$pseudoRegexValidator->setMessage('Le pseudo n\'est pas au bon format');
		$pseudo->addValidator($pseudoRegexValidator);
 
		//création du champ password
		$password = new Zend_Form_Element_Password('password');
 
		//création du champ de confirmation du password
		$passwordConfirm = new Zend_Form_Element_Password('passwordConfirm');
Et là c'est le drame, je ne sais pas comment ajouter mon validator StringEquals au bon élément (password ou passwordConfirm ?) pour indiquer que les deux champs doivent être identiques.

Sauriez-vous comment faire ça ?

Merci d'avance.
sir_gcc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2008, 20h57   #2
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 41
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2007
Messages : 41
Points : 35
Points : 35
Hello!

J'ai eu le même problème. Voici ce que j'ai fait:

J'ai créé mon propre validateur pour le 2ème champ mot de passe. Ensuite, dans ce validateur j'ai récupéré la valeur du premier champ grâce à la variable "context" qui contient toutes les valeurs des champs du formulaire. Et ensuite, j'ai vérifié que les champs sont bien identiques.

Voici le code du validateur:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
class My_Validate_PasswordEquals extends Zend_Validate_Abstract
{
  const NOT_EQUALS = 'passwordNotEquals';
 
  protected $_messageTemplates = array(
    self::NOT_EQUALS => "La confirmation du mot de passe ne correspond pas"
  );
 
  public function isValid($value, $context = null)
  {
    $value = (string) $value;
    $this->_setValue($value);
 
    if (is_array($context)) {
      if (isset($context['password1']) && ($value == $context['password1']))
      {
        return true;
      }
    } 
    elseif (is_string($context) && ($value == $context)) {
      return true;
    }
 
    $this->_error(self::NOT_EQUALS);
    return false;
  }
}
coolcoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 15h05   #3
Invité de passage
 
Inscription : janvier 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 14
Points : 3
Points : 3
Trouvé ça tout à l'heure en surfant, ca peut peut etre t'aider ?
Code :
1
2
3
4
5
6
7
 
$form->addField('password')
    ->addValidator(new Zend_Validate_Alnum())
    ->addFilter('md5');
$form->addField('password_confirmation')
    ->addConditional('valid', 'password')
    ->addValidator('Matches', 'password');
bertra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 21h29   #4
Membre actif
 
Inscription : décembre 2002
Messages : 325
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2002
Messages : 325
Points : 187
Points : 187
Bertra, ce code ne semble pas valide avec la version 1.5.
Code :
->addValidator('Matches', 'password');
Merci quand même.
sir_gcc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h20   #5
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Salut,

Voici ce que la doc préconise : http://framework.zend.com/manual/en/...ommands.fields

Bon courage.
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h34.


 
 
 
 
Partenaires

Hébergement Web