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)。 听起来很简单,但要做到这一点却让人头疼。