我有一个 FormType,它基于在创建该 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));
}
注意:类型中没有设置默认选项。
然后我创建表单:
//Controller.php
$form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);
我的问题:但是当我对使用 POST getData() 发送的数据进行句柄请求() 时,不会返回表单的更改,只返回在 $choicesData 处设置的更改。谁能帮我解决这个问题?
//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)
)
);
多谢。
我用下面的更改解决了:
-
删除第二个$choicesData到 $this->createForm()
$form = $this->createForm(new PermissaoType($choices, $choicesData));
-
'data' => $this->choicesData[$bundle][$name]
到'data' => array_keys(array_intersect($this->choicesData[$bundle][$name], array(true)))
-
在窗体类型中,我
'mapped' => false
更改为'mapped' => true
感谢@Jovan佩罗维奇
没记错的话,你需要用表单的名称作为键封装传递的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);
希望这有帮助...