Zend_Form: как проверить 2 поля одинаковы

Я создал форму, чтобы добавить пользователя в базу данных и сделать доступным для входа пользователя.

Теперь у меня есть два поля пароля (второе – для проверки первого). Как я могу добавить валидатор для такого вида проверки на zend_form?

Это мой код для двух полей пароля:

$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()); 

Когда я искал то же самое, я нашел этот очень хорошо работающий общий валидатор для идентичных полей. Я не нашел его сейчас, поэтому просто отправлю код …

 <?php class Zend_Validate_IdenticalField extends Zend_Validate_Abstract { const NOT_MATCH = 'notMatch'; const MISSING_FIELD_NAME = 'missingFieldName'; const INVALID_FIELD_NAME = 'invalidFieldName'; /** * @var array */ protected $_messageTemplates = array( self::MISSING_FIELD_NAME => 'DEVELOPMENT ERROR: Field name to match against was not provided.', self::INVALID_FIELD_NAME => 'DEVELOPMENT ERROR: The field "%fieldName%" was not provided to match against.', self::NOT_MATCH => 'Does not match %fieldTitle%.' ); /** * @var array */ protected $_messageVariables = array( 'fieldName' => '_fieldName', 'fieldTitle' => '_fieldTitle' ); /** * Name of the field as it appear in the $context array. * * @var string */ protected $_fieldName; /** * Title of the field to display in an error message. * * If evaluates to false then will be set to $this->_fieldName. * * @var string */ protected $_fieldTitle; /** * Sets validator options * * @param string $fieldName * @param string $fieldTitle * @return void */ public function __construct($fieldName, $fieldTitle = null) { $this->setFieldName($fieldName); $this->setFieldTitle($fieldTitle); } /** * Returns the field name. * * @return string */ public function getFieldName() { return $this->_fieldName; } /** * Sets the field name. * * @param string $fieldName * @return Zend_Validate_IdenticalField Provides a fluent interface */ public function setFieldName($fieldName) { $this->_fieldName = $fieldName; return $this; } /** * Returns the field title. * * @return integer */ public function getFieldTitle() { return $this->_fieldTitle; } /** * Sets the field title. * * @param string:null $fieldTitle * @return Zend_Validate_IdenticalField Provides a fluent interface */ public function setFieldTitle($fieldTitle = null) { $this->_fieldTitle = $fieldTitle ? $fieldTitle : $this->_fieldName; return $this; } /** * Defined by Zend_Validate_Interface * * Returns true if and only if a field name has been set, the field name is available in the * context, and the value of that field name matches the provided value. * * @param string $value * * @return boolean */ public function isValid($value, $context = null) { $this->_setValue($value); $field = $this->getFieldName(); if (empty($field)) { $this->_error(self::MISSING_FIELD_NAME); return false; } elseif (!isset($context[$field])) { $this->_error(self::INVALID_FIELD_NAME); return false; } elseif (is_array($context)) { if ($value == $context[$field]) { return true; } } elseif (is_string($context) && ($value == $context)) { return true; } $this->_error(self::NOT_MATCH); return false; } } ?> 

Текущая версия Zend_Validate имеет встроенную встроенную систему – в то время как есть много других ответов, кажется, что все требуют передачи значения Zend_Validate_Identical . Хотя это может потребоваться в какой-то момент, вы можете передать имя другого элемента.

В разделе Zend_Validate справочного руководства :

Zend_Validate_Identical поддерживает также сравнение элементов формы. Это можно сделать, используя имя элемента в качестве токена. См. Следующий пример:

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

Используя имя элемента из первого элемента как токена для второго элемента, валидатор проверяет, равен ли второй элемент первому элементу. В случае, если ваш пользователь не вводит два одинаковых значения, вы получите ошибку проверки.

вот как я это сделал 🙂

создайте вход первого входа, затем введите второй вход второго входа и добавьте идентификационный валидатор с данными из предыдущего ввода пароля.

 $password_2->addValidator('identical', false, $this->_request->getPost('password')); 

Вы можете получить доступ ко всем полям формы из проверки, также вы можете использовать конструктор для передачи дополнительных аргументов

 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; } } 

вызвать этот валидатор

 $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');