Symfony2.6:表单用数组数据而不是实体处理请求
Symfony2.6: Form handle a request with array data instead entity
我有一个 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));
}
注意:类型中没有setDefaultOptions。
然后我创建表单:
//Controller.php
$form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);
我的问题: 但是当我对使用 POST [=32= 发送的数据进行 handleRequest() 时]getData() 不会 return 表格的改变,只有在 $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 returned(在 $form->handleRequest() 和 $form->getData() 之后):
array(
'group1' => array(
'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
)
);
非常感谢。
如果我没记错的话,你需要封装传递给array
的表单名称作为key。
例如,如果您的 FormType 中有这样的内容 class:
public function getName(){
return 'some_form_name'
}
那么你应该通过:
$data = array(
'some_form_name' => $request->request->all() // Encapsulte `POST` data
);
$form->submit($data);
或者您可以在发送数据时封装数据。然后你就可以照章办事了:
$form->handleRequest($request);
希望这对您有所帮助...
我通过以下更改解决了问题:
删除第二个 $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)))
在FormType中我把'mapped' => false
改成了'mapped' => true
感谢@Jovan Perovic
我有一个 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));
}
注意:类型中没有setDefaultOptions。
然后我创建表单:
//Controller.php
$form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);
我的问题: 但是当我对使用 POST [=32= 发送的数据进行 handleRequest() 时]getData() 不会 return 表格的改变,只有在 $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 returned(在 $form->handleRequest() 和 $form->getData() 之后):
array(
'group1' => array(
'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
)
);
非常感谢。
如果我没记错的话,你需要封装传递给array
的表单名称作为key。
例如,如果您的 FormType 中有这样的内容 class:
public function getName(){
return 'some_form_name'
}
那么你应该通过:
$data = array(
'some_form_name' => $request->request->all() // Encapsulte `POST` data
);
$form->submit($data);
或者您可以在发送数据时封装数据。然后你就可以照章办事了:
$form->handleRequest($request);
希望这对您有所帮助...
我通过以下更改解决了问题:
删除第二个 $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)))
在FormType中我把
'mapped' => false
改成了'mapped' => true
感谢@Jovan Perovic