Форма не проверяется правильно 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 менее привлекательным для использования в реальных приложениях.