2015-04-16 34 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