首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2嵌入式实体表单类型

Symfony2嵌入式实体表单类型
EN

Stack Overflow用户
提问于 2013-12-09 22:27:57
回答 1查看 1.8K关注 0票数 1

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

在后端内容管理系统,我想给管理员的能力,以选择他们的内容出现在哪些网站(ManyToMany关系),但只允许他们从属于当前网站组的网站选择。请考虑以下几点:

代码语言:javascript
复制
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。

这些选项将以不同的形式嵌入到整个内容管理系统中,为了只显示正确的站点,我可以在NewsPostType中执行以下操作:

代码语言:javascript
复制
$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,它可以将管理器注入其中,并如下所示:

代码语言:javascript
复制
$builder->add('sites', 'siteGroupSites');

siteGroupSites类型定义如下:

代码语言:javascript
复制
<?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',
        );
    }
}

如果我尝试像上面那样包含站点选项,我会得到以下结果:

代码语言:javascript
复制
Expected argument of type "Me\MyBundle\Entity\Site", 
"Doctrine\Common\Collections\ArrayCollection" given

我想我可能需要一些描述的DataTransformer,但我不确定如何解决这个问题。我还想用twig显示选项列表,只需使用

代码语言:javascript
复制
{{ form_row(form.sites) }}

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

代码语言:javascript
复制
{{ form_row(form.sites.sites) }}

有谁能为我指出如何实现这些目标的正确方向吗?

EN

回答 1

Stack Overflow用户

发布于 2013-12-09 22:30:00

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

代码语言:javascript
复制
public function getDefaultOptions(array $options) {
    return array(
        'data_class' => 'Me\MyBundle\Entity\Site',
    );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20473041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档