好吧,我用Google搜索了这一点,但我发现的所有内容都是在常规Symfony表单处理(例如form_widget(),创建FormType类等)的上下文中讨论Symfony表单.我的Symfony项目中有很多这样的表单,它们运行得很好.
但:
我还有一些非常复杂的AJAX表单,我想手动构建(使用普通的旧HTML和JS).我仍然希望利用Symfony的表单验证功能和CSRF保护.但是,出于某种原因,当使用isValid()手动创建表单时,我无法使CSRF正常工作.
这是我想要完成的一个例子:
在我的视图控制器中,我设置了_token:
$_token = $this->get('form.csrf_provider')->generateCsrfToken('form');
Run Code Online (Sandbox Code Playgroud)
在我看来(手动创建的表单)(从我的视图控制器获取_token):
<html>
<form method="post">
<input type="hidden" name="form[_token]" value="{{ _token }}">
<input type="hidden" name="form[id]" value="1">
<input type="submit" value="Submit">
</form>
</html>
Run Code Online (Sandbox Code Playgroud)
在我的动作控制器中(当表单提交时,我正在尝试执行以下操作):
//Create form (for validation purposes)
$form = $this->get('form.factory')
->createBuilder('form', array('id' => $request->get('id')))
->add('id', 'hidden')
->getForm();
//Bind form
$form->bind($request)
//Validate form
if($form->isValid()) {
//... save data
}
//Return response...
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我不能让isValid()工作,我怀疑我的_token是没有正确使用的东西,但我不明白为什么.有没有人真正使手动表单与Symfony组件一起工作?有没有人对如何使这项工作有任何建议?
基本上,我想要完成的是:
手动创建HTML表单(具有CSFR保护且没有 TWIG表单小部件功能)
使用Symfony的表单功能来验证该表单
谢谢.
我有一个来自数据库的条目列表.我想在每一行的末尾都有一个"删除按钮",这样用户就不必首先进入编辑/显示页面来删除该条目.
我尝试使用csrf标记创建一个隐藏的输入字段,如下所示:
return $this->createFormBuilder()
->getForm()
;
Run Code Online (Sandbox Code Playgroud)
这将输出:
<div id="form">
<input type="hidden" id="form__token" name="form[_token]" value="6c98ebfa9df07.....">
</div>
Run Code Online (Sandbox Code Playgroud)
表单的其余部分放在twig模板中,以便每个表单根据条目的id有自己的操作路径.
不幸的是在树枝模板中只有第一个
{{ form_widget(delete_form) }}
Run Code Online (Sandbox Code Playgroud)
将被渲染.
我怎样才能更频繁地使用这个隐藏的字段?或者有没有办法以不同的方式完成这一切?
谢谢你的帮助
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$deleteForm = $this->createDeleteForms();
$entities = $em->getRepository('IntranetServicesBundle:Laender')->findAll();
return $this->render('IntranetServicesBundle:Laender:index.html.twig', array(
'entities' => $entities,
'delete_form' => $deleteForm->createView(),
));
}
private function createDeleteForms()
{
return $this->createFormBuilder()
->add('id', 'hidden')
->getForm()
;
}
Run Code Online (Sandbox Code Playgroud)