2016-01-23 48 views
1

嘗試製作用戶選擇一個選項並根據其選擇加載其他字段的表單。到目前爲止,我有一個UserSignupType:Symfony3獲取事件偵聽器中非映射字段的值

class UserSignupType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('userType', ChoiceType::class, array(
       'choices' => array(
        "Subscriber" => "Subscriber", 
        "Friend" => "Friend" 
        ), 
       'expanded' => true, 
       'mapped' => false 
       )); 

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

       $usertype = $form->get('userType')->getData(); //updated per JBaffords answer 

       if($userType == "Subscriber") 
       { 
        $builder->add('agency', EntityType::class, array(
         "class" => "\AppBundle\Entity\Agency", 
         "label" => "name")); 
       } 
       elseif($userType == "Friend") 
       { 
        $builder->add('phoneNumber', PhoneNumberType::class, array(
         'default_region' => 'US', 
         'format' => PhoneNumberFormat::NATIONAL)); 
       } 
      } 
     ); 
    } 

    // ... 
} 

不知道,如果GetData方法是用正確的方法,如果是,我需要以某種方式獲得了「用戶類型」字段出來。我不能調用getUserType,因爲它不是一個實際的映射屬性,我不希望它。它只是決定顯示的字段。

回答

1

您可以通過執行獲得任何形式的元素(映射或取消映射)值:

$form->get('fieldName')->getData(); 

get()返回一個Form對象,所以如果你有一個嵌套的表格,您可以繼續撥打->get('nextFieldName')每個孩子,直到你到達你需要的表單元素。

對於表單返回的值從getData將取決於(其他事物)其子元素的映射。如果表格沒有孩子,那麼它的價值就是它的價值;該映射只是確定該值是否填充到其父數據中。

在特定情況下,獲得了userType元素的數據,你會怎麼做:

$userType = $form->get('userType')->getData(); 
+0

這似乎是正確的但我目前的代碼我最初得到與單選按鈕「訂戶」形式和「朋友「...基於哪一個被點擊,我想要加載表單的其餘部分。現在當一個人被點擊時,什麼也沒有發生......不知道我是否使用了正確的功能,想我可能需要一些JS/Ajax來做到這一點?我正在關注這個食譜頁面http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms – snoop168

+0

@ snoop168是的,所以,你需要'$ userType = $ form-> get('userType') - > getData()'。 '$ form'是主要的形式;它的數據不會有你想要的值,因爲'userType'沒有被映射。但是,如果你得到'userType'字段(子表單),那*會包含你需要的數據。 – jbafford

+0

我想我明白你的意思,但我不認爲它完全涵蓋了我想要做的事情,這可能是我的錯,因爲我甚至不知道我是否在正確的軌道上。有了上面的所有代碼,包括你的建議,只給我一個帶有2個單選按鈕的表單(這是我想要開始的),但是一旦選擇了一個單選按鈕,我希望表單立即用「子表單」更新。這個子窗體將根據所選的單選按鈕而有所不同。現在你選擇一個單選按鈕,沒有任何反應。 – snoop168