比较两个 DateSelect 表单值
Compare Two DateSelect Form Values
我的表单中有两个 Zend\Form\Element\Dateselect
元素,我正在尝试验证 dateEnd > dateBeg
.
这些是我表单中的值:
$startDate = new DateSelect('dateBeg');
$startDate->setLabel('Start Date');
$startDate->setMinYear(2016);
$startDate->setMaxYear(date("Y"));
$startDate->setDayAttributes(array(
'name' => 'dayBeg',
));
$startDate->setMonthAttributes(array(
'name' => 'monthBeg',
));
$startDate->setYearAttributes(array(
'name'=> 'yearBeg',
));
$this->add($startDate);
$endDate = new DateSelect('dateEnd');
$endDate->setLabel('End Date');
$endDate->setMinYear(2016);
$endDate->setMaxYear(date("Y"));
$endDate->setDayAttributes(array(
'name' => 'dayEnd',
));
$endDate->setMonthAttributes(array(
'name' => 'monthEnd',
));
$endDate->setYearAttributes(array(
'name'=> 'yearEnd',
));
$this->add($endDate);
我看到了比较两个 Date
元素的解决方案:zend framework 2 - compare 2 inputs using validator?
我试图在我的验证文件中使用它,但是 dateEnd
的验证似乎只受 'required' 过滤器的影响,而不是我的自定义验证器。
$inputFilter->add($factory->createInput(array(
'name' => 'dateEnd',
'required' => false,
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'The end date should be greater than start date',
),
'callback' => function($value, $context = array()) {
$startDate = \DateTime::createFromFormat('Y-m-d', $context['dateBeg']);
$endDate = \DateTime::createFromFormat('Y-m-d', $value);
return $endDate > $startDate;
},
),
),
),
)));
我修改了我的表单以使用 Date
而不是 DateSelect
并且此验证似乎按预期工作,但我更愿意使用 DateSelect
元素。我的猜测是 Callback
函数/验证器有问题,因为我在其中使用了调试消息,但没有调用它们。我的表单上没有调用此验证程序是否有原因?
我没有使用正确的方法调用 .phtml
文件中的表单。我遗漏了:
$this->form->prepare();
$this->form->setAttribute('action', $this->url('controller/action'));
$this->form->setAttribute('method', 'post');
$this->form->setAttribute('autocomplete', 'off');
因此,表单在之后正确呈现。否则,您将在表单中提交日、月、年元素。
我的表单中有两个 Zend\Form\Element\Dateselect
元素,我正在尝试验证 dateEnd > dateBeg
.
这些是我表单中的值:
$startDate = new DateSelect('dateBeg');
$startDate->setLabel('Start Date');
$startDate->setMinYear(2016);
$startDate->setMaxYear(date("Y"));
$startDate->setDayAttributes(array(
'name' => 'dayBeg',
));
$startDate->setMonthAttributes(array(
'name' => 'monthBeg',
));
$startDate->setYearAttributes(array(
'name'=> 'yearBeg',
));
$this->add($startDate);
$endDate = new DateSelect('dateEnd');
$endDate->setLabel('End Date');
$endDate->setMinYear(2016);
$endDate->setMaxYear(date("Y"));
$endDate->setDayAttributes(array(
'name' => 'dayEnd',
));
$endDate->setMonthAttributes(array(
'name' => 'monthEnd',
));
$endDate->setYearAttributes(array(
'name'=> 'yearEnd',
));
$this->add($endDate);
我看到了比较两个 Date
元素的解决方案:zend framework 2 - compare 2 inputs using validator?
我试图在我的验证文件中使用它,但是 dateEnd
的验证似乎只受 'required' 过滤器的影响,而不是我的自定义验证器。
$inputFilter->add($factory->createInput(array(
'name' => 'dateEnd',
'required' => false,
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'The end date should be greater than start date',
),
'callback' => function($value, $context = array()) {
$startDate = \DateTime::createFromFormat('Y-m-d', $context['dateBeg']);
$endDate = \DateTime::createFromFormat('Y-m-d', $value);
return $endDate > $startDate;
},
),
),
),
)));
我修改了我的表单以使用 Date
而不是 DateSelect
并且此验证似乎按预期工作,但我更愿意使用 DateSelect
元素。我的猜测是 Callback
函数/验证器有问题,因为我在其中使用了调试消息,但没有调用它们。我的表单上没有调用此验证程序是否有原因?
我没有使用正确的方法调用 .phtml
文件中的表单。我遗漏了:
$this->form->prepare();
$this->form->setAttribute('action', $this->url('controller/action'));
$this->form->setAttribute('method', 'post');
$this->form->setAttribute('autocomplete', 'off');
因此,表单在之后正确呈现。否则,您将在表单中提交日、月、年元素。