2013-03-19 60 views
0

我是我的表單,但無法弄清楚如何'擴展'他們。你可以'延長'表格班嗎?

例如,我有一個CustomerType表單類和一個EmailType表單類。我可以添加EmailType直接進入我的CustomerType

$builder->add('emails', 'collection', array(
    'type'   => new EmailType(), 
    'allow_add' => true, 
    'by_reference' => false 
)); 

,但我更願意這樣做的控制器,讓我CustomerType形式類僅包含客戶信息。我覺得這是更模塊化和可重複使用的,因爲有時候我希望我的用戶只能編輯Customer的詳細信息,以及其他Customer詳細信息以及與該客戶相關的Email對象。 (例如,在查看客戶的工單時的第一種情況,以及在創建新客戶時的第二種情況下)。

這可能嗎?我在想我的東西沿線

$form = $this->createForm(new CustomerType(), $customer); 
$form->add('emails', 'collection', ...) 

在我的控制器。

+0

爲什麼它可以重複使用?如果您有兩個相同的表單並且要重命名電子郵件字段,則可以在兩個地方執行。你的目標是什麼? – meze 2013-03-19 05:40:11

+0

我在這個問題上澄清了一下。 – 2013-03-19 05:48:12

回答

0

當您的表單創建時會告訴表單是否應該嵌入集合,您可以傳遞一個選項(比如說「with_email_edition」)。

在控制器:

$form = $this->createForm(new CustomerType(), $customerEntity, array('with_email_edition' => true)); 

形式:

只需添加選項,在setDefaultOptions:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
       'with_email_edition' => null, 
      )) 
      ->setAllowedValues(array(
       'with_email_edition' => array(true, false), 
      )); 
} 

,然後在 「buildForm」 檢查該選項的值,並添加一個基於它的字段:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    if(array_key_exists("with_email_edition", $options) && $options['with_email_edition'] === true) 
    { 
      //Add a specific field with $builder->add for example 
    } 
}