Zend \ Form \ Element \ Collection包含来自Doctrine类表继承的元素?

时间:2013-03-15 15:06:19

标签: doctrine-orm zend-framework2

我对使用Doctrine ORM的类表继承(CTI)与ZF2的Zend\Form有疑问。在我们的系统中,每个用户可以拥有多个角色,这些角色通过类表继承方案定义,以便我们可以定义特定于角色的配置文件字段(即:“年级”仅适用于学生帐户)。要构造它,有一个Account实体与Account\Role(CTI“基础”类)的OneToMany关联:

<?php
namespace CdliPortal\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="account")
 */
class Account implements AccountInterface
{
    // Other Fields Omitted

    /**
     * @ORM\OneToMany(targetEntity="CdliPortal\Entity\Account\Role", mappedBy="account", cascade={"ALL"})
     */
    protected $roles;
}

我已经设置了一个绑定Zend\Form实体的Account实例(我跟着example from the DoctrineModule documentation),所有内容似乎都在运行A-OK ...除外CTI系列。在我的Form对象中,我添加了一个Zend\Form\Element\Collection成员:

$roles = $user->getRoles();
if ( count($roles) > 0 ) {
    $formAccount->add(array(
        'type' => 'Zend\Form\Element\Collection',
        'name' => 'roles',
        'options' => array(
            'count' => count($roles),
            'target_element' => $this->serviceLocator->get('cdliportal_form_account_role'),
        ),
    ));
}

但是,正如您在上面所看到的那样,在设置roles字段时,在集合级别指定了target_element(在本例中为字段集),这意味着集合必须是统一的。对于我上面提到的情况,我需要能够为集合的每个元素单独指定target_element,具体取决于它所代表的CTI成员。

关于如何实现这一点的任何想法/建议仍然允许在绑定Account对象时自动填充集合的元素?

1 个答案:

答案 0 :(得分:1)

我已经入侵了一个适用于我的用例的解决方案:构建一个自定义NonuniformCollection表单元素,该元素传递一组原型(每个CTI实体一个)并克隆适当的当元素被填充时。

我已将代码放在Gist中:https://gist.github.com/adamlundrigan/5195646

有一点需要注意,模板功能不再有效,因为它不知道要使用哪种原型。

如果有任何人有任何建议,我仍然愿意以更清洁的方式实现这一目标:)