我一直试图用一个输入创建一个极其基本的symfony表单(用于搜索功能)。提交时使用GET方法。它似乎按预期工作,但是它会生成一个非常丑陋且不必要的长URL。我已经尝试“清理” URL已有一段时间了,我想知道是否有人遇到相同的问题并且知道如何解决?
形式
$form = $this->createFormBuilder($search)
->setMethod('GET')
->add('q', 'text')
->add('search', 'submit')
->getForm();
在提交表单时,将生成以下URL:
search?form[q]=red+apple&form[search]=&form[_token]=bb342d7ef928e984713d8cf3eda9a63440f973f2
所需的URL:
search?q=red+apple
提前致谢!
最佳答案
要创建所需的URL,您将必须使用createNamedBuilder
设置表单名称,只需将其保留为空白''
即可。
要删除_token
,您需要将csrf_protection
设置为false。请调查csrf保护,以确保您知道关闭该功能后会发生什么情况。
将您的代码更改为以下代码应会为您提供所需的结果。
$form = $this->get('form.factory')->createNamedBuilder('', 'form', $search, array(
'csrf_protection' => false,
))->setMethod('GET')
->add('q', 'text')
->add('search', 'submit')
->getForm();
这将产生一个类似以下的URL:
search?q=red+apple&search=
编辑:
如果要摆脱
&search=
,一种方法是将search
从submit
更改为button
。->add('search', 'button')
这将需要javascript来提交您的表单。
这是jquery中的简单示例:
//This assumes one form and one button
$(document).ready(function(){
$('button').click(function(){
$('form').submit();
});
});
这将产生如下URL:
search?q=red+apple
要访问GET var,您可以在 Controller 中输入以下内容:
public function yourSearchAction(Request $request)
{
// your code ...
$form->handleRequest($request);
if ($form->isValid()) {
$getVars = $form->getData();
$q = $getVars['q'];
$page = $getVars['page'];
$billing = $em
//Do something
}
return //your code
}
只是为了弄清楚是否要将
page
添加到URL中,您需要将其添加到表单中:->add('page', 'text')
关于forms - Symfony 2基本GET表单生成的URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308945/