【问题标题】:How to validate a field of Zend_Form based on the value of another field?如何根据另一个字段的值验证 Zend_Form 的一个字段?
【发布时间】:2011-09-28 14:58:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    当您在 Zend_Form 上调用 isValid 时,它将传递您传递给方法的所有数据

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

    【讨论】:

    • 好吧,我认为你对第一部分有误。您在$b 上调用isValid 而不是$f。在表单上发布和调用isValid 之前,我已经检查了它是否 将所有数据发送到元素的isValid。进一步阅读响应 - 它相当大)
    • @Fluffy 我的错,对不起。尽管如此,它仍然是正确的。看我的更新。完整的数组将在 $context 中。
    • 其实你是对的。不知道为什么 Zend_Validate_Interface 文档中没有提到它。谢谢,我想这就是我想要的
    • @Fluffy 我假设它是因为如果他们更改接口上的 isValid 签名,它会破坏向后兼容性。所有实现该功能的验证器都必须更改其方法以包含 $context 然后以匹配接口定义。
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2017-02-28
    • 2018-09-22
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多