[英]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 €</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 €</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.