Zend Framework 2表单集合元素通过Doctrine Entity上的注释

时间:2013-07-08 13:05:05

标签: doctrine-orm zend-framework2

我有一个安装/配置了Doctrine的Zend Framework 2项目。我直接在实体上使用Zend Form注释来生成表单来显示/编辑实体数据。我遇到了一个问题:

具有以ManyToMany关系配置的子实体(Territory)集合的实体(Vendor)。学说关系工作得很好,但是我已经添加了zend形式的注释

/*
 * ...doctrine annotations...
 * @Annotation\Type("Zend\Form\Element\Collection")
 * @Annotation\Options({"label":"Territory", "target_element": {"type": "\DocurepVendor\Form\TerritoryFieldset"}})
 */

创建我创建的fieldset对象,但不要将字段名称命名为数组。 (输入都是命名为city而不是city [])所以当我提交更新表单时,映射器需要一个数组,但只找到一个字符串并失败。

这是我的字段集代码。

TerritoryFieldset.php     

namespace DocurepVendor\Form;

use \Zend\Form\Fieldset;
use \Zend\InputFilter\InputFilterProviderInterface;

class TerritoryFieldset extends Fieldset implements InputFilterProviderInterface {

    public function __construct($name = null, $options = array()) {
        parent::__construct('Locations', $options);
        $this->setHydrator(new \Zend\Stdlib\Hydrator\ClassMethods())
                ->setObject(new \DocurepLocation\Entity\Territory());

        $this->add(array(
            'name' => 'city',
            'options' => array(
                'label' => 'City'
            ),
            'attributes' => array()
        ))->add(array(
            'name' => 'state',
            'options' => array(
                'label' => 'State'
            ),
            'attributes' => array(
                'required' => 'required'
            )
        ));
    }

    public function getInputFilterSpecification() {
        return array();
    }

}

如果我将字段集中的名称设置为“city []”而不是“city”,则字段集甚至不会填充教条数据。

我不确定这是否需要在子元素字段集中配置,父元素的注释,完全在其他地方,或者如果这根本无法完成,我需要以另一种方式实现它。有人可以帮我推动正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我认为你应该使用Doctrine Hydrator而不是\ Zend \ Stdlib \ Hydrator \ ClassMethods()

use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;

..

$this->setHydrator(new DoctrineHydrator())