Ism*_*uel 5 php template-engine 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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,file.twig周围散落着一大堆.
我想渲染文件的内容base/0001/pages/file_content.twig.
但是,我希望以下文件可以更改块内的内容:
ext/<...>/pages/0001/file.twigext/<...>/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 %}
Run Code Online (Sandbox Code Playgroud)
这"工作",在某种意义上它呈现页面但不允许任何块被覆盖.
我怎么能做这个工作?
作为一个例子,考虑这种文件结构(是的,文件丢失,这是预期的):
????base
? ????0001
? ? ????pages
? ? file.twig
? ? file_content.twig
? ????ext
? ????store
? ? ????pages
? ? ????0001
? ? file.twig
????pages
file.twig
Run Code Online (Sandbox Code Playgroud)
该文件base/0001/pages/file_content.twig包含以下内容:
{% block page_file %}
{% block title %}<h1>Nice title</h1>{% endblock %}
{% block price %}{% endblock %}
<div class="clearfix"></div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
该文件base/ext/store/pages/0001/file.twig包含以下内容:
{% block price %}<span class="price">55 €</span>{% endblock %}
Run Code Online (Sandbox Code Playgroud)
该文件pages/file.twig有:
{% block title %}{{ parent() }}<hr>{% endblock %}
{% block price %}<div>{{ parent() }}</div>{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我期望的输出如下:
<h1>Nice title</h1><hr>
<div><span class="price">55 €</span</div>
<div class="clearfix"></div>
Run Code Online (Sandbox Code Playgroud)
但是使用该代码,所有其他文件的更改都被忽略,输出只有以下内容:
<h1>Nice title</h1>
<div class="clearfix"></div>
Run Code Online (Sandbox Code Playgroud)
注意:
重要的是要注意我正在使用Twig 1.33.2,并使用该Twig_Autoloader::register();方法.
我不能使用Twig 2.x,因为它需要PHP 7.0+并且我仅限于PHP 5.3.29.
经过几次尝试,我终于找到了一种方法来做到这一点。
\n\n这就像看起来一样丑陋......
\n\n假设结构:
\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80base\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x800001\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pages\n\xe2\x94\x82 \xe2\x94\x82 file.twig\n\xe2\x94\x82 \xe2\x94\x82 file_content.twig\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80ext\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80store\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pages\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x800001\n\xe2\x94\x82 \xe2\x94\x82 file.twig\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pages\n file.twig\nRun Code Online (Sandbox Code Playgroud)\n\n主文件(base/pages/file.twig )有以下代码:
{% if data.store_enabled %}\n {% include [\n \'base/ext/store/pages/0001/file.twig\',\n \'base/ext/store/pages/all/file.twig\',\n\n \'base/pages/file_content.twig\'\n ] ignore missing\n %}\n{% else %}\n {% include [\n \'pages/0001/file.twig\',\n \'pages/file.twig\',\n\n \'base/pages/file_content.twig\'\n ] ignore missing\n %}\n{% endif %}\nRun Code Online (Sandbox Code Playgroud)\n\n这将包括其中的文件base/ext/store/pages/(如果存在)。如果那里缺少文件,则该文件base/pages/file_content.twig包含该文件。
里面的所有文件base/ext/store/pages/必须在顶部有以下代码:
{% extends [\n \'pages/0001/file.twig\',\n \'pages/file.twig\',\n\n \'base/pages/file_content.twig\'\n ]\n%}\nRun Code Online (Sandbox Code Playgroud)\n\n并且里面的文件pages/必须有以下内容:
{% extends \'base/pages/file_content.twig\' %}\nRun Code Online (Sandbox Code Playgroud)\n\n这允许您覆盖内部的任何块base/pages/file_content.twig,并且仅包含/扩展文件(如果存在)。
拥有保证文件(在本例中,base/pages/file_content.twig 必须始终存在)仍将显示“默认”内容,并且不会引发令人讨厌的异常。
在这个答案的范围之外,我最初发现了一种非常相似的方法,它使用条件值。
\n\n尝试一下: https: //twigfiddle.com/u06tur
\n