在我的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) }}
有人能指出我如何完成这些目标吗?
答案 0 :(得分:0)
尝试将data_class设置为null。
public function getDefaultOptions(array $options) {
return array(
'data_class' => 'Me\MyBundle\Entity\Site',
);
}