Zend_Framework предоставляет абстрактный класс Zend_Validate_Abstract наследовав который, можно создать собственные валидаторы.
Ключевой метод: isValid на вход которому передается собственно само валидируемое поле первым аргументом и весь исходный набор вторым, что в нашем случае очень удобно.
Создаем класс:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?php /** * Zend_Form validator for confirmation any fields * Example of usage: * addValidator(new App_Validate_Confirmation('fieldName') * */ class App_Validate_Confirmation extends Zend_Validate_Abstract { const NOT_MATCH = 'notMatch'; protected $_matchedField; protected $_messageTemplates = array( self::NOT_MATCH => 'confirmation does not match' ); public function __construct($fieldName) { $this->_matchedField = $fieldName; } public function isValid($value, $context = null) { $value = (string) $value; $this->_setValue($value); if (is_array($context)) { if (isset($context[$this->_matchedField]) && ($value == $context[$this->_matchedField]) ) { return true; } } elseif (is_string($context) && ($value == $context)) { return true; } $this->_error(self::NOT_MATCH); return false; } } |
Пример использования в форме:
$password = $form->createElement('password', 'password', array('label' => 'password')); $password->addValidator('stringLength', false, array(6, 20)) ->addValidator(new App_Validate_Confirmation('passwordConfirm')) ->setRequired(true); $passwordConfirm = $form->createElement('password', 'passwordConfirm', array('label' => 'confirm password')); $passwordConfirm->addValidator('stringLength', false, array(6, 20)) ->setRequired(true); |
Данный валидатор можно применять и к нескольким полям формы, например, если также необходимо создать поле подтверждения email’a