【发布时间】:2011-09-28 14:58:33
【问题描述】:
我正在尝试向字段添加自定义验证器。它应该考虑另一个字段的值。例如。字段 A 最多应为 B+50%。
我已经创建了一个实现Zend_Validate_Interface 的类,但显然 Zend Form 只将当前字段的值发送给验证器。如何让验证者收到所有内容?
【问题讨论】:
标签: php zend-framework zend-form zend-validate
我正在尝试向字段添加自定义验证器。它应该考虑另一个字段的值。例如。字段 A 最多应为 B+50%。
我已经创建了一个实现Zend_Validate_Interface 的类,但显然 Zend Form 只将当前字段的值发送给验证器。如何让验证者收到所有内容?
【问题讨论】:
标签: php zend-framework zend-form zend-validate
当您在 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。进一步阅读响应 - 它相当大)