在Symfony中自定义表单主题和引用块之间的区别?

时间:2016-01-02 22:47:25

标签: php symfony

引用窗口小部件块和自定义它之间有什么区别:文档说:

  

到目前为止,要覆盖特定的表单块,最好的方法是   从form_div_layout.html.twig复制默认块,将其粘贴到   不同的模板,然后自定义它。在许多情况下,你可以   避免在自定义时引用基块来执行此操作

但对我而言看起来是一样的:

{# app/Resources/views/Form/fields.html.twig #}
{% extends 'form_div_layout.html.twig' %}

{% block integer_widget %}
    <div class="integer_widget">
        {{ parent() }}
    </div>
{% endblock %}




{# app/Resources/views/form/fields.html.twig #}
{% block integer_widget %}
    <div class="integer_widget">
        {% set type = type|default('number') %}
        {{ block('form_widget_simple') }}
    </div>
{% endblock %}

有什么区别?

1 个答案:

答案 0 :(得分:1)

您引用的first example in the documentation显示了如何覆盖显示表单元素的整个窗口小部件。

您正在引用的second example in the documentation显示了如何使用代码重用,这样您就不会重写您未修改的表单模板部分。所以,而不是必须声明

    {% set type = type|default('number') %}
    {{ block('form_widget_simple') }}

在你的重写小部件中,你可以改为引用已经拥有它的基本块。如果您是referencing base blocks from an external template,则可以通过{{ parent() }}调用父块,如果是referencing blocks from inside the same template as the form,则可以通过{{ block('base_integer_widget') }}

调用基本块

如果从PHP / Symfony的角度来看,继承可以帮助解释它。假设您有一个扩展另一个的PHP类,并且您想要覆盖名为doSomething()的函数 - 您可以根据需要重写整个函数。但是,假设doSomething()有一块您常常想要运行的公共代码,那么您可以执行操作并在其末尾调用parent::doSomething()。或者,如果您正在访问其他Symfony服务,则可以改为呼叫$this->get('some.service')->doSomething()

这里的概念是相同的,你可以覆盖整个小部件,也可以覆盖它的一部分 - 也许放置一个周围的<div></div>但是从内部调用{{ parent() }},因为你没有改变其他内容关于小部件。

我确实有一个例子,我在Symfony中覆盖标准按钮行为并使用这两种情况。我在`app / Resources / views / Form / navigationButton.html.twig'中有一个单独的模板文件,代码如下:

{% use 'form_div_layout.html.twig' %}

{% block button_widget -%}
    {% set attr = attr|merge({class: (attr.class|default(''))|trim}) %}
    {{- parent() -}}
{%- endblock %}

{% block button_row -%}
    {{- form_widget(form) -}}
{%- endblock button_row %}

我通过允许将其他类作为属性传递然后调用父窗口小部件来正常生成它来覆盖按钮窗口小部件。然后,我覆盖按钮行小部件,不会放置周围的<div></div>标记,因为我不想在我的模板中使用它(请参阅原件herehere)。

然后在我的一个模板中使用,我只是这样做:

{% form_theme form ':Form:navigationButton.html.twig' %}