我在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,
),
);
}
有了它,它可以工作......但它不是注释。 我不明白为什么注释不起作用
感谢
答案 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;
}
}
}
这一切都很好......我不是最好的方法。