我有一组POSProduct实体,我想为每个实体显示一个表单,以便用户可以从列表中编辑和保存他们想要的一个。以前我遍历数组并为每个数组构建一个POSProductType表单,并将表单数组发送到 twig 模板。
很多人告诉我,我应该使用 Collection 而不是这种技术。我找不到任何真正涵盖此用例的示例,但建议我直接从我的控制器构建表单并使用内置的 CollectionType 表单,如下所示:
$arrayProducts = return_array_of_product_entities();
$form = $this->createForm('collection', $arrayProducts, array( 'type' => 'pos_product',
'csrf_protection' => true,
'intention' => 'vendor_add',
'allow_add' => true,
));
return $this->render('MyBundle:Default:myform.html.twig', array(
'form' => $form->createView(),
));
*type => pos_product* 是我在自己的类中定义的 POSProductType 形式。
表单呈现正常,但是当我提交并验证时出现两个错误:
CSRF 令牌无效。请尝试重新提交表格/此表格不应包含额外字段
当我查看表单的来源时,CSRF 令牌就出现了。我已经尝试了 createForm() 中csrf_protection和intent以及allow_add选项的所有组合,结果始终相同。
我也尝试过制作自己的 ProductCollectionType 表单类,这样我就不必使用默认的 CollectionType,但我真的不明白我需要的语法。我正在尝试类似的事情:
$builder->add('pos_product', 'collection', array(
'type' => new POSProduct()));
(对于第一个和第三个参数我能想到的每种组合),它只会产生一个带有“posproduct”标签的表单
我的解决方案偏好是如何创建我自己的 ProductCollectionType 类,该类将呈现 POSProduct() 实体数组,每个实体都由“pos_product”类型的形式表示
我的备份解决方案是继续使用我目前拥有的相同 CollectionType 表单,但想办法让它验证。