【发布时间】:2015-01-23 18:37:24
【问题描述】:
我有一个包含日期字段的数据集。在数据库中,添加新行时,该字段默认为 0000-00-00。在我的字段集中,元素定义如下:
$this->add(array(
'name' => 'memberBirthDate',
'type' => 'Zend\Form\Element\Date',
'attributes' => array(
'type' => 'date',
),
'options' => array(
'label' => 'birth date',
'format' => 'n/j/y'
),
));
我不希望表单验证需要该元素。但是,如果没有输入日期,表单验证会给出错误The input does not appear to be a valid date。
此外,'n/j/y' 格式将空值呈现为11/30/-1。如果在输入中输入0,表单验证会给出错误The input does not appear to be a valid date,如果输入类似0/0/00,验证会同时给出The input does not appear to be a valid date 和The input does not fit the date format 'n/j/y'。
有没有办法让验证器接受空日期值或跳过未更改输入的验证?
编辑
allow_empty 不起作用。我已经设置了它并且还设置了'required' -> false。我什至通过回显所有错误和属性来检查以确保验证属性一直传递到控制器和视图。以下代码:
// enumerate message
$messages = $form->getMessages();
if($messages) {
echo "<h4>error messages:</h4>";
print_r ($messages);
}
echo "<br/>";
echo "allow_empty: " . $memberBirthDate->getAttribute('allow_empty') . "<br/>";
echo "required: " . $memberBirthDate->getAttribute('required') . "<br/>";
产生:
Array ( [member-fieldset] => Array ( [memberBirthDate] => Array ( [isEmpty] => Value is required and can't be empty ) ) )
allow_empty: 1
required:
编辑 2
我确实在字段集中指定了一个过滤器。我项目的这一部分遵循http://framework.zend.com/manual/current/en/modules/zend.form.collections.html 提供的格式,它没有任何关于使用工厂的建议。我的过滤器是这样的:
namespace AdminMembers\Form;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use AdminMembers\Entity\Member;
class MemberFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct(ObjectManager $objectManager)
{
parent::__construct('member-fieldset');
$this->setHydrator(new DoctrineHydrator($objectManager, 'AdminMembers\Entity\Member'))
->setObject(new Member());
// ...
$this->add(array(
'name' => 'memberBirthDate',
'type' => 'Zend\Form\Element\Date',
'required' => false,
'allow_empty' => true,
'attributes' => array(
'type' => 'date',
'required' => false,
'allow_empty' => true,
),
'options' => array(
'label' => 'birth date',
'format' => 'n/j/y'
),
));
// ...
}
public function getInputFilterSpecification()
{
// ...
return array(
'memberBirthDate' => array(
'required' => false,
'allow_empty' => true,
),
);
// ...
}
}
和
namespace AdminMembers\Form;
use Zend\InputFilter\InputFilter;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
class AddMemberForm extends Form
{
public function __construct(ObjectManager $objectManager)
{
parent::__construct('add_member_form');
$this->setHydrator(new DoctrineHydrator($objectManager, 'AdminMembers\Entity\Member'));
$adminMemberFieldset = new MemberFieldset($objectManager);
$adminMemberFieldset->setUseAsBaseFieldset(true);
$this->add($adminMemberFieldset);
$this->setAttribute('method', 'post');
$this->setInputFilter(new InputFilter());
// ...
$this->setValidationGroup(array(
'member-fieldset' => array(
'memberID',
// ...
'memberBirthDate',
// ...
),
));
}
}
【问题讨论】:
标签: forms validation zend-framework2