我试图使用不同的属性多次调用表单中的表单小部件。我收到错误 -Field "x" has already been rendered, save the result of previous render call to a variable and output that instead.
我已经修复了所有可以修复的地方,但有些字段需要不同的属性。例如 :-
form_widget(foo.bar, {'value' : 'image'}) }}
Run Code Online (Sandbox Code Playgroud)
和
form_widget(foo.bar, { 'attr': { 'class': 'hidden' }} )
Run Code Online (Sandbox Code Playgroud)
是否可以在同一表单上调用具有不同参数的表单小部件?
dbr*_*ann 11
多次重复使用同一个小部件,就像你所做的那样,可能会产生奇怪的副作用,因为 Symfony 还会设置一个 html id,并且根据你放置字段的位置,你可能会得到无效的 html,例如,这可能会导致你的 JavaScript 中断/执行奇怪的事情或使提交表格变得不稳定。
\n确保拥有有效 HTML(例如,没有重复的 id)的最安全方法是手动渲染每个元素,然后仅使用表单元素来获取当前内容/错误。为此,您可以忽略form_widget和form_row帮助程序,只需自己编写字段的 HTML,然后仅插入您需要的部分,例如
<input name="{{ field_name(foo.bar) }}" type="file">\nRun Code Online (Sandbox Code Playgroud)\n这个确切的示例需要 Symfony 5.2,因为它field_name()是新的。请参阅https://symfony.com/blog/new-in-symfony-5-2-form-field-helpers
缺点是,诸如此类的东西{{ form_rest(form) }}可能不再起作用,但至少您仍然可以使用任何仅输出非表单元素的表单部分的帮助器,例如form_error,form_label应该仍然有效,form_widget但是form_row您应该避免。form_end再次渲染所有剩余字段,这就是为什么您也应该避免这种情况。Symfony 5.2 中引入的更具体的帮助器对于这种方法也非常方便。这样您就可以完全控制字段的呈现方式,并且可以更改在多个位置使用的每个字段的类。
如果您使用旧版本的 Symfony,您可以通过查看提供它们的 TwigExtension并针对您的应用程序进行调整来自行实现辅助方法,例如,提供您自己的具有类似功能的 AppTwigExtension。
\n如果您想继续使用form_widget/form_row那么您应该避免在同一请求中多次渲染相同的表单(元素)。您可以尝试使用 sub-requres/ESI 之类的东西,但这可能会很麻烦。
有多种方法可以多次渲染表单,让您每次都以不同的方式渲染它。例如,您可以创建一个 FormCollection,并添加两次相同的类型。然后您就有一个包含 2 个表单的表单(您的表单两次)。您还可以为同一表单创建多个实例,然后根据您使用的实例(foo 或 bar)在模板中以不同的方式呈现它们,例如类似的东西(只有粗略的轮廓,不确定这是否完全有效):
\npublic function contact(Request $request): Response\n{\n $form1 = $this->createForm(FooFormType::class, null, [\'attr\' => [\'id\' => \'form1\']]);\n $form1->handleRequest($request);\n if ($form1->isSubmitted() && $form1->isValid() {\n // ...\n \xc2\xa0 }\n\n $form2 = $this->createForm(FooFormType::class, null, [\'attr\' => [\'id\' => \'form1\']]);\n $form2->handleRequest($request);\n if ($form2->isSubmitted() && $form2->isValid() {\n // ...\n \xc2\xa0 }\n // Do something\n\n return $this->render(\'....html.twig\', [\n \'foo\' => $form1->createView(),\n \'bar\' => $form2->createView(),\n ]);\n}\nRun Code Online (Sandbox Code Playgroud)\n正如您所看到的,这有点多余,因此通常您希望避免这种方法,但您应该在网上找到一些人们做类似事情的示例。
\n| 归档时间: |
|
| 查看次数: |
5888 次 |
| 最近记录: |