2017-01-17 83 views
0

我在爲我的控制器中的「編輯」我的表單字段時遇到了麻煩。如何在我的控制器中編輯表單的字段?

這是我有:

我已經註冊爲我的功能在我的控制器調用的服務的Symfony2的形式。我正在刪除一些不需要的字段,我正在引導用戶,然後添加其他一些表單。 (我意識到我可以創建另一個表單並創建另一個服務,但爲了我的目的,這會有點矯枉過正,我這樣做是因爲表單功能相同,但是某些字段不需要,並且一些新的具體的是)。

我現在想要在這種形式下'編輯'一個字段...'職業'字段。該字段是choice字段,充當由一系列選項填充的單選按鈕。這是required,並沒有empty_value要求在其原始狀態。

我想編輯它在我的控制器功能與false一個required值但有相同的精確值和null一個empty_value

隨着下面的註釋代碼的結果是我的'新'形式的occupation字段的缺失,它被替換爲一個空的下拉列表。我意識到這是因爲我壓倒了整個領域,但我無法弄清楚如何簡單地編輯它。

代碼:

/** 
* Explanation of addAndRemoveFieldsInRegisterForm function: 
* The function gets the 'registration' form and removes any 
*  fields not needed for the 'in_registration' form 
*  and then adds the necessary fields to the form. 
*/ 
private function addAndRemoveFieldsInRegisterForm($user) 
{ 
    $form = $this->createForm('user_registration', $user); 

    // http://stackoverflow.com/questions/10920006/pass-custom-options-to-a-symfony2-form --- 
         // --- use that to help. Look at changing the value of array. 

    $form->remove('title'); 
    $form->remove('company'); 
    $form->remove('username'); 
    $form->remove('city'); 
    $form->remove('state'); 
    $form->remove('country'); 
    $form->remove('gender'); 
    $form->remove('age'); 
    $form->remove('roles'); 

    // $form->remove('occupation'); 

    // $pr = $form->get('occupation'); 
    //  $pr->set('required' => false); 

    // $form->get('occupation')->add('required'=>false, 'empty_value'=>null); 

    // $form->add('occupation','choice', array(
    //  'required' => false, 
    //  'empty_value' => null, 
    //));   
    // echo "<pre>"; 
    // var_dump(get_class_methods($form));die; 
    $form->add('occupation','choice', array(
      'required' => false, 
      'empty_value' => null, 
    )); 

    $form->add('canEmail', 'checkbox', array(
     'label' => 'Can Email?', 
     'required' => false, 
    )); 

    $form->add('sendEmail', 'choice', array(
     'label' => 'Send Welcome Email? ', 
     'required' => true, 
     'mapped' => false, 
     'expanded' => true, 
     'choices' => array(
      "yes" => "Yes", 
      "no" => "No" 
      ), 
    )); 

    return $form; 

} 

原生形態(這是作爲一個服務的一個)

private $requireOccupation; 

$this->requireOccupation = true; 


->add('occupation','choice', $options['occupation']) 


public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $occupation = array(
      "label" => "Which of these currently describes you best? (Occupation):", 
      "expanded" => true, 
      'required'=> $this->requireOccupation, 
      "choices" => array(
       "X" => "X", 
       "B" => "B", 
       "C" => "C", 
       "J" => "J", 
      ), 
      'constraints' => array(
       new NotBlank() 
      )); 

    $resolver->setDefaults(array(
     'occupation' => $occupation, 
    )); 
} 
+0

是否要編輯小部件以獲得新的默認值,或者您想要編輯用戶填充的數據以考慮您的默認值? – goto

+0

我想編輯小部件以獲得新的默認值,但也保留其他(未編輯)的值。 – Ale

回答

0

首先,我意識到我想解決這個問題的方式爲奇數當考慮到我可以用我想要使用的字段創建另一個表單,或者只需要一個字段來更改並註冊表單作爲服務在其他地方使用,但我的任務是以這種方式完成它。

其次,我的解決方案很簡單。我將值傳遞給我的表單,並在窗體中設置默認值。

形式:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $requireOccupation = true; 
    $emptyValue = null; 
    //whatever other values you want to set here 

    $resolver->setDefaults(array(
     'requireOccupation' => $requireOccupation, 
     'emptyValue' => $emptyValue, 
    )); 
} 

,然後在球場上的屬性:

$builder->add('occupation', 'choice', array(
    "label" => "Some sort of label", 
    "required" => $options['requireOccupation'], 
    "empty_value" => $options['emptyValue'], 
    ... 
)); 

現在控制器:

$form = $this->createForm('registration', $user, array(
      'requireOccupation' => false, 'emptyValue' => null 
     )); 

調用,要生成表單同時傳入要用於該表單的值。

我絕不是Symfony的專家,這個解決方案可能會對那些問題產生一些問題。但它適用於我。

0

我覺得這是更好地創造另一種形式。它可以從您已經定義表單輻照誘導改變只有你想要

class SomeFormType extends OriginalFormType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     parent::buildForm($builder, $options); 
     $builder 
      ->remove('someField') 
      ->add('someField', 'choice', [ 
       "expanded" => true, 
       "choices" => $yourArray 
      ]); 
    } 

它具有優勢的領域得到不同的對象映射

+0

這是一個解決方案,但正如我所說的,我認爲不值得用服務創建一個全新的表單,而只是編輯控制器中的字段。你知道我可以通過'FormType'把'choices'數組傳遞給我的控制器嗎?這將基本上解決我的難題 – Ale

+0

把東西放在你的控制器永遠不值得:/你仍然可以使用我的例子與刪除和添加 – goto

相關問題