需要ZF2 + Doctrine2注释表格& AllowEmpty

时间:2016-03-10 13:05:25

标签: zend-framework2 annotations doctrine

我在Doctrine Entity Class中使用Annotation。字段的注释是:

   /**
 * @var integer
 *
 * @ORM\Column(name="duree", type="integer", nullable=true)
 *
 * @Form\Type("Zend\Form\Element\Number")
 * @Form\Attributes({"required":false, "placeholder":"Durée", "min":"1", "max":"20"})
 * @Form\Required(false)
 * @Form\AllowEmpty()
 * @Form\Options({"label":"Durée :"})
 * @Form\Filter({"name": "Int"})
 * @Form\Validator({"name":"IsInt"})
 */
private $duree;

因此DB列可以为空(可空),并且形式相同(即用户可以将输入留空)。我注释了两个注释必需(false)和allowEmpty,但表单永远不会有效(此字段总是得到isEmpty)。

如果我将@Form \ Type设置为" Text",它工作正常(如果输入为空,则表单为有效事件)。但是对于班级编号,它并不相同。

我使用Select元素(与关系相对应)使用相同的pb。注释是:

    /**
 * @var \Application\Entity\CcCategorie
 *
 * @ORM\ManyToOne(targetEntity="Application\Entity\CcCategorie")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="categorie", referencedColumnName="id", nullable=true, onDelete="SET NULL")
 * })
 * 
 * @Form\Type("DoctrineModule\Form\Element\ObjectSelect")
 * @Form\Attributes({"type":"select", "required":false})
 * @Form\Options({"label":"Catégorie :"})
 * @Form\Required(false)
 * @Form\AllowEmpty()
 * @Form\Options({
 *      "label":"Catégorie :",
 *      "empty_option": "---",
 *      "target_class": "Application\Entity\CcCategorie",
 *      "property": "label"
 * })     
 */
private $categorie;

但是,如果在验证表单时将Select设置为空选项,则该字段有错误(isEmpty)。

我找到的唯一解决方法是设置注释

 * @Form\Type("\Application\Form\Entity\CcRepriseFieldset")

位于实体类的顶部。 CcRepriseFieldset类扩展了Fieldset,并实现了InputFilterProviderInterface。然后我在这个类中指定函数:

public function getInputFilterSpecification()
    {
        return array(
            array(
                "name" => "duree",
                'required' => false,
                'allow_empty' => true,
            ),
            array(
                "name" => "categorie",
                'required' => false,
                'allow_empty' => true,
            ),
        );
    }

有了它,它可以工作......但它不是注释。 我不明白为什么注释不起作用

感谢

2 个答案:

答案 0 :(得分:0)

好的,我发现了什么问题。 Annotation Builder创建了一个包含所有字段规范的数组,如下所示:

 array (size=7)
    'name' => string 'reprise' (length=7)
    'attributes' => array (size=0)
    'elements' => 
      array (size=8)
      1 =>array (size=2)
...
  'fieldsets' => array (size=0) empty
  'type' => string '\Application\Form\Entity\CcRepriseFieldset'
(length=42)
  'input_filter' => 
    array (size=8)
      'name' => 
        array (size=4)
          'name' => string 'name' (length=4)
          'required' => boolean true
          'filters' => 
            array (size=3)
              ...
          'validators' => 
            array (size=2)
...

但是这个数组是附加到Entity的FieldSet的数组。 所以Zend \ Form \ Factory从不解析这个因为'input_filter'只解析ZendForm元素而不是字段集(当然因为Fieldset没有SetInputFilter方法)...

答案 1 :(得分:0)

好的我有一个解决方法,但我对此并不十分满意。 首先,我创建了一个新的FormFactory:

UnpackablePrimitive

所以这个工厂将“input_filter”添加到fieldset的input_filter_factory变量中。

然后在fieldset类中:

namespace Application\Form;
use Zend\Form\FieldsetInterface;
Class EntityFormFactory extends \Zend\Form\Factory {
     public function configureFieldset(FieldsetInterface $fieldset, $spec)
    {
       $fieldset=parent::configureFieldset($fieldset, $spec);

        $fieldset->input_filter_factory= $spec['input_filter'];
        return $fieldset;
    }
}

最后,当我使用annotationbuilder时,我改变了formfactory:

class CcRepriseFieldset extends Fieldset implements \Zend\InputFilter\InputFilterProviderInterface
{
   public function getInputFilterSpecification()
    {
        if (isset($this->input_filter_factory)){
            return $this->input_filter_factory;
        }        
    }
}

这一切都很好......我不是最好的方法。