Zend framework2 Zend Framework 2验证程序中其他字段验证的访问结果
我有一张有两个日期的表格,开始和结束。我有一个用于开始的验证器,我想验证停止,并且停止是在开始之后。但只有在start有效时,后验证才有意义Zend framework2 Zend Framework 2验证程序中其他字段验证的访问结果,zend-framework2,Zend Framework2,我有一张有两个日期的表格,开始和结束。我有一个用于开始的验证器,我想验证停止,并且停止是在开始之后。但只有在start有效时,后验证才有意义 isValid($value,$context=null)可以传递给上下文变量中的其他值,但是我必须再次执行开始检查 因此,是否可以在停止验证器的isValid()函数中检查启动验证的结果?您可以使用 或者写下你的 ------编辑-我的建议答案-带回调或验证程序的输入过滤器------ 我是这样做的 首先创建一个包含所有参数的过滤器: namespace
isValid($value,$context=null)
可以传递给上下文变量中的其他值,但是我必须再次执行开始检查
因此,是否可以在停止验证器的isValid()
函数中检查启动验证的结果?您可以使用
或者写下你的
------编辑-我的建议答案-带回调或验证程序的输入过滤器------
我是这样做的
首先创建一个包含所有参数的过滤器:
namespace MyGreatNameSpace\Filter;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
class MyDateFilter extends InputFilter
{
public function __construct($myGreatClass)
{
$factory = new InputFactory();
$this->add($factory->createInput(array(
'name' => 'start_date',
'required' => true,
'validators' => array(
array(
'name' => 'Date',
'options' => array(
'format' => '2000-10-10',
),
)
),
)));
$this->add($factory->createInput(array(
'name' => 'end_date',
'required' => true,
'validators' => array(
array(
'name' => 'Date',
'options' => array(
'format' => '2000-10-10',
),
),
array(
'name' => 'Callback',
'options' => array(
'callback' => array($myGreatClass, 'isDateNewer'),
'messages' => array(
'callbackValue' => "The end date is Older then the start date",
),
),
),
),
)));
} // End of __construct
}
创建
在控制器中植入(我使用服务拉动表单/过滤器类)
另一种稍有不同的方法(尽管更简洁)是编写验证器。检查(注意标记)
使用验证器规范中的
break\u chain\u on\u failure
参数->这样,只有在开始有效时才会调用停止验证器。感谢您的评论。这会打破一个输入或所有输入的链条吗?无论如何,这两种情况都不是我想要的。因为停止是启动后的一个附加输入,它不能是最后一个。谢谢你的回答。我知道这种可能性,但它们并不能解决问题。问题是如何访问以前的验证结果。以前的验证是指检查停止点的不同范围?(不同的类、函数等)一个表单至少包含这两个字段,每个字段都有自己的验证器。正如我在问题中所述,我在$context
变量中得到字段值,但没有得到验证结果。目前,我正在stop
的验证器中重新验证start
,因为当start
不是有效日期时,验证stop
是否在start
之后是没有意义的。假设您从同一表单获得start和stop,并希望在同一位置进行检查。为什么不使用inputFilter?如果这是您希望的,我可以粘贴一个示例是的,它们来自同一表单。在inputFilter中,为每个字段指定一个验证器。在这些验证器中,停止验证器存在问题。
public function isDateNewer($date, $params)
{
$date2 = $params['start_date'];
if ($date > $date2) { // Over simplistic
return TRUE;
}
}
// Get the form / validator objects from the SM
$form = $this->getServiceLocator()->get('date_form');
$filter = $this->getServiceLocator()->get('date_filter');
// Inject the input filter object to the form object, load the form with data and bind the result to the model
$form->setInputFilter($filter);
$form->setData($post);
$form->bind($myModel); // (if you wish to bind the data to whatever)
if (!$form->isValid()) {
return $this->forward()->dispatch.... (or whatever)
}
array(
'name' => '\Application\Validator\myNewNamedValidator',
'options' => array(
'token' => 'start_date',
'messages' => array(
'older' => "The end date is Older then the start date",
),
),
),