繁体   English   中英

Symfony2嵌入式实体表单类型

[英]Symfony2 embedded entity form type

在我的Symfony2(当前为2.0)应用程序中,我有一个站点表,每个站点都分配给一个“站点组”。 我有一个事件侦听器,它在onKernelRequest函数中将当前站点和站点组设置为站点管理器类的属性。

在后端CMS上,我希望管理员可以选择其内容显示在哪些站点上(ManyToMany关系),但仅允许他们从属于当前站点组的站点中进行选择。 考虑以下:

Site group 1:           Site group 2:
    site1.com               site3.com
    site2.com               site4.com

如果site1.com上的管理员尝试添加内容,则他们只会看到site1.com和site2.com作为选项,而site4.com上的管理员只会看到site3.com和site4.com。

这些选项将以各种形式嵌入CMS中,并且为了仅显示正确的站点,我可以在例如NewsPostType中执行以下操作:

$siteGroup = $siteManager->getSiteGroup();

$builder->add('sites', 'entity', array(
    'class'         => 'MyBundle:Site',
    'multiple'      => true,
    'expanded'      => true,
    'property'      => 'name',
    'query_builder' => function(EntityRepository $er) use ($siteGroup) {
        $qb = $er->createQueryBuilder('s');
        return $qb->andWhere('s.siteGroup = :siteGroup')
            ->setParameter('siteGroup', $siteGroup);
    },
));

这将正确显示仅属于当前网站用户组的那些网站。

但是,为了做到这一点,我必须定义要在服务中包括这些选项的每个FormType,以便注入“ siteManager”对象,因此为避免这种情况,我考虑过创建一个新的FormType,它可以经理被注入其中,包括如下:

$builder->add('sites', 'siteGroupSites');

siteGroupSites类型的定义如下:

<?php

class SiteGroupSitesType extends AbstractType
{
    private $siteManager;

    public function __construct($siteManager) {
        $this->siteManager = $siteManager;
    }

    public function buildForm(FormBuilder $builder, array $options) {
        $currentSite = $this->siteManager->getCurrentSite();
        $siteGroup   = $currentSite ? $currentSite->getSiteGroup() : null;

        $builder->add('sites', 'entity', array(
            'class'         => 'MyBundle:Site',
            'multiple'      => true,
            'expanded'      => true,
            'property'      => 'name',
            'query_builder' => function(EntityRepository $er) use ($siteGroup) {
                $qb = $er->createQueryBuilder('s');
                return $qb->andWhere('s.siteGroup = :siteGroup')
                    ->setParameter('siteGroup', $siteGroup);
            },
        ));
    }

    public function getDefaultOptions(array $options) {
        return array(
            'data_class' => 'Me\MyBundle\Entity\Site',
        );
    }
}

如果尝试包括上述站点选项,则会得到以下信息:

Expected argument of type "Me\MyBundle\Entity\Site", 
"Doctrine\Common\Collections\ArrayCollection" given

我想我可能需要一些说明的DataTransformer,但不确定如何解决。 我也想通过只使用显示树枝中的选项列表

{{ form_row(form.sites) }}

而不是我认为需要的(因为form.sites是嵌入式表单,而form.sites.sites是嵌入式表单的sites属性):

{{ form_row(form.sites.sites) }}

谁能为我指出正确的方向呢?

请尝试在下面将data_class设置为null。

public function getDefaultOptions(array $options) {
    return array(
        'data_class' => 'Me\MyBundle\Entity\Site',
    );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM