シナリオ:2つの選択肢があるフォームがあります。ユーザーが最初の選択から何かを選択すると、2番目の選択に新しい値が設定されます。この部分はうまく動作します。Symfony2:ajaxと検証で選択肢を変更してください。
しかし、初期フォームでは許可されていない選択肢が含まれているため、フォームは検証されません。
フォーム:
<?php
class MyType extends AbstractType
{
private $category;
public function __construct($category = null)
{
$this->category = $category;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('category', 'choice', array(
'choices' => array(
'foo' => 'foo',
'bar' => 'bar'
)
);
$builder->add('template', 'choice', array(
'choices' => $this->loadChoices()
);
}
private function loadChoices()
{
// load them from DB depending on the $this->category
}
}
当初カテゴリがfoo
です。したがって、fooのテンプレートはロードされ、選択肢として設定されます。しかし、ユーザがbar
を選択すると、バーテンプレートがロードされます。しかしフォームにはまだfooの選択肢があり、検証はしません。
これを解決する最良の方法は何ですか?
私が見つけた一つの方法は、単にコントローラでフォームを再開しました:
<?php
$form = $this->createForm(new MyType());
if ($request->getMethod() === 'POST') {
if ($request->request->has($form->getName())
&& isset($request->request->get($form->getName())['category'])) {
$form = $this->createForm(new MyType($request->request->get($form->getName())['category']));
}
// ...
}
これは動作しますが、それは値を設定するときIllegalArgumentException
をスローし、単にデフォルトを想定しているので、私はそれをテストすることはできません。これにはもっと良い解決策がありますか?前もって感謝します!
である、uはこれを管理するためにイベントを使用する必要がありますと思いますか?次に、あなたに関連するグループでのみバリデータサービスを呼び出すことができます。 http://symfony.com/doc/2.0/book/forms.html#validation-groups – Xocoatzin