ZF2 + DoctrineModule:允许Doctrine表单元素ObjectSelect为空

时间:2016-11-22 12:40:43

标签: php forms validation doctrine-orm zend-framework2

对于我的一个实体,我使用module.exports = { sum(a, b) {...} }; 元素来Zend\Form\Form使用户能够选择引用的实体。

DoctrineModule\Form\Element\ObjectSelect

引用的实体可能为空(=数据库中的外键字段可以是class MyEntityForm extends Zend\Form\Form { public function __construct() { // ... $this->add([ 'name' => 'referenced_entity', 'type' => 'DoctrineModule\Form\Element\ObjectSelect', 'options' => [ 'object_manager' => $object_manager, 'target_class' => 'MyOtherEntity', 'property' => 'id', 'display_empty_item' => true ], ]); // ... } } )。我只是无法获得表单来验证是否没有选择引用的实体。即使给定的NULL为空(referenced_entitynull)或根本不存在(数据数组中缺少键""),我希望我的表单能够验证。

我尝试了各种不同的输入滤波器规格,最后的设置如下

referenced_entity

但无济于事,验证错误保持不变(class MyEntityForm extends Zend\Form\Form implements Zend\InputFilter\InputProviderInterface { // ... public function getInputSpecification() { return [ // ... 'referenced_entity' => [ 'required' => false, 'allow_empty' => true, 'continue_if_empty' => false ], // ... } // ... } 之后$form->getMessages()的var_dump摘录

$form->isValid()

我是否必须扩展'referenced_entity' => array (size=1) 'isEmpty' => string 'Value is required and can't be empty' (length=36) 表单元素以更改其输入过滤器规范并删除ObjectSelect验证程序,还是有更简单的解决方案?

2 个答案:

答案 0 :(得分:1)

如果我记得很清楚,如果您想在 Form 类中提供输入过滤器配置,那么您必须实现输入过滤器 ProviderInterface 界面。 如果您想在元素级别配置它,那么 Element 类必须实现 InputProviderInterface 接口

所以这意味着你的表单类必须是这样的:

class MyEntityForm
    extends Zend\Form\Form
    implements
        // this... 
        // Zend\InputFilter\InputProviderInterface
        // must be this!
        Zend\InputFilter\InputFilterProviderInterface
{
    // ...
    public function getInputFilterSpecification()
    {
        return [
            // ...
            'referenced_entity' => [
                'required' => false,
                'validators' => [],
                'filters' => [],
            ],
            // ...
    }
    // ...
}

答案 1 :(得分:0)

DoctrineModule\Form\Element\ObjectSelect继承了Zend\Form\Element\Select,它自身包含了自动a input especification with a validator

我没有测试自己,但解决此问题的方法是通过在选项中添加'disable_inarray_validator'键来删除此验证器:

public function __construct()
{
    // ...
    $this->add([
        'name' => 'referenced_entity',
        'type' => 'DoctrineModule\Form\Element\ObjectSelect',
        'options' => [
            'object_manager' => $object_manager,
            'target_class' => 'MyOtherEntity',
            'property' => 'id',
            'display_empty_item' => true,
            'disable_inarray_validator' => true
        ],
    ]);
    // ...
    //or via method
    $this->get('referenced_entity')->setDisableInArrayValidator(true);
}