zf2 表单验证器 DateTime dateInvalidDate
zf2 Form Validator DateTime dateInvalidDate
尝试在 ZF2 中使用 DateTime 表单元素但无法验证表单。
$inputFilter->add(array(
'name' => 'event_datetime',
'required' => true,
'filters' => array(
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 0,
'max' => 20,
),
),
),
));
在 .phtml 文件上使用它。
<?php $formElement = $form->get('event_datetime');?>
<dt><?php echo $this->formLabel($formElement);?></dt>
<dd><?php echo $this->formDateTimeLocal($formElement);?>
<?php echo $this->formElementErrors($formElement);?>
注意:使用 formDateTimeLocal 而不是 formDateTime,因为后者不显示 HTML5 元素。
使用 Chrome HTML5 DateTimeLocal 字段会出现一个日历和时间部分。
当 运行 $form->isValid() 我收到: (var_dump($form->getMessages()))
array (size=1) 'event_datetime' => array (size=1) 'dateInvalidDate' => string 'The input does not appear to be a valid date' (length=44)
getRequest->getPost() = public 'event_datetime' => string '2015-08-10T03:00' (length=16)
我尝试将此字段拆分为 2 个:日期字段和时间字段作为单独的变量。这适用于 Date 但不适用于 Time 元素。
阅读周围我注意到这一点:ZF2 validating date and time format PT_BR always The input does not appear to be a valid date 这没有帮助,因为我需要时间组件。 (显然,我看过的不仅仅是 1 link,但我在 SO 上的代表只允许 post 中有 1 个 url。)
我还读到 Chrome 和 Opera 切断了时间字段的 'seconds' 部分....
如何验证 \Zend\Form\Element\DateTime 字段或仅验证 \Zend\Form\Element\Time 字段...
我试过手动将它们粘在一起,将字符串的 :00 秒部分添加到 Time 但没有效果。
如果我将输入过滤器设置为 'required' => false,我仍然会收到 dateInvalidDate 验证器以尝试:DateTime 和 Time...
所以,问题是:
如何使用 Zf2 表单元素和 inputFilters 验证 DateTime 或 Time 字段。遵循文档和示例似乎对我不起作用,手动创建时间字符串也有同样的问题。
试试这个:
$inputFilter->add(array(
'type' => 'Zend\Form\Element\DateTimeLocal',
'name' => 'event_datetime',
'required' => true,
'options' => array(
'label' => 'Appointment Date',
'format' => 'Y-m-d\TH:i'
),
'filters' => array(
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 0,
'max' => 20,
),
),
),
));
您收到错误消息,因为您传递的日期时间 string/format 与默认的预期日期时间格式不同。尝试使用 'format' => 'Y-m-d\TH:i'
来获得结果。
直接取自Zend documentation。都是一样的,只是元素不同而已。
use Zend\Form\Element;
use Zend\Form\Form;
$time = new Element\Time('time');
$time
->setLabel('Time')
->setAttributes(array(
'min' => '00:00:00',
'max' => '23:59:59',
'step' => '60', // seconds; default step interval is 60 seconds
))
->setOptions(array(
'format' => 'H:i:s'
));
$form = new Form('my-form');
$form->add($time);
我最初的问题是验证。 Stanimir 的建议确实有帮助,而且 dateTimeLocal 格式很好地为我指明了正确的方向。
整个问题与 'format' 值有关。
我的主要问题是,当填充 \Zend\Form\Element\Time 字段时,格式是 H:i:s,但 HTML5 表单只提交了 H:i。 (也是由于我的 'format' 设置没问题)
因此,当填充表单时,数据库字段返回 H:i:s 正确填充了表单,但如果我没有编辑时间字段,则提交失败。
因此:这个问题的答案基本上是确保提交的格式[和 $form->bind($object)、$form->setData($post) 等] 完全相同作为表单元素定义 [H:i != H:i:s] 并且从数据库中提取格式以符合您所需的设置。
var_dump($form->get('valid_to_time')->getFormat());
var_dump($form->get('valid_to_time')->getValue());
一旦相同,一切都会好起来的,您可以将 DateTime 字段拆分为单独的 Date 和 Time(或如上所述使用 DateTime)。
听起来很简单,但要做到这一点却让人头疼。
尝试在 ZF2 中使用 DateTime 表单元素但无法验证表单。
$inputFilter->add(array(
'name' => 'event_datetime',
'required' => true,
'filters' => array(
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 0,
'max' => 20,
),
),
),
));
在 .phtml 文件上使用它。
<?php $formElement = $form->get('event_datetime');?>
<dt><?php echo $this->formLabel($formElement);?></dt>
<dd><?php echo $this->formDateTimeLocal($formElement);?>
<?php echo $this->formElementErrors($formElement);?>
注意:使用 formDateTimeLocal 而不是 formDateTime,因为后者不显示 HTML5 元素。 使用 Chrome HTML5 DateTimeLocal 字段会出现一个日历和时间部分。
当 运行 $form->isValid() 我收到: (var_dump($form->getMessages()))
array (size=1) 'event_datetime' => array (size=1) 'dateInvalidDate' => string 'The input does not appear to be a valid date' (length=44)
getRequest->getPost() = public 'event_datetime' => string '2015-08-10T03:00' (length=16)
我尝试将此字段拆分为 2 个:日期字段和时间字段作为单独的变量。这适用于 Date 但不适用于 Time 元素。 阅读周围我注意到这一点:ZF2 validating date and time format PT_BR always The input does not appear to be a valid date 这没有帮助,因为我需要时间组件。 (显然,我看过的不仅仅是 1 link,但我在 SO 上的代表只允许 post 中有 1 个 url。) 我还读到 Chrome 和 Opera 切断了时间字段的 'seconds' 部分.... 如何验证 \Zend\Form\Element\DateTime 字段或仅验证 \Zend\Form\Element\Time 字段...
我试过手动将它们粘在一起,将字符串的 :00 秒部分添加到 Time 但没有效果。
如果我将输入过滤器设置为 'required' => false,我仍然会收到 dateInvalidDate 验证器以尝试:DateTime 和 Time...
所以,问题是:
如何使用 Zf2 表单元素和 inputFilters 验证 DateTime 或 Time 字段。遵循文档和示例似乎对我不起作用,手动创建时间字符串也有同样的问题。
试试这个:
$inputFilter->add(array(
'type' => 'Zend\Form\Element\DateTimeLocal',
'name' => 'event_datetime',
'required' => true,
'options' => array(
'label' => 'Appointment Date',
'format' => 'Y-m-d\TH:i'
),
'filters' => array(
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 0,
'max' => 20,
),
),
),
));
您收到错误消息,因为您传递的日期时间 string/format 与默认的预期日期时间格式不同。尝试使用 'format' => 'Y-m-d\TH:i'
来获得结果。
直接取自Zend documentation。都是一样的,只是元素不同而已。
use Zend\Form\Element;
use Zend\Form\Form;
$time = new Element\Time('time');
$time
->setLabel('Time')
->setAttributes(array(
'min' => '00:00:00',
'max' => '23:59:59',
'step' => '60', // seconds; default step interval is 60 seconds
))
->setOptions(array(
'format' => 'H:i:s'
));
$form = new Form('my-form');
$form->add($time);
我最初的问题是验证。 Stanimir 的建议确实有帮助,而且 dateTimeLocal 格式很好地为我指明了正确的方向。 整个问题与 'format' 值有关。
我的主要问题是,当填充 \Zend\Form\Element\Time 字段时,格式是 H:i:s,但 HTML5 表单只提交了 H:i。 (也是由于我的 'format' 设置没问题) 因此,当填充表单时,数据库字段返回 H:i:s 正确填充了表单,但如果我没有编辑时间字段,则提交失败。
因此:这个问题的答案基本上是确保提交的格式[和 $form->bind($object)、$form->setData($post) 等] 完全相同作为表单元素定义 [H:i != H:i:s] 并且从数据库中提取格式以符合您所需的设置。
var_dump($form->get('valid_to_time')->getFormat());
var_dump($form->get('valid_to_time')->getValue());
一旦相同,一切都会好起来的,您可以将 DateTime 字段拆分为单独的 Date 和 Time(或如上所述使用 DateTime)。 听起来很简单,但要做到这一点却让人头疼。