Форма не проверяется правильно Zend Framework 2

Я пробую настраиваемую конфигурацию для новой системы в целом.

Я застрял на формах проверки с использованием фильтра.

Основной вопрос:

    $form      = new CrudForm($this->getEntityManager());

    $request = $this->getRequest();

    if ($request->isPost()) {

        $filter = new CrudFilter();
        $form->setInputFilter($filter);
        $post = $request->getPost();
        $form->setData($post);
        //$crudLogic->edit($crudLogic->populateEntity($post)->update());

        if ($form->isValid()) {
        }
     }

Эта форма никогда не будет подтверждена. Но что сводит меня с ума, так это то, что эта форма проста:

namespace Manager\Form;
use Zend\Form\Form;
use Zend\Form\Element;
use Doctrine\ORM\EntityManager;
class CrudForm extends Form
{
    public function __construct(EntityManager $em)
    {
        parent::__construct('Crud');
        $this->setAttribute('method', 'post');

        $idcrud = new Element('idCrud');
        $idcrud->setAttributes(array(
            'name' => 'idCrud',
            'id' => 'idCrud',
            'type' => 'text',
        ));
        $idcrud->setLabel('Id Crud');

        $this->add($idcrud);

        $idmodule = array(
            'name' => 'idModule',
            'type' => 'DoctrineModule\Form\Element\ObjectSelect',
            'options' => array(
                'label' =>'Id Module',
                'object_manager' => $em,
                'target_class' => 'Manager\Entity\Module',
                'property' => 'name',
                'empty_option' => 'Choose',
            ),
        );
        $this->add($idmodule);

        $name = new Element('name');
        $name->setAttributes(array(
            'name' => 'name',
            'id' => 'name',
            'type' => 'text',
        ));
        $name->setLabel('Name');

        $this->add($name);

        $createddate = new Element\Date('createdDate');
        $createddate->setAttributes(array(
            'name' => 'createdDate',
            'id' => 'createdDate',
            'type' => 'date',
            'size' => '30',
            'class' => 'datepicker',
        ));
        $createddate->setLabel('Created Date');

        $this->add($createddate);

        $updateddate = new Element\Date('updatedDate');
        $updateddate->setAttributes(array(
            'name' => 'updatedDate',
            'id' => 'updatedDate',
            'type' => 'date',
            'size' => '30',
            'class' => 'datepicker',
        ));
        $updateddate->setLabel('Updated Date');

        $this->add($updateddate);

        $send = new Element('submit');
        $send->setValue('Submit');
        $send->setAttributes(array(
            'type'  => 'submit'
        ));
        $this->add($send);
    }
}

И фильтр:

namespace Manager\Filter;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class CrudFilter extends InputFilter
{
    public function __construct()
    {

        $this->add(array(
            'name' => 'IdCrud'
            ,'filters'  => array(
                array('name' => 'Int'),
            )
        ));
        $this->add(array(
            'name' => 'IdModule'
            ,'required' => true
            ,'filters'  => array(
                array('name' => 'Int'),
            )
        ));
        $this->add(array(
            'name' => 'Name'
            ,'required' => true
            ,'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                    'encoding' => 'UTF-8',
                    'min'      => 1,
                    'max'      =>150,
                ),
            ),
        )
    ));

}

}

К моему удивлению, ошибки после того, как я выполняю $form->isValid(), возвращаются так:

array (size=2)
  'createdDate' => 
    array (size=1)
      'isEmpty' => string 'Value is required and can't be empty' (length=36)
  'updatedDate' => 
    array (size=1)
      'isEmpty' => string 'Value is required and can't be empty' (length=36)

Так что это проблема, я даже не объявляю валидацию в этих полях, только для idModule и ввода имени, я теряю время на одну мысль, что я даже не объявляю!

Куда подойдут эти проверки?

Редактировать: Кстати, я даже не повторяю созданный и обновленный вид в представлении, просто для управления базой данных, мне не нужно проверять эти поля в области формы.

Edit2: удаляя createDate и updateDate из формы, я получаю ноль сообщений об ошибках, но даже не проверяя форму! Мне нужна форма, чтобы быть действительным.

2 ответа

Решение

Первое. Убедитесь, что в структуре таблицы базы данных нет таких полей (createDate и updatedDate), как NOT NULL.

Второе - InputFilter имеет более строгий характер. Если вы хотите, чтобы какой-либо элемент был обязательным или нет, вы должны указать это явно.

Попробуйте установить фильтр для "createDate" и "updatedDate" как 'required' => false,

$this->add(array(
    'name' => 'createdDate',
    'required' => false,
    ....
));

$this->add(array(
    'name' => 'updatedDate',
    'required' => false,
    ....
));

По крайней мере, таким образом, эти сообщения не будут добавлены в массив ошибок ().

У меня та же проблема, кажется, вы не можете сделать это необязательным.

Я попытался установить 'required' => false и т. Д., Но безрезультатно.

Это похоже на ошибку для меня.

В таблице DDL разрешены пустые значения, я пытаюсь разрешить нулевые значения, установив обязательное отключение, но эти параметры игнорируются.

Похоже, вам нужно расширить DoctrineModule\Form\Element\ObjectSelect и принудительно принять нулевые значения.

Делает ObjectSelect менее привлекательным для использования в реальных приложениях.

Другие вопросы по тегам