Сценарий: у меня есть форма с двумя выборами. Когда пользователь выбирает что-то из первого выбора, второй выбор заполняется новыми значениями. Эта часть отлично работает.
Но форма не проверяется, так как она содержит некоторые варианты, которые не допускаются в исходной форме.
форма:
<?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
при установке значения и просто принимает значение по умолчанию. Есть ли лучшее решение для этого? Спасибо заранее!