在Twig中有条件地扩展模板

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.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 %}
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 &euro;</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 &euro;</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.

Ism*_*uel 0

经过几次尝试,我终于找到了一种方法来做到这一点。

\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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
{% 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 %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
{% extends [\n        \'pages/0001/file.twig\',\n        \'pages/file.twig\',\n\n        \'base/pages/file_content.twig\'\n    ]\n%}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
{% extends \'base/pages/file_content.twig\' %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这允许您覆盖内部的任何base/pages/file_content.twig,并且仅包含/扩展文件(如果存在)。

\n\n

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

\n\n
\n\n

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

\n\n

尝试一下: https: //twigfiddle.com/u06tur

\n