1
votes

In a Zend Framework 2 application, I have the following form in my controller action method:

public function testAction()
{
    $form = new \Zend\Form\Form('test');

    $date = new \Zend\Form\Element\DateSelect('date');
    $date->setOptions(array(
            'label'    => 'Date',
            'min_year' => date('Y') - 10,
            'max_year' => date('Y') + 10,
        )
    );

    $date->getDayElement()->setEmptyOption('day');
    $date->getMonthElement()->setEmptyOption('month');
    $date->getYearElement()->setEmptyOption('year');

    $form->add($date);

    $form->add(array(
        'name'    => 'submit',
        'attributes' => array(
            'type'  => 'submit',
            'value' => 'submit',
            'id' => 'submitbutton',
        ),
    ));

    if ($this->request->isPost()) {
        $data = $this->request->getPost();            
        $form->setData($data);

        if ($form->isValid()) {
            $data = $form->getData();
            // more code
        }
    }

    return array('form' => $form);
}

Now if I submit the form I get the validation message:

'The input does not appear to be a valid date'

That is correct but I would only want to know if the field is required. If I look in the source of the DateSelect element, I see a getInputSpecification() method that sets required to false by default and there also is a getValidator() method requiring a format with which the empty date does not comply.

How can I bypass validation if the input is not required (obviously, in my real form I have more elements)?

1

1 Answers

0
votes

I usually use the factory pattern and you can set whether the field is required ie

$inputFilter->add($factory->createInput(array(
            'name'     => 'availableDate',
            'required' => true,
            'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'max'      => 20,
                    ),
                ),
            ),
        )));

refer the field required - you can set this to false