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;
}
} |
<?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); |
$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