2015-04-16 39 views
3

场属性比方说,我们有一个表单生成器定义这样一种形式:变化运行

$builder 
     ->add('username', 'text', ['disabled' => false]); 

我们可以改变一个form.username项目的属性disabled$form实例被创建后?

我发现,你可以用

$formBuilder->get('username')->getAttributes('data_collector/passed_options')['data_collector/passed_options'] 

获得的属性,然后用相应setAttributes更换。

但它看起来超级肮脏。

我发现的另一种替代方法是$formBuilder->remove->add()元素回来。这也是丑陋的。

那么,任何正确的方法来设置它?

该方案:窗体是建立,然后验证,如果它是无效的情况下,我需要标记一个字段禁用,并再次呈现它。

回答

1

这是简化的例子说明了如何使用动态表单元素操纵,name字段默认禁用,只有在提供会员号码将被启用:

class ExampleType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('member_number', 'integer', array(
       'required' => false 
      )); 

     $f = function(FormEvent $event) { 
      $form = $event->getForm(); 
      $data = $event->getData(); 
      $attr = array('disabled' => true); 


      if (isset($data) && $data['member_number']) { 
       unset($attr['disabled']); 
      } 

      $form->add('name', 'text', $attr); 

     }; 
     $builder->addEventListener(FormEvents::PRE_SET_DATA, $f); 
     $builder->addEventListener(FormEvents::PRE_SUBMIT, $f);   
    } 
+0

这是丑陋的一样好,但它正式回答了这个问题,谢谢。在这个项目中,我会'删除 - 添加'它 - 2行比10+和事件更容易维护。 – zerkms

+0

我相信这实际上是处理动态元素的推荐方式,但我同意它看起来很麻烦 –

+0

“推荐的方式”---因为被推荐它太有限了,无论如何,没关系:-) – zerkms

1

我可能是错的,但我认为你可以使用buildView并在那里更新它。

public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    $view->offsetGet('username')->vars['disabled'] = false; 
} 
+0

我将明天检查,谢谢 – zerkms