2016-01-23 42 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