簡體   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