繁体   English   中英

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

[英]Difference between customizing form theme and referencing block in 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 %}

有什么区别?

您要参考的文档中的第一个示例显示了如何覆盖显示表单元素的整个小部件。

您正在参考的文档中的第二个示例显示了如何使用代码重用,以便不重写未修改的表单模板部分。 因此,不必声明

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

在您的覆盖小部件中,您可以再次引用已经具有此功能的基本块。 如果要从外部模板引用基本块 ,则可以通过{{ parent() }}调用父块,如果要从与表单相同的模板内部引用块 ,则可以通过{{ 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>标记中,因为我不想在模板中放置它(请参见此处此处的原始内容)。

然后,要在我的模板之一中使用,只需执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM