在我的Symfony2 (目前是2.0)应用程序中,我有一个站点表,每个站点都被分配到一个“站点组”。我有一个事件侦听器,它将当前站点和站点组设置为onKernelRequest函数中站点管理器类的属性。
在后端内容管理系统,我想给管理员的能力,以选择他们的内容出现在哪些网站(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。
这些选项将以不同的形式嵌入到整个内容管理系统中,为了只显示正确的站点,我可以在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,但我不确定如何解决这个问题。我还想用twig显示选项列表,只需使用
{{ form_row(form.sites) }}而不是我认为需要的内容(因为form.sites是嵌入式表单,而form.sites.sites将是嵌入式表单的站点属性):
{{ form_row(form.sites.sites) }}有谁能为我指出如何实现这些目标的正确方向吗?
发布于 2013-12-09 22:30:00
尝试在下面将data_class设置为null。
public function getDefaultOptions(array $options) {
return array(
'data_class' => 'Me\MyBundle\Entity\Site',
);
}https://stackoverflow.com/questions/20473041
复制相似问题