【问题标题】:Symfony dynamic form radio buttonSymfony 动态表单单选按钮
【发布时间】:2014-05-02 22:45:05
【问题描述】:

我想根据单选按钮状态设置我的表单,但无论使用什么 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,则字段会出现在我的提交按钮下方...

我的表单输入:

$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')))
;

是否可以根据单选按钮更新表单以及在单选按钮组下如何显示?

最好的问候,

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

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

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

    2:您每行显示表单行,然后将封装的对象(您的 new ObjectType() )放在特定的 div 中。然后添加另一个特定的 div 来显示字段“实体”)

    3 : 根据单选按钮插入用于显示/隐藏指定 div 的 javascript

    4 : 调整你的控制器。

    我认为这不是最好的方法。但是我在网上没有找到好的东西,如果你找到更好的方法,请不要现场回答或联系我。 :)

    最好的问候,

    【讨论】:

      【解决方案2】:

      我已经按照您尝试过的类似方式修改了表单。我的代码有一些不同:

          $builder->addEventListener(
              FormEvents::PRE_SET_DATA,
              function(FormEvent $event) {
                  $form = $event->getForm();
      
                  $data = $event->getData();
                  if($data->getName() != NULL){
                      $form->add('surname');
                  }
              }
          );
      

      这对我有用。

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

      $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');
                  }
              }
          );
      

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

      我希望这对你有用。

      亲切的问候。

      【讨论】:

      • 您好,它不起作用,问题是:无论收音机检查什么值都没有更新。 radioAvatar 始终等于 0,因此根据用户的选择它不是动态的
      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2012-07-18
      • 1970-01-01
      • 2018-11-30
      • 2016-03-31
      相关资源
      最近更新 更多