0
votes

I have a problem with Zend Framework 2 and Date element. The attribute I'm trying to store is a DateOfBirth, but this attribute maybe empty. For example the date is unknown. The column in the database allows NULL. The Doctrine class attached to it has a attribute that let's it know it allows null. But Zend Framework 2 still gives me this error:

"Value is required and can't be empty".

Even though I set the required attribute=false, also the allow_empty=true, but nothing works.

The attirbute it a member of a nested fieldset within a form. The nesting looks as follows:

  • UserManagementForm
    • User (fieldset)
      • Person (fieldset)
        • DateOfBirth (element)

Couple examples i tried:

Form not validating correctly zend framework 2

https://github.com/zendframework/zf2/issues/4302

Here is the code I am using at the moment. Hopefully you see something that I'm missing. I don't know if it due to the fact that it is nested, but the rest works perfect, only the date element is causing me trouble.

UserManagementForm

<?php

namespace Application\Form;

use Zend\Form\Form;

class UserManagementForm extends Form
{
    public function __construct()
    {
        parent::__construct('usermanagementform');
        $this->setAttribute('method', 'post');

        $fieldset = new \Application\Form\Fieldset\User();
        $fieldset
            ->setHydrator(new \Zend\Stdlib\Hydrator\ObjectProperty(false))
            ->setObject(new \Application\Entity\User())
            ->setOptions(array('use_as_base_fieldset' => true))
        ;
        $this->add($fieldset);


        $this->add(array(
            'name' => 'btnSubmit',
            'type' => 'submit',
            'attributes' => array(
                'class' => 'btn-primary',
            ),
            'options' => array(
                'column-size' => 'sm-9 col-sm-offset-3',
                'label' => 'Save changes',
            ),
        ));
    }
}

?>

User (Fieldset)

<?php

namespace Application\Form\Fieldset;

use Zend\Form\Fieldset;

class User extends Fieldset
{
    public function __construct()
    {
        parent::__construct('User');

        $fieldset = new \Application\Form\Fieldset\EmailAddress();
        $fieldset
            ->setHydrator(new \Zend\Stdlib\Hydrator\ObjectProperty(false))
            ->setObject(new \Application\Entity\EmailAddress());
        $this->add($fieldset);

        $fieldset = new \Application\Form\Fieldset\Person();
        $fieldset
            ->setHydrator(new \Zend\Stdlib\Hydrator\ObjectProperty(false))
            ->setObject(new \Application\Entity\Person());
        $this->add($fieldset);
    }
}

?>

Person (fieldset)

<?php

namespace Application\Form\Fieldset;

use Zend\Form\Fieldset;

class Person extends Fieldset
{
    public function __construct()
    {
        parent::__construct('Person');

        $this->add(array(
            'type' => 'date',
            'name' => 'DateOfBirth',
            'required' => false,
            'allowEmpty' => true,
            'options' => array(
                'label' => 'Date of birth',
                'column-size' => 'sm-9',
                'label_attributes' => array(
                    'class' => 'col-sm-3',
                ),
                'format' => 'd-m-Y',
            ),
        ));
    }
}

?>
1
You add input-filter specifications/configuration to a Form class. Check @AlainPomirol his answer! - Wilt

1 Answers

3
votes

'required' isn't an attribute of element but an validator attribute. The solution consist to implement Zend\InputFilter\InputFilterProviderInterface

use Zend\InputFilter\InputFilterProviderInterface;
class UserManagementForm extends AbstractSbmForm implements InputFilterProviderInterface {
  public function __construct()
  {
   ... without change
  }
  public function getInputFilterSpecification()
  {
    return array(
      'DateOfBirth' => array(
        'name' => 'DateOfBirth',
        'required' => false,
      );
    );
  }
}