0

我创建了一个带有 Select 字段的表单,我需要在不同的操作中处理响应。动作“showInfo”显示游戏的信息并绘制一个表格,其中包含用户可加入游戏的角色列表。表单由“joinGame”操作处理,该操作在 url 中接收游戏的 slug,并通过表单接收角色的 id。我如何处理其他操作中的选定选项?

显示信息动作

/*...*/

$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
    );

加入游戏动作

/*...*/

$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>
4

2 回答 2

3

根据前面的答案,我简单地解决了。我使用它的 id获取表单数据:

$form = $request->get('myproject_mybundle_myformtype', null, true);

另一方面,如果您想要整个表单,请使用:

$form = $this->createForm(new MyFormType());

并使用这 3 种方法中的一种,具体取决于您的 Symfony 版本:

$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();

希望能帮助到你!

于 2016-01-13T17:36:02.223 回答
0

编辑

我懂了。这是因为表单渲染的工作方式,特别是字段的命名方式。

当表单对象没有特定的类型时,Symfony 将form用作数据的基本名称。这意味着您的选择列表是这样呈现的

<select name="form[charact_join]" multiple="multiple">
  <!-- choices --->
</select>

因此,为了正确检索它,您必须这样解决它

$postData = $req->request->get('form[charact_join]');

但这还不够!如果我们查看这个 get 方法的 API 文档,我们可以看到它还有几个参数:$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>
于 2013-10-28T20:50:57.247 回答