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

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

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

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

最佳答案

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

关于php - 如何根据另一个字段的值来验证 Zend_Form 的一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585232/

相关文章:

php - 拉拉维尔 4 : Create a default route

php - 为什么 Zend Framework 如此受欢迎?

zend-framework - 将变量发送到 Zend Framework 中的布局

php - 在 zend 框架中的另一个模块中查看模块的输出

PHP for-loop with MySQL 行取决于 MySQL 查询结果

php - 检查节点是否有特定的子节点

php - Android JSONParsing 错误 : E/Buffer Error﹕ Error converting result java. lang.NullPointerException: lock == null

php - Zend 表单 : How do I make it bend to my will?

php - 如何将选项/参数传递给 ZendFramework 2 中的 formCollection 字段集?

php - 将 HTML 占位符添加到 Zend_Form 中