2016-01-17 136 views
1

我有一個嵌入式窗體的父窗體。在嵌入式(子)形式中,我正在尋找使用從數據庫中查詢的另一個實體的選項來創建下拉字段。作爲查詢的一部分,我需要引用父實體,但不確定如何從子窗體類訪問該父對象。如何從子窗體獲取父Symfony3窗體的值?

例如父母是$subscriber實體。在我的情況下,父窗體實際上並不顯示與訂閱人相關的任何屬性,只是允許您添加或刪除子實體窗體。每個子表單都必須具有上述的字段,但是這些選擇必須限制爲訂戶已與之建立關係的值。

但這是我的問題所在。我如何可以訪問下面的$subscriber變量從子窗體?:使用的代碼

$builder->add('otherEntity', EntityType::class, array(
    'class' => "AppBundle:YetAnotherEntity", 
    'label' => "Other Entity", 
    'query_builder' => $this->manager->getRepository("AppBundle:OtherEntity")->getOtherEntityBySubscriber($subscriber) 
)); 

該消息又在我的倉庫調用該函數:

public function getOtherEntityBySubscriber($subscriber) 
{ 
    return $this->getEntityManager() 
     ->createQuery(
      'SELECT o FROM AppBundle:OtherEntity o JOIN n.subscriberOtherEntity so WHERE o.subscriber = :subscriber' 
     ) 
     ->setParameter("subscriber", $subscriber) 
     ->getResult(); 
} 

jbafford的建議後: 我想你第一個選項,但我的問題是,我的父窗體調用類型CollectionType ::類不是我的自定義類型...因爲我打算製作一個表單,可以添加多個子項目。我無法將任何自定義選項傳遞給CollectionType。我是否需要擴展CollectionType以使我自己的Type能夠接受額外的選項?

我父形式如下: $ builder->添加( '孩子',CollectionType ::類,陣列( 「條目類型」=> ChildType ::類, 「allow_add」=>真, 「 by_reference「=> false, 」allow_delete「=> true)); 如果我在上面添加訂戶,我會收到一個錯誤,基本上說它不是一個有效的選項。我玩弄了我的ChildType擴展CollectionType,但我不認爲這是我需要做的,並得到一個錯誤:
表單的視圖數據預計是類AppBundle \ Entity \ Child的一個實例,但是類Doctrine \ ORM \ PersistentCollection的一個實例。您可以通過將「data_class」選項設置爲null或通過添加將Doctrine \ ORM \ PersistentCollection類的實例轉換爲AppBundle \ Entity \ Child實例的視圖轉換器來避免此錯誤。

我想我需要另一個類擴展CollectionType只是在上面放add方法,但我還是希望我的條目類型是ChildType ::類,你可以做到這一點

回答

1

的一種方式,因爲$subscriber是您父母表單的主題是將$subscriber作爲表單選項傳遞給子表單。

你可以在孩子定義它是這樣的:

class ChildForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $subscriber = $options['subscriber']; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setRequired(['subscriber']); 
    } 
} 

,然後從父傳遞。

如果你的父窗體是根形式,你可以得到$subscriber$options['data']

 $builder->add('otherEntity', ChildForm::class, [ 
      'subscriber' => $options['data'], 
     ], 

如果沒有,你可能需要使用一個事件偵聽器來獲取表單數據:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     $subscriber = $event->getData(); 
     $form = $event->getForm(); 

     $form->add('otherEntity', ChildForm::class, [ 
      'subscriber' => $subscriber, 
     ]); 
    }); 
+0

這聽起來完全像我想弄清楚的......我會給它一個鏡頭,並可能將其標記爲答案。 – snoop168

+0

我試過你的第一個選項,但我的問題是,我的父窗體調用類型的CollectionType ::類不是我的自定義類型...因爲我打算做一個可以添加多個子項目的窗體。我無法將任何自定義選項傳遞給CollectionType。我是否需要擴展CollectionType以使我自己的Type能夠接受額外的選項? – snoop168

+0

不可以。您可以傳遞給'CollectionType'的一個選項是'['options'=> [傳遞給子元素的選項數組]]'。 (Symfony中的'entry_options'> = 2.8)http://symfony.com/doc/current/reference/forms/types/collection.html#entry-options – jbafford

相關問題