Flu*_*ffy 3 php zend-framework zend-form zend-validate
我正在尝试向字段添加自定义验证器.它应该考虑另一个领域的价值.例如,字段A最多应为B + 50%.
我已经实现了一个类Zend_Validate_Interface,但显然Zend Form只将当前字段的值发送给验证器.如何让验证器接收所有内容?
当你调用isValid一个Zend_Form会通过你传递给方法的数据
$form->isValid(array('a' => 1, 'b' => 2));
Run Code Online (Sandbox Code Playgroud)
您的自定义验证器将接收整个原始值数组.
示例验证器
class My_Validator_TwoVals implements Zend_Validate_Interface
{
public function getMessages()
{
return array();
}
public function isValid($value)
{
print_r(func_get_args());
}
}
Run Code Online (Sandbox Code Playgroud)
示例表格
$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));
Run Code Online (Sandbox Code Playgroud)
产量
Array
(
[0] => 2
[1] => Array
(
[a] => 1
[b] => 2
)
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,还传递了第二个参数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;
}
}
Run Code Online (Sandbox Code Playgroud)
建立
$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));
Run Code Online (Sandbox Code Playgroud)
然后打印int(1).正如您所看到的,我们通过表单元素的API获取了该值,因此您将应用为验证器和过滤器配置的任何内容,例如,它不是原始值.你也可以把它设置为另一个值,等等.
还要Zend_Validate_Identical了解ZF如何实现对其他表单元素的检查: