Symfony动态表单单选按钮

时间:2014-04-30 14:23:44

标签: forms symfony

我想根据单选按钮状态设置我的表单,但无论使用什么formEvents ...值都没有改变,所以我无法删除或添加字段......

Atm,我有这个:

$builder->addEventListener(
    FormEvents::PRE_SET_DATA,
    function(FormEvent $event) use ($factory){
        $data = $event->getData();
        echo 'value :' .$data->radioAvatar;
        if ($data->radioAvatar){
                $form = $event->getForm();
                $form->add('avatar');
            }

}     );

无论什么无线电有效,我都不会看到新字段(radioAvatar的默认值为0)。因此,如果默认值为1,则字段将显示在我的提交按钮...

我的forminput:

$builder
    ->add('name', 'text',array(
    'label' =>'Public name'))
    ->add('radioAvatar', 'choice', array(
    'label' => 'Had you already sent a picture',
    'choices' => array(
        0 => 'no',
        1 => 'yes'),
    'multiple' => false,
    'expanded' => true))
    ->add('save', 'submit',array(
    'label'=> 'Update my profil',
    'attr' => array('class' => 'btn btn-primary elemtopmarg')))
;

是否可以根据单选按钮更新表单以及单选按钮组下的显示方式?

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

如果有人发现这篇文章,你会发现我是如何解决我的问题的:

1:您必须创建一个新的特定表单(在此之前我的所有表单只显示在一个树枝中......)

2:每行显示表单行,然后将封装对象(新的ObjectType())放在特定的div中。然后添加另一个特定的div来显示字段' entity')

3:根据单选按钮

插入用于显示/隐藏指定div的javascript

4:调整你的控制器。

我认为这不是最好的方法。但是如果你找到一个更好的方式来回答或联系我,我在互联网上找不到好东西。 :)

致以最诚挚的问候,

答案 1 :(得分:0)

我以与您尝试过的方式类似的方式修改了表单。我的代码有一些不同之处:

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

            $data = $event->getData();
            if($data->getName() != NULL){
                $form->add('surname');
            }
        }
    );

这对我有用。

如果您想在单选按钮下显示此字段(在我的情况下在'name'字段下),您可以在表单中执行此操作:

$builder
    ->add('name')
    ->add('surname', 'hidden');

稍后在听众中,您可以更改字段的类型:

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

            $data = $event->getData();
            if($data->getName() != NULL){
                $field = $builder->get('surname');
                $field->setType('text');
            }
        }
    );

最后一个例子没有经过测试,但我认为它应该可行。

我希望这对你有用。

亲切的问候。