Как проверить поле Zend_Form на основе значения другого поля? - PullRequest
3 голосов
/ 28 сентября 2011

Я пытаюсь добавить пользовательский валидатор в поле.Следует учитывать значение другого поля.Например, поле A должно составлять самое большее B + 50%.

Я создал класс, реализующий Zend_Validate_Interface, но, очевидно, Zend Form отправляет валидатору только значение текущего поля.Как мне заставить валидатор получать все?

1 Ответ

5 голосов
/ 28 сентября 2011

Когда вы вызываете isValid на Zend_Form, он передает все данные, которые вы передали методу

$form->isValid(array('a' => 1, 'b' => 2));

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

Пример валидатора

class My_Validator_TwoVals implements Zend_Validate_Interface
{
    public function getMessages()
    {
        return array();
    }
    public function isValid($value)
    {
        print_r(func_get_args());
    }
}

Пример формы

$f = new Zend_Form;
$a = $f->createElement('Text', 'a');
$b = $f->createElement('Text', 'b');
$b->addPrefixPath('My_Validator', '.', 'validate');
$b->addValidator('TwoVals');
$f->addElements(array($a, $b));

$f->isValid(array('a' => 1, 'b' => 2));

Выход

Array
(
    [0] => 2
    [1] => Array
        (
            [a] => 1
            [b] => 2
        )
)

Как вы можете видеть, также был передан второй аргумент isValid, который является $ context.И он содержит оставшиеся значения.

Альтернатива будет передавать второй элемент для сопоставления в качестве опции для Валидатора, например,

class My_Validator_TwoVals implements Zend_Validate_Interface
{
    protected $a;
    public function getMessages()
    {
        return array();
    }
    public function isValid($value)
    {
        var_dump($this->a->getValue());
    }
    public function __construct(Zend_Form_Element $a)
    {
        $this->a = $a;
    }
}

Настройка

$f = new Zend_Form;
$a = $f->createElement('Text', 'a');
$b = $f->createElement('Text', 'b');
$b->addPrefixPath('My_Validator', '.', 'validate');
$b->addValidator('TwoVals', false, array($a));
$f->addElements(array($a, $b));

$f->isValid(array('a' => 1, 'b' => 2));

Будет напечатано int(1).Как вы можете видеть, мы извлекли это значение через API элемента формы, чтобы было применено все, что вы настроили для валидаторов и фильтров, например, это не необработанное значение.И вы также можете установить его на другое значение и т. Д.

Также взгляните на Zend_Validate_Identical, чтобы узнать, как ZF реализует проверку других элементов формы:

...