zf2 Form Validator DateTime dateInvalidDate

时间:2015-08-09 22:24:08

标签: forms datetime zend-framework zend-framework2

尝试在ZF2中使用DateTime Form元素,但无法使表单有效。

$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-&gt; isValid()时,我收到:(var_dump($ form-&gt; getMessages()))

array (size=1) 'event_datetime' => array (size=1) 'dateInvalidDate' => string 'The input does not appear to be a valid date' (length=44)

getRequest-&gt; getPost()= public&#39; event_datetime&#39; =&GT;字符串&#39; 2015-08-10T03:00&#39; (长度= 16)

我试图将此字段拆分为2:日期和时间字段作为单独的变量。这适用于Date BUT而不是Time元素。 阅读我已经注意到了这一点:ZF2 validating date and time format PT_BR always The input does not appear to be a valid date因为我需要时间组件而没有帮助。 (显然我看过的不仅仅是1个链接,但我的SO上的代表在帖子中只允许1个网址。) 我还读到Chrome和Opera切断了“秒”的时间。部分时间领域.... 如何验证\ Zend \ Form \ Element \ DateTime字段或只是\ Zend \ Form \ Element \ Time for field ...

我试图手动将这些粘在一起,将字符串的00秒部分添加到时间但不起作用。

如果我将输入过滤器设置为&#39; required&#39; =&GT; false我仍然收到针对尝试的dateInvalidDate验证器:DateTime和Time ...

所以,问题是:

如何使用Zf2表单元素和inputFilters验证DateTime或Time字段。在文档和示例之后似乎不适合我,手动创建时间字符串也有同样的问题。

2 个答案:

答案 0 :(得分:1)

试试这个:

   create or replace procedure t1_d12
 as
 b  int :=0;
 p test_divs%rowtype;
 cursor test is select * from test_divs order by id;

 begin 
 for p in test
 loop
 if p.gender = 'M' then
 b :=p.age+b;
 elsif p.gender = 'F' then
 b :=b-p.age;
 end if;
 dbms_output.put_line(b);
 update test_divs set balance = b where id=p.id;
 end loop;

您收到错误,因为您传递的日期时间字符串/格式默认情况下与预期的日期时间格式不同。尝试使用$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, ), ), ), )); 来获得结果。

直接来自Zend documentation。它完全相同,但有不同的元素。

'format' => 'Y-m-d\TH:i'

答案 1 :(得分:0)

我原来的问题是验证。 Stanimir的建议确实有所帮助,而dateTimeLocal格式在指向正确的方向上非常有用。 整个问题是“格式”值。

我的主要问题是填充\ Zend \ Form \ Element \ Time字段时格式为H:i:s但HTML5表单只提交了H:i。 (也是由于我的'格式'设置可以) 因此,当填充表单时,DB字段返回H:i:s正确填充表单但提交失败如果我没有编辑时间字段。

因此:这个问题的答案基本上是确保提交的格式[和$ form-&gt; bind($ object),$ form-&gt; setData($ post)等]与表单元素完全相同定义[H:i!= H:i:s]以及从数据库格式中提取以符合您所需的设置。

var_dump($form->get('valid_to_time')->getFormat());
var_dump($form->get('valid_to_time')->getValue());

一旦这是相同的,一切都会好,您可以将DateTime字段拆分为单独的日期和时间(或使用上面的DateTime)。 听起来很简单,但这是一个令人头疼的问题。