У меня есть FormType, который создает группы checkboxes на основе массива, который передается при создании этого FormType:
//FormType.php
public function __construct(array $choices, array $choicesData)
{
$this->choices = $choices;
$this->choicesData = $choicesData;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
foreach ($this->choices as $bundle => $class) {
$choiceBuilder = $builder->create($bundle, 'form', array('virtual' => true));
foreach ($class as $name => $perm) {
$choiceBuilder->add(
$name, 'choice', array(
'choices' => $perm,
'multiple' => true,
'mapped' => false,
'expanded' => true,
'required' => 'false',
'label' => $name,
'data' => $this->choicesData[$bundle][$name]
)
);
}
$builder->add($choiceBuilder);
}
$builder->add('salvar', 'submit', array('label' => false));
}
Примечание. В Type нет setDefaultOptions.
Затем я создаю форму:
//Controller.php
$form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);
Моя проблема: но когда я делаю handleRequest() данных, отправленных с POST getData(), не возвращает изменение формы, а только то, что установлено в $ optionsData. Может ли кто-нибудь помочь мне в этом?
//Controller.php
if ($request->isMethod('POST')) {
$form->handleRequest($request); // Not Work
$data = $form->getData(); // Return $choicesData original
}
Пример $ choiceData оригинал:
array(
'group1' => array(
'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
)
);
Пример представленной формы:
array(
'group1' => array(
'item1' => array( 0 => 'chk1', 1 => 'chk3')
)
);
Пример $ choiceData возвращается (после $form-> handleRequest() и $form-> getData()):
array(
'group1' => array(
'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
)
);
Спасибо большое.
Я решил с изменениями ниже:
Удалить другие $ optionsData для $this-> createForm()
$form = $this->createForm(new PermissaoType($choices, $choicesData));
'data' => $this->choicesData[$bundle][$name]
to 'data' => array_keys(array_intersect($this->choicesData[$bundle][$name], array(true)))
В FormType я изменил 'mapped' => false
на 'mapped' => true
Спасибо @Jovan Perovic
Если я правильно помню, вам нужно инкапсулировать переданный array
с именем формы в качестве ключа.
Например, если у вас есть что-то подобное в вашем классе FormType:
public function getName(){
return 'some_form_name'
}
Затем вы должны пройти:
$data = array(
'some_form_name' => $request->request->all() // Encapsulte 'POST' data
);
$form->submit($data);
Или вы можете инкапсулировать данные при их отправке. Тогда вы могли бы сделать книгу:
$form->handleRequest($request);
Надеюсь это поможет...
$form = $this->createForm(new PermissaoType($choices, $choicesData), array('Permissao'=>$choicesData));
Но не работа. Обратите внимание: «Permissao» это имя FormType.