Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Twig Symfony细枝块生成优先级_Twig_Symfony_Symfony Forms - Fatal编程技术网

Twig Symfony细枝块生成优先级

Twig Symfony细枝块生成优先级,twig,symfony,symfony-forms,Twig,Symfony,Symfony Forms,我在twig中有点小问题,无法渲染symfony表单, 因此,首先我将解释它的上下文 在Twig中,块在模板上按特定顺序定义: {# base.layout.html.twig #} {% block firstBlock %} {% endblock firstBlock %} {% block secondBlock %} {% endblock secondBlock %} 当我们扩展此模板时,我们可以编写以下内容: {# child.layout.html.twig #} {% e

我在twig中有点小问题,无法渲染symfony表单, 因此,首先我将解释它的上下文

在Twig中,块在模板上按特定顺序定义:

{# base.layout.html.twig #}

{% block firstBlock %}
{% endblock firstBlock %}

{% block secondBlock %}
{% endblock secondBlock %}
当我们扩展此模板时,我们可以编写以下内容:

{# child.layout.html.twig #}
{% embed "base.layout.html.twig" %}

{% block secondBlock %}
   {{ form_widget(form.submit_button) }}
{% endblock secondBlock %}

{% block firstBlock %}
   {{ form_widget(form.some_field) }}
   {{ form_rest(form) }}
{% endblock firstBlock %}
因此,问题在于twig中呈现Symfony表单的form()函数

我试图在模式窗口的最末端生成一个提交按钮 但问题是form_rest()会渲染尚未渲染的表单的所有部分

有一个小补丁可以避免form\u rest来呈现form.submit\u按钮,它可以将form.submit\u按钮设置为一个已经呈现的字段,具有:

{% do form.submit_button .setRendered %}
但使用此表单时,永远不会呈现“提交”按钮

当然,所有这些的最终目的是不要删除form_rest指令

因此,我在form_rest指令之后搜索一些东西来取消form.submit_按钮的渲染值,或者更好地选择模板的块生成顺序

像这样:

{% block secondBlock with(1) %}
   {{ form_widget(form.submit_button) }}
{% endblock secondBlock %}

{% block firstBlock with(2) %}
   {{ form_widget(form.some_field) }}
   {{ form_rest(form) }}
{% endblock firstBlock %}

谢谢你的帮助

如果只是一个提交按钮,您可以将其从表单类型中删除,并用html编写,这不是问题,而且可以正常工作

问题是,首先渲染其余部分(包括按钮),然后在尝试渲染按钮但按钮已渲染后

当然,html按钮必须位于
标记内

如果要使“提交”按钮与表单类型保持一致

1解决方案是使用一些javascript移动它

2解决方案是将其标记为已呈现(正如您所做的),并在您想要的位置编写提交按钮的确切html

[编辑] 您还可以在第一个块中渲染表单的每个字段,在第二个块中渲染提交按钮,并在所有这些之后放置form_rest(由于所有字段都已渲染,因此它将没有要渲染的内容,
这也是一个解决方案)

如果这仅仅是一个没有逻辑和映射的提交按钮的问题,最简单的方法是直接用HTML呈现提交按钮并将其从表单中删除

<input type="submit" value="Submit"> {# ¯\_(ツ)_/¯ #}
你的_page.html.twig

但在我看来,第二种解决方案,即使看起来更干净,也不值得一个愚蠢的提交按钮


干杯

如果您将
{{form_rest(form)}}
添加到
第二块
?@sakhunzai如果我这样做,我会破坏我的视图,问题是在模板中的给定位置渲染所有表单字段,然后在同一模板的较低位置渲染提交按钮。因此,一个主体
(在本例中,它是
第一块
)和一个
页脚
块(
第二块
),然后检查Alain Tiemblo在下面提出的建议,我假设没有通用解决方案。。。最好的方法是删除
form\u rest()
指令,让
form\u end()
调用
form\u rest()
。但是我必须确保在
form_end()
指令之前没有未渲染的可见输入。是的,但是可以使用div和样式显示隐藏其余的输入:none;还可以看看@Alain Tiemblo的答案
<div class="modal">
  <div class="form">
     {% block form_part %}{% endblock %}
  </div>
  <div class="submit pull-right">
     {% block submit_part %}{% endblock %}
  </div>
</div>
{% embed 'modal_layout.html.twig' %}
    {% block submit_part %}
        {{ form_row(form.submit_button) }}
    {% endblock %}
    {% block form_part %}
        {{ form(form) }} {# won't render submit again #}
    {% endblock %}
{% endembed %}