2016-06-16 9 views
2

FormTypeクラスの醜いカスタマイズが必要なケースはほとんどありません。Symfony2 - FormTypeクラスをカスタマイズする

最初に、stateuserの場合にアクティブであることを確認する必要があることは、usernameを編集する可能性を無効にすることです。しかし、disabledアトリビュートを追加するだけでは、入力をサブミットしないように保護することはできません。だから私はユーザー名入力フィールドを表示しないことにしました。私はブール値のオプションを渡すことでそれを達成しました。

コントローラ:のUserTypeクラスで

$userForm = $this->createForm(UserType::class, $user, array(
    'is_active' => ($user->getState() == 'active') 
)); 

そして:

if ($options['is_active']) { 
    $builder 
     ->add('username', EmailType::class); 
} 

$builder 
    ->add('firstName', TextType::class), 
... 

第二のケースでは、私はNotBlank()制約を削除して、プロフィールの写真がアップロードされたときにFileTypeフィールドから'required' => false属性を追加する必要があるということです。私は同様の方法でブール値のオプションを渡すことでそれを実現しました。

コントローラー:

$userForm = $this->createForm(UserType::class, $user, array(
    'is_uploaded' => !empty($photo) 
)); 

のUserTypeクラス:

// achieved same way as previous problem 

私の質問は次のようになります。

  • 例これらの種類を扱うことになる何の勧告?
  • 私は正しく、受け入れられましたか?
  • これらのケースを扱うドキュメントや例はありますか?

答えて

2

このフォーム構成のすべてのロジックをフォームクラスに移動できます。あなたがフォームに$userエンティティを渡すので

:次に

$user = $builder->getData(); 

フォーム内のすべてのcondifionsを確認することができますし、何があります:

$userForm = $this->createForm(UserType::class, $user, array(// <- $user is passed 
    'is_uploaded' => !empty($photo) 
)); 

あなたはとbuilForm方法でアクセスすることはできませんコントローラーで混乱する必要があります。

+0

$ builder-> getData()については確かですか?限り、ビルドプロセス中にフォームデータを取得する唯一の方法は、リスナーを作成することを含むフォームイベントを使用することです。 – Cerad

+0

**フォーム**ではなく**ビルダー**で呼び出されていることに注意してください。これは、あなたが心に持っているのと同じ 'getData'ではありません。これは、第2パラメータとして 'createForm'メソッドに渡すか、options配列(3番目のパラメータ)に' data'アイテムを介して渡す初期データです。 –

+0

それは甘く見えます。だからあなたの答えは、内部のフォームロジックをカスタマイズすることができるということですか?そしてあなたが提案したこのバージョンはお勧めですか?答えを明確にしてください。私は正しいものとして割り当てます:) –