如何将值推送到模板和部分中的数组以在布局中输出它们?
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 文件。
没有更改此行为的选项。但是你可以使用一个技巧来归档这个:
在调用 getAllComponents()
之前将您的内容呈现给变量
layout.twig
{% set mainContent %}
{% block content %}{% endblock %}
{% endset %}
{{ getAllComponents() }}
{{ mainContent }}
这个问题实际上有一个神奇的解决方案 -- 一些天才写了这个 Deferred Twig Extension 它可以让你 运行 在附近的一个块中编写一些代码(输出变量,调用函数等)布局的顶部,但要等到其余的树枝模板在执行它们之前被解析。 github 页面上有一个示例展示了如何实现这一点。
我们正在使用 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 文件。
没有更改此行为的选项。但是你可以使用一个技巧来归档这个:
在调用 getAllComponents()
layout.twig
{% set mainContent %}
{% block content %}{% endblock %}
{% endset %}
{{ getAllComponents() }}
{{ mainContent }}
这个问题实际上有一个神奇的解决方案 -- 一些天才写了这个 Deferred Twig Extension 它可以让你 运行 在附近的一个块中编写一些代码(输出变量,调用函数等)布局的顶部,但要等到其余的树枝模板在执行它们之前被解析。 github 页面上有一个示例展示了如何实现这一点。