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,因为它不是一个实际的映射属性,我不希望它。它只是决定显示的字段。
这似乎是正确的但我目前的代码我最初得到与单选按钮“订户”形式和“朋友“...基于哪一个被点击,我想要加载表单的其余部分。现在当一个人被点击时,什么也没有发生......不知道我是否使用了正确的功能,想我可能需要一些JS/Ajax来做到这一点?我正在关注这个食谱页面http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms – snoop168
@ snoop168是的,所以,你需要'$ userType = $ form-> get('userType') - > getData()'。 '$ form'是主要的形式;它的数据不会有你想要的值,因为'userType'没有被映射。但是,如果你得到'userType'字段(子表单),那*会包含你需要的数据。 – jbafford
我想我明白你的意思,但我不认为它完全涵盖了我想要做的事情,这可能是我的错,因为我甚至不知道我是否在正确的轨道上。有了上面的所有代码,包括你的建议,只给我一个带有2个单选按钮的表单(这是我想要开始的),但是一旦选择了一个单选按钮,我希望表单立即用“子表单”更新。这个子窗体将根据所选的单选按钮而有所不同。现在你选择一个单选按钮,没有任何反应。 – snoop168