在symfony 2中,可以在模板中嵌入控制器。例如,我可能有博客帖子的模板,但我也可以在模板的侧栏中将控制器嵌入到民意调查或顶级文章列表中。
我有兴趣嵌入一个提供民意调查的控制器。为此,我创建了一个控制器:
public function poll(Request $request)
{
$task = new Poll();
$form = $this->createFormBuilder($task)
->add('radio', 'one')
->add('radio', 'two')
->add('radio', 'three')
->getForm();
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
//save and show how many people voted for each option
}
}
return $this->render('PollBundle:Default:new.html.twig', array(
'form' => $form->createView(),
));
}
然后我可以将其作为侧栏项嵌入我的模板中:
<div id="sidebar">
{% render "PollBundle:Poll:poll" %}
</div>
现在的问题是:
如果我将表单操作设置为""
,那么如果提交了轮询,则请求将通过嵌入轮询控制器的主控制器。然后,我可以使用隐藏字段来检查轮询是否使用轮询表单提交,然后更新数据库并呈现结果。然后返回到主控制器的模板,一切都很好。
我现在想使用一些AJAX来简化那些启用了javascript的用户的表单提交。我该怎么做呢?由于表单操作设置为""
,请求将通过主控制器,呈现模板,然后调用轮询控制器。但我想返回一个包含每个项目的投票的AJAX响应。在任何情况下,只需要通过主控制器来使用AJAX请求来填充轮询也是非常浪费的。
我该怎么做呢?
答案 0 :(得分:1)
您可以将表单指向自己处理帖子的操作,如果是通过ajax请求,则返回结果,如果通过正常请求到达,则重定向到HTTP_REFERER
({{1 }})。
如果您不想依赖引用,您还可以在呈现轮询时将当前URI存储在会话变量中(在上面描述的pollAction中)。