Symfony2:在创建表单的其他操作中处理表单

时间:2013-10-28 20:10:47

标签: forms symfony

我创建了一个带有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>

2 个答案:

答案 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);

当然,当您创建自己的表单类型并从请求中将数据绑定到它们时,这一切都不会那么麻烦。

/ EDIT

这应该不是问题。您没有发布模板/视图,但这就是处理它的地方。

<强> 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>