如何将值推送到模板和部分中的数组以在布局中输出它们?

How to push values to array in templates and partials to output them in layout?

我们正在使用 Twig 作为我们的模板引擎,但我现在遇到了渲染顺序的问题。参见 - https://straightupcraft.com/articles/twig-processing-order

我们正在为我们的新站点使用 amp,对于 amp 和网络组件,通常需要导入组件(一次)才能使用它们。所以想法是创建一个 Twig Extension 来完成这个。每次使用一个组件时,都会通过这个 twig 函数调用来调用它。该函数正在检查组件,将其添加到堆栈中,您可以从现在开始使用它。然后将堆栈转换为页面头部的导入列表。

这里的问题是 Twigs 从上到下的渲染。当我在部分或模板中调用所述函数时,"layout.twig" 的渲染已经发生并且所有函数调用 below/after 都不会影响堆栈。

是否有一个选项可以将渲染更改为由内而外,以便渲染首先使用最低部分,然后 "bubbles" 直到模板,最后在不渲染它们的情况下进行布局? 另一种在布局中获取值的方法也不错。

期望的行为:

Layout.twig

{{ getAllComponents() }}
{# should output component1 and component2 #}
{% block content %}

Page.twig

{% extends Layout.twig %}
{{ addComponent('component1') }}
{% include partials.twig %}
<component1>...</component1>

partials.twig

{{ addComponent('component2') }}
<component2>...</component2>

实际行为:

Layout.twig

{{ getAllComponents() }}
{# is empty #}

据我所知,不能切换 TWIG 模板的渲染。

但是,我建议您查看 {% embed %}{{ render }} 标签。

Embed 允许将特定的 TWIG 文件放置在带有变量的其他文件中,因此您可以将每个组件传递到它们相关的 partials.twig 文件中。

Render 允许使用嵌入一个单独的控制器操作,因此您创建一个 ControllerAction,它接受一个 component 变量并呈现它自己的 TWIG 文件。

关于嵌入的文档:https://twig.sensiolabs.org/doc/2.x/tags/embed.html

包含渲染的文档:https://twig.sensiolabs.org/doc/2.x/api.html

没有更改此行为的选项。但是你可以使用一个技巧来归档这个: 在调用 getAllComponents()

之前将您的内容呈现给变量

layout.twig

{% set mainContent %}
    {% block content %}{% endblock %}
{% endset %}

{{ getAllComponents() }}

{{ mainContent }}

这个问题实际上有一个神奇的解决方案 -- 一些天才写了这个 Deferred Twig Extension 它可以让你 运行 在附近的一个块中编写一些代码(输出变量,调用函数等)布局的顶部,但要等到其余的树枝模板在执行它们之前被解析。 github 页面上有一个示例展示了如何实现这一点。