我创建了一个带有Select字段的表单,我需要以不同的操作处理响应。 动作“showInfo”显示游戏的信息,并绘制一个表单,其中包含用户加入游戏的可用角色列表。表单由动作“joinGame”处理,该动作在URL中记录游戏的slug,并通过表单记录角色的id。 我如何处理其他操作中的选定选项?
showInfoAction
/*...*/
$free_charact = $em->getRepository('PlayerBundle:Character')->findBy(
array(
'user' => $user,
'game' => null),
array()
);
/*...*/
if ($free_charact) {
$form = $this->createFormBuilder($free_charact)
->add('charact_join', 'choice', array(
'choices' => $array_select,
'multiple' => false,
))
->getForm();
$array_render['form'] = $form->createView();
return $this->render(
'GameBundle:Default:game_info.html.twig',
$array_render
);
joinGameAction
/*...*/
$req = $this->getRequest();
if ($req->getMethod() == 'POST') {
$postData = $req->request->get('form_charact_join');
$id_charac = $postData[0];
$charac_change = $em->getRepository('PlayerBundle:Character')->findOneById($id_charac);
//Check if the character is property of the user
$charac_change->setGame($game);
$em->persist($charac_change);
$em->flush();
$this->get('session')->getFlashBag()->add('info', 'You are a player of this game now!');
}
return new RedirectResponse($this->generateUrl('info_game', array('slug' => $slug)));
game_info.html.twig
<form action="{{ path('join_game', {'slug': game.slug}) }}" method="post" {{ form_enctype(form) }}>
{{ form_errors(form) }}
{{ form_widget(form.charact_join) }}
<input type="submit" value="Join" />
</form>
答案 0 :(得分:2)
根据之前的回答,我简单地解决了这个问题。 我使用其ID:
获得表单数据$form = $request->get('myproject_mybundle_myformtype', null, true);
另一方面,如果您想要整个表单,请使用:
$form = $this->createForm(new MyFormType());
根据您的Symfony版本使用这3种方法中的一种:
$form->bind($request); //deprecated in Symfony 2.3
$form->submit($request); //deprecated in Symfony 3.0
$form->handleRequest($request); //not deprecated yet
使用表单,您可以使用以下方法:
$form->isSubmitted();
$form->isValid();
希望它有所帮助!
答案 1 :(得分:0)
哦,我明白了。这是因为表单呈现的工作方式,特别是字段的命名方式。
当表单对象没有特定类型时,Symfony将使用form
作为数据的基本名称。这意味着您的选择列表就像这样呈现
<select name="form[charact_join]" multiple="multiple">
<!-- choices --->
</select>
因此,为了正确地检索它,你必须这样解决它
$postData = $req->request->get('form[charact_join]');
但这还不够!如果我们查看API docs for this get method,我们可以看到它有更多参数:$default
和$deep
- 这是我们关注的第三个参数。您希望getter解析我们提供的深度路径引用
$postData = $req->request->get('form[charact_join]', null, true);
当然,当您创建自己的表单类型并从请求中将数据绑定到它们时,这一切都不会那么麻烦。
这应该不是问题。您没有发布模板/视图,但这就是处理它的地方。
<强> GameBundle:默认:game_info.html.twig 强>
<form action="{{ path('route_name_for_join_game_action') }}" method="post">
{{ form_errors(form) }}
{{ form_rest(form) }}
<input type="submit" value="Join Game" />
</form>