3
我想添加一个自定义验证器到一个字段。它应该考虑到另一个领域的价值。例如。字段A应该最多为B + 50%。如何根据另一个字段的值验证Zend_Form的字段?
我已经做了一个类实现Zend_Validate_Interface
,但显然Zend Form只将当前字段的值发送给验证器。我如何让验证器接收所有内容?
我想添加一个自定义验证器到一个字段。它应该考虑到另一个领域的价值。例如。字段A应该最多为B + 50%。如何根据另一个字段的值验证Zend_Form的字段?
我已经做了一个类实现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实现如何检查其他形式的元素:
好吧,我想你对于第一部分来说是错误的。你在'$ b'上调用'isValid'而不是'$ f'。我在发布之前检查了它,并在表单上调用'isValid',不*发送所有数据到元素的'isValid'。阅读进一步的回应 - 这是相当大的) – Fluffy
@Fluffy我的坏,对不起。不过,这是正确的。查看我的更新。完整的数组将在$上下文中。 – Gordon
其实你是对的。不知道为什么在Zend_Validate_Interface文档中没有提及它。谢谢,我想这就是我正在寻找 – Fluffy