FormTypeクラスの醜いカスタマイズが必要なケースはほとんどありません。Symfony2 - FormTypeクラスをカスタマイズする
最初に、state
がuser
の場合にアクティブであることを確認する必要があることは、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
私の質問は次のようになります。
- 例これらの種類を扱うことになる何の勧告?
- 私は正しく、受け入れられましたか?
- これらのケースを扱うドキュメントや例はありますか?
$ builder-> getData()については確かですか?限り、ビルドプロセス中にフォームデータを取得する唯一の方法は、リスナーを作成することを含むフォームイベントを使用することです。 – Cerad
**フォーム**ではなく**ビルダー**で呼び出されていることに注意してください。これは、あなたが心に持っているのと同じ 'getData'ではありません。これは、第2パラメータとして 'createForm'メソッドに渡すか、options配列(3番目のパラメータ)に' data'アイテムを介して渡す初期データです。 –
それは甘く見えます。だからあなたの答えは、内部のフォームロジックをカスタマイズすることができるということですか?そしてあなたが提案したこのバージョンはお勧めですか?答えを明確にしてください。私は正しいものとして割り当てます:) –