比较两个DateSelect表单值

时间:2016-01-28 15:42:18

标签: php zend-framework2

我的表单中有两个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的验证似乎只受到“必需”的影响。过滤而不是我的自定义验证器。

    $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函数/验证器有问题,因为我已经在那里使用了调试消息,但它们没有被调用。是否有理由在我的表单上调用此验证器?

1 个答案:

答案 0 :(得分:0)

我没有使用正确的方法来调用 $this->form->prepare(); $this->form->setAttribute('action', $this->url('controller/action')); $this->form->setAttribute('method', 'post'); $this->form->setAttribute('autocomplete', 'off'); 文件中的表单。我遗漏了:

var deleted = $this.parent().html();
$this.parent.remove();
alert("deleted " + deleted);

因此,表格在之后正确呈现。否则,您在表单中提交了日,月,年元素。