【问题标题】:Extend template conditionally in Twig在 Twig 中有条件地扩展模板
【发布时间】:2017-10-13 23:39:39
【问题描述】:

采用如下树形结构:

├───base
│   ├───0001
│   │   └───pages
│   │           file.twig
│   │           file_content.twig
│   └───ext
│       └───store
│       │   └───pages
│       │       └───all
│       │       │       file.twig
│       │       └───0001
│       │               file.twig
│       └───newsletter
│           └───pages
│               └───all
│               │       file.twig
│               └───0001
│                       file.twig
└───pages
    │   file.twig
    └───0001
            file.twig

如您所见,周围散落着大量file.twig

我想渲染文件base/0001/pages/file_content.twig的内容。
但是,我希望以下文件可以更改块内的内容:

  • ext/<...>/pages/0001/file.twig
  • ext/<...>/pages/all/file.twig
  • /pages/0001/file.twig
  • /pages/file.twig

但是,这些文件可能存在也可能不存在,可能需要也可能不需要,并且必须能够更改任何块的内容。

有什么办法可以做到吗?

到目前为止,我有以下内容:

{% embed 'base/pages/file_content.twig' %}
    {% block page_file %}
        {{ parent() }}
        {% if data.store_enabled %}
            {% include [
                    'base/ext/store/pages/0001/file.twig',
                    'base/ext/store/pages/all/file.twig'
                ] ignore missing
            %}
        {% endif %}
        {% include ['pages/0001/file.twig', 'pages/file.twig'] ignore missing %}
    {% endblock %}
{% endembed %}

这“有效”,因为它呈现页面但不允许覆盖任何块。

我怎样才能做到这一点?


作为一个例子,考虑这种文件结构(是的,文件丢失了,这是意料之中的):

    ├───base
    │   ├───0001
    │   │   └───pages
    │   │           file.twig
    │   │           file_content.twig
    │   └───ext
    │       └───store
    │       │   └───pages
    │       │       └───0001
    │       │               file.twig
    └───pages
            file.twig

文件base/0001/pages/file_content.twig有以下内容:

{% block page_file %}
    {% block title %}<h1>Nice title</h1>{% endblock %}
    {% block price %}{% endblock %}
    <div class="clearfix"></div>
{% endblock %}

文件base/ext/store/pages/0001/file.twig有以下内容:

{% block price %}<span class="price">55 &euro;</span>{% endblock %}

而文件pages/file.twig 有:

{% block title %}{{ parent() }}<hr>{% endblock %}
{% block price %}<div>{{ parent() }}</div>{% endblock %}

我期望的输出如下:

<h1>Nice title</h1><hr>
<div><span class="price">55 &euro;</span</div>
<div class="clearfix"></div>

但是使用该代码,所有其他文件的更改都将被忽略,输出仅如下:

<h1>Nice title</h1>
<div class="clearfix"></div>

注意:

请务必注意,我正在使用 Twig 1.33.2,并使用 Twig_Autoloader::register(); 方法。

我不能使用 Twig 2.x,因为它需要 PHP 7.0+ 而我只能使用 PHP 5.3.29。

【问题讨论】:

  • ignore missing 也可用于嵌入节点
  • @DarkBee 但是你只能嵌入1个文件,而use不允许任何ignore missing
  • 只包含一个嵌入是什么意思?当前设置将包括第一个找到的模板并显示它?如果您的意思是在嵌入中放置一个嵌入,那么这是可能的,请参阅here
  • @DarkBee 让我试试
  • @DarkBee 我很难弄清楚如何使用它。但是,我认为一个例子应该会有所帮助?

标签: php twig template-engine


【解决方案1】:

经过几次尝试,我终于想出了一个办法。

这看起来很丑陋......

假设结构:

├───base
│   ├───0001
│   │   └───pages
│   │           file.twig
│   │           file_content.twig
│   └───ext
│       └───store
│       │   └───pages
│       │       └───0001
│       │               file.twig
└───pages
        file.twig

主文件(base/pages/file.twig)代码如下:

{% if data.store_enabled %}
    {% include [
            'base/ext/store/pages/0001/file.twig',
            'base/ext/store/pages/all/file.twig',

            'base/pages/file_content.twig'
        ] ignore missing
    %}
{% else %}
    {% include [
            'pages/0001/file.twig',
            'pages/file.twig',

            'base/pages/file_content.twig'
        ] ignore missing
    %}
{% endif %}

这将包括base/ext/store/pages/ 中的文件(如果存在)。如果那里缺少文件,则包含文件base/pages/file_content.twig

base/ext/store/pages/ 内的所有文件顶部必须有以下代码:

{% extends [
        'pages/0001/file.twig',
        'pages/file.twig',

        'base/pages/file_content.twig'
    ]
%}

并且pages/里面的文件必须有以下内容:

{% extends 'base/pages/file_content.twig' %}

这允许您覆盖 base/pages/file_content.twig 内的 any 块,并且文件仅在存在时才被包含/扩展。

有一个保证文件(在这种情况下,base/pages/file_content.twig必须始终存在)仍将显示“默认”内容,并且不会引发令人讨厌的异常。


在这个答案的范围之外,我最初发现了一个非常相似的方法,它使用了条件值。

试穿:https://twigfiddle.com/u06tur

【讨论】:

    猜你喜欢
    • 2015-03-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2016-06-17
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多