[Php] Zend_Form: comment vérifier 2 champs sont identiques


Answers

La version actuelle de Zend_Validate a ceci intégré - bien qu'il y ait beaucoup d'autres réponses, il semble que tous nécessitent de passer une valeur à Zend_Validate_Identical . Bien que cela ait pu être nécessaire à un moment donné, vous pouvez maintenant passer le nom d'un autre élément.

Dans la section Zend_Validate du guide de référence :

Zend_Validate_Identical supporte également la comparaison des éléments de formulaire. Cela peut être fait en utilisant le nom de l'élément comme token. Voir l'exemple suivant:

$form->addElement('password', 'elementOne');
$form->addElement('password', 'elementTwo', array(
    'validators' => array(
        array('identical', false, array('token' => 'elementOne'))
    )
));

En utilisant le nom des éléments du premier élément comme jeton pour le second élément, le validateur valide si le second élément est égal au premier élément. Dans le cas où votre utilisateur n'entre pas deux valeurs identiques, vous obtiendrez une erreur de validation.

Question

J'ai créé un formulaire pour ajouter un utilisateur à une base de données et rendre l'utilisateur disponible pour la connexion.

Maintenant, j'ai deux champs de mot de passe (le second est pour la validation de la première). Comment puis-je ajouter un validateur pour ce type de validation à zend_form?

Ceci est mon code pour les deux champs de mot de passe:

    $password = new Zend_Form_Element_Password('password', array(
        'validators'=> array(
            'Alnum',
            array('StringLength', array(6,20))
            ),
        'filters'   => array('StringTrim'),
        'label'     => 'Wachtwoord:'
        ));

    $password->addFilter(new Ivo_Filters_Sha1Filter());

    $password2 = new Zend_Form_Element_Password('password', array(
        'validators'=> array(
            'Alnum',
            array('StringLength', array(6,20))
            ),
        'filters'   => array('StringTrim'),
        'required'  => true,
        'label'     => 'Wachtwoord:'
        ));
    $password2->addFilter(new Ivo_Filters_Sha1Filter());



Vous pouvez accéder à tous les champs de formulaire à partir du validateur, vous pouvez également utiliser le constructeur pour transmettre des arguments supplémentaires

class Example_Validator extends Zend_Validate_Abstract{

const NOT_IDENTICALL = 'not same';

private $testValue;    

public function __construct( $arg ) {
      $this->testValue = $arg;    
   }

protected $_messageTemplates = array(
    self::NOT_IDENTICALL => "Passwords aren't same"
);    

public function isValid( $value, $context = null )
{
    echo  $context['password']; 
    echo '<br>';
    echo $this->testValue;

    return true;
}
}

appeler ce validateur

$form = new Zend_Form();
$form->setAction('success');
$form->setMethod('post');   
$form->addElement('text', 'username');
$usernameElement = $form->getElement('username');
$form->addElement('password', 'password');
$passwordElement = $form->getElement('password');
$myValidator2 = new Example_Validator("Hello !");   
$passwordElement->addValidator($myValidator2, true);    
$form->addElement('submit', 'submit');  
$submitButton = $form->getElement('submit');