簡體   English   中英

在Twig中有條件地擴展模板

[英]Extend template conditionally in Twig

采用以下樹結構:

├───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周圍散布着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。

經過幾次嘗試后,我終於找到了辦法。

這看起來很難看......

假設結構:

├───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 任何塊,並且只有文件存在時才包含/擴展。

有一個保證文件(在這種情況下, base/pages/file_content.twig 必須始終存在)仍將顯示“默認”內容,並不會引發令人討厭的異常。


在這個答案的范圍之外,我最初發現了一個非常相似的方法,它使用了條件值。

試一試: https//twigfiddle.com/u06tur

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM