[英]Symfony2 Form is always empty after submitting
我是 Symfony2 (2.4.4) 的新手。
我想创建一个 HTML 布局,它总是在顶部(搜索栏)显示一个表单。 我通过 post 发送表单并希望重定向到另一个控制器,该控制器应该传递用户输入并生成输出。 我创建了一个这样的新函数:
public function searchFormAction(Request $request)
{
//$defaultData = array('sstring' => 'Suche');
$form = $this->createFormBuilder()
->add('fnr', 'hidden')
->add('sstring', 'search', array('label' => false))
->add('submit', 'submit', array('label' => 'suchen'))
->getForm();
$form->handleRequest($request);
if($request->isMethod('POST'))
{
return $this->redirect('SchmanEmployeeBundle:Employee:search', array(
'sstring' => $form->get('sstring')->getData();
));
}
return $this->render('SchmanEmployeeBundle:Employee:searchForm.html.twig', array(
'form' => $form->createView()
));
}
我扩展了我的基本布局 (base.html.twig) 并包含具有渲染功能的表单
{% render(controller('SchmanEmployeeBundle:Employee:searchForm')) %}
这很好用,表单总是出现在我的布局中。 给定的 HTML 如下所示:
<form name="form" method="post" action="/app_dev.php/">
<div><input type="search" id="form_sstring" name="form[sstring]" required="required"></div>
<div><button type="submit" id="form_submit" name="form[submit]">suchen</button></div>
现在我有3个问题:
如果我提交表单,我不想被重定向到 searchAction 控制器。 这是因为 $request->isMethod 总是 GET。 为什么? 表单操作是发布?
在 Symfony Webtool 中,表单部分也是空的。 我看到所有表单字段(sstring)并且数据始终为空。 用户输入在哪里?
有一个很棒的代码可以让你的搜索功能,它应该可以工作(对不起,如果你不使用注释)。 一个好处,您现在可以在项目中的任何地方使用您的 searchType,您应该像这样制作表单而不是 formbuilder 到您的控制器中。 更易于阅读和使用。
控制器:
/**
* To search something
*
* @Route("/search", name="search")
* @Template()
*/
public function searchAction()
{
$form = $this->createForm(new searchType());
$request = $this->get('request');
if ($request->getMethod() == 'POST')
{
$form->bind($request);
if ($form->isValid())
{
$informations = $form->get('search')->getData();
//make things here
}
}
}
这是 searchType 类:
class searchType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('fnr', 'hidden')
->add('sstring', 'search', array('label' => false))
->add('submit', 'submit', array('label' => 'suchen'));
}
/**
* @return string
*/
public function getName()
{
return 'yournamespace_searchType';
}
}
首先,您的表单默认设置为 POST,所以您应该很好。 其次,您没有传递任何要由您的表单填写的数据,我认为您应该这样做。 第三,您不检查表单是否有效,其中包括测试是否已提交。 你应该做这个:
$defaultData = array(); // No need for a class object, array is enough
$form = $this->createFormBuilder($defaultData)
->add('fnr', 'hidden')
->add('sstring', 'search', array('label' => false))
->add('submit', 'submit', array('label' => 'suchen'))
->getForm();
$form->handleRequest($request);
if($form->isValid())
{
// Happens if the form is submitted
return $this->redirect('SchmanEmployeeBundle:Employee:search', array(
'sstring' => $form->get('sstring')->getData(); // TODO: This will probably produce an error, fix it
));
}
return $this->render('SchmanEmployeeBundle:Employee:searchForm.html.twig', array(
'form' => $form->createView()
));
另外,我认为您不应该担心 form 方法,因为您没有其他方法的不同实现。 这是在 Symfony 中处理表单的常用方式。 在继续之前,您应该详细阅读表格,这篇文章内容丰富。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.