2017-01-17 2 views
0

私のコントローラーで自分のフォームのフィールドを「編集」するソリューションを策定するのに問題があります。コントローラのフォームのフィールドを編集するにはどうすればよいですか?

は私が私のコントローラ内の関数で呼び出すサービスとして登録Symfony2のフォームを持っている:

は、ここで私が持っているものです。私はこの他のフォームのために必要ではないフィールドの束を削除しています。私はユーザに指示してからいくつかのものを追加しています。 (私は別のフォームを作成して別のサービスを作成することができることを認識していますが、私の目的のためにはこれはちょっと残酷かもしれません。 )

このフォームの1つのフィールドを基本的に「編集」したいと思います。「職業」フィールド。このフィールドは、choiceフィールドであり、ラジオボタンとして機能し、選択肢の配列によって配置されます。それはrequiredであり、元の状態ではempty_valueという要件はありません。

しかし私は、falsenullempty_valuerequired値と同じ正確な値を持つように私のコントローラ機能でそれを編集したいと思います。

結果の下にコメントアウトされたコードは、「新しい」フォームの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; 

} 

オリジナルフォーム(サービスとして使われています1)

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

まず、別のオブジェクトにマッピングするために、私はこの問題を解決したかった方法を奇妙さを実現します考えてみると、私が使ってみたいフィールドと別のフォームを作成したり、フォームを変更して他の場所で使用するサービスを登録する必要があるフィールドを作成したりできました。

第2に、私の解決策は非常に簡単です。私は、フォームに設定されたデフォルト値でフォームに値を渡します。フィールドのプロパティの

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 
      ]); 
    } 

それは利点が

をしたいだけのフィールドを変更するには、すでに定義されたフォームからheritでき

+0

これは解決策ですが、私が言ったように、サービスで全く新しいフォームを作成する価値はないと思っていますが、コントローラのフィールドを編集するだけです。 'FormType'から私のコントローラに' choices'配列を渡すことができますか?それは本質的に私のジレンマを解決するだろう – Ale

+0

あなたのコントローラに物を置くことは決して価値がありません:/あなたは引き続き削除と追加で私の例を使用することができます – goto

関連する問題