如何根据另一个字段的值验证Zend_Form的字段?

时间:2011-09-28 14:58:34

标签: php zend-framework zend-form zend-validate

我正在尝试向字段添加自定义验证程序。它应该考虑另一个领域的价值。例如。字段A最多应为B + 50%。

我已经创建了一个实现Zend_Validate_Interface的类,但显然Zend Form只将当前字段的值发送给验证器。如何让验证器接收所有内容?

1 个答案:

答案 0 :(得分:5)

当您在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。这包含剩余的值。

替代将传递第二个元素作为Validator的选项进行匹配,例如

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如何实现对其他表单元素的检查: