Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 如何在zf2中验证空日期值_Forms_Validation_Zend Framework2 - Fatal编程技术网

Forms 如何在zf2中验证空日期值

Forms 如何在zf2中验证空日期值,forms,validation,zend-framework2,Forms,Validation,Zend Framework2,我有一个包含日期字段的数据集。在数据库中,添加新行时,字段默认为0000-00-00。在我的字段集中,元素定义如下: $this->add(array( 'name' => 'memberBirthDate', 'type' => 'Zend\Form\Element\Date', 'attributes' => array( 'type' => 'date', ), 'options' => arra

我有一个包含日期字段的数据集。在数据库中,添加新行时,字段默认为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'
    ),
));
我不希望表单验证需要元素。但是,如果未输入日期,则表单验证会出现错误
。输入的日期似乎无效

此外,格式
'n/j/y'
将空值呈现为
11/30/-1
。如果在输入中输入了
0
,则表单验证会给出错误
输入似乎不是有效日期
,如果输入了类似
0/0/00
的内容,则验证会同时给出
输入似乎不是有效日期
输入不符合日期格式“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/>";
编辑2 我在字段集中指定了一个筛选器。我的项目的这一部分遵循所提供的格式,它没有任何关于使用工厂的建议。我的过滤器如下所示:

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,
            ),
        );

            // ...

    }

}


您可以将字段配置为允许通过输入筛选器输入空值。请看一下Rob Allen(akrabat)在
allow_empty
上的这篇文章:

您需要在其中添加一个过滤器

示例过滤器:

namespace YourNamespace\Filter;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class YourFilter extends InputFilter
{
    public function getInputFilter()
    {
        $this->add(
            array(
                'name' => 'memberBirthDate',
                'required' => true,
            )
        );
    }
}
示例工厂:

namespace YourNamespace\Factory;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class YourFactory extends FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {  
        $form = new \YourNamespace\Form\YourForm();

        $filter = new \YourNamespace\Filter\YourFilter();

        $form->setInputFilter($filter->getInputFilter());

        return $form;
    }
}
在module.config.php的servicemanager密钥上注册工厂: 您可能应该与旧配置合并:

'service_manager' => array(
    'factories' => array(
        'YourNamespace\Factory\YourFactoryFinalName' => 'YourNamespace\Factory\YourFactory'
    ),
)
在任何可用的地方调用服务管理器,使用带有过滤器的表单,您可以自己添加更多过滤器规则

$this->getServiceLocator()->get('YourNamespace\Factory\YourFactoryFinalName');
额外:创建get/set,以便在需要此工厂时在任何地方使用,方法如下:

namespace YourNamespace\Factory;

use YourNamespace\Factory\YourFactory

trait YourFactoryTrait {

    protected $yourFactory;

    public function getYourFactory()
    {
        if (!isset($this->yourFactory)) {
            $this->yourFactory = this->getServiceLocator()->get('YourNamespace\Factory\YourFactoryFinalName');
        }
        return $this->yourFactory;
    }

    public function setYourFactory(YourFactory $yourFactory)
    {
        $this->yourFactory = $yourFactory;
        return $this;
    }
}
要使用的类的属性:

use YourNamespace\Factory\YourFactoryTrait;
在方法体中:

$factory = $this->getYourFactory();
$factory->setData($data);

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

你把它放在元素的输入过滤器上了吗?如果你把它放在它自己的元素上,它就不起作用了。我确实指定了一个过滤器。见编辑2。
use YourNamespace\Factory\YourFactoryTrait;
$factory = $this->getYourFactory();
$factory->setData($data);

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