如何从包含的树枝模板填充变量
How to populate up variables from included twig template
我希望能够从包含的 twig 模板填充变量,就像在扩展另一个模板时一样。这是一个例子:
我有base.twig如下:
{# base.twig #}
<html>
<head></head>
<body class="body {{class_from_index}}">
<nav>...</nav>
{% block content %}
{% endblock %}
<footer>...</footer>
</body>
</html>
和index.twig如下:
{# index.twig #}
{% extends "base.twig" %}
{% set class_from_index = 'index' }
{% block content %}
<div>My actual content</div>
{% endblock %}
这样做,当我渲染 index.twig
时,变量 class_from_index
被填充到 base.twig
。
但是,如果我有这样的 gallery.twig:
{# gallery.twig #}
{% set class_from_index = 'gallery' %}
<div>
A gallery
</div>
并在 index.twig
中添加 {% include gallery.twig %}
,变量 class_from_index
不会填充到 index.twig
或 base.twig
。我知道如果 gallery.twig
扩展 index.twig
并且 index.twig
扩展 base.twig
,这将起作用,但事实并非如此。
有什么方法可以实现我要解释的内容吗?
谢谢:)
问题
如果main.twig包含:
{% include "gallery.twig" %}
编译结果将是:
protected function doDisplay(array $context, array $blocks = array())
{
// line 1
$this->loadTemplate("gallery.twig", "main.twig", 1)->display($context);
}
如果 gallery.twig 包含:
{% set var = 42 %}
结果是:
protected function doDisplay(array $context, array $blocks = array())
{
// line 1
$context["var"] = 42;
}
如您所见,上下文未作为参考提供,因此无法填充您的变量。
相当于PHP
原因很明显。使用从较低范围到较高范围的变量看起来非常奇特。这就像你在 PHP:
<?php
function gallery() {
$var = 42;
}
gallery();
echo $var;
一定有更好的解决方案...通过另一种方式设计模板架构。这个问题本身是不相关的,这完全不符合良好做法。
我希望能够从包含的 twig 模板填充变量,就像在扩展另一个模板时一样。这是一个例子:
我有base.twig如下:
{# base.twig #}
<html>
<head></head>
<body class="body {{class_from_index}}">
<nav>...</nav>
{% block content %}
{% endblock %}
<footer>...</footer>
</body>
</html>
和index.twig如下:
{# index.twig #}
{% extends "base.twig" %}
{% set class_from_index = 'index' }
{% block content %}
<div>My actual content</div>
{% endblock %}
这样做,当我渲染 index.twig
时,变量 class_from_index
被填充到 base.twig
。
但是,如果我有这样的 gallery.twig:
{# gallery.twig #}
{% set class_from_index = 'gallery' %}
<div>
A gallery
</div>
并在 index.twig
中添加 {% include gallery.twig %}
,变量 class_from_index
不会填充到 index.twig
或 base.twig
。我知道如果 gallery.twig
扩展 index.twig
并且 index.twig
扩展 base.twig
,这将起作用,但事实并非如此。
有什么方法可以实现我要解释的内容吗? 谢谢:)
问题
如果main.twig包含:
{% include "gallery.twig" %}
编译结果将是:
protected function doDisplay(array $context, array $blocks = array())
{
// line 1
$this->loadTemplate("gallery.twig", "main.twig", 1)->display($context);
}
如果 gallery.twig 包含:
{% set var = 42 %}
结果是:
protected function doDisplay(array $context, array $blocks = array())
{
// line 1
$context["var"] = 42;
}
如您所见,上下文未作为参考提供,因此无法填充您的变量。
相当于PHP
原因很明显。使用从较低范围到较高范围的变量看起来非常奇特。这就像你在 PHP:
<?php
function gallery() {
$var = 42;
}
gallery();
echo $var;
一定有更好的解决方案...通过另一种方式设计模板架构。这个问题本身是不相关的,这完全不符合良好做法。