如何填充包含的树枝模板中的变量

时间:2015-11-08 23:22:48

标签: php templates 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 %}

这样做,当我渲染class_from_index时,变量base.twig会填充到index.twig。 但是,如果我有这样的gallery.twig:

{# gallery.twig #}
{% set class_from_index = 'gallery' %}
<div>
    A gallery
</div>

并在{% include gallery.twig %}中添加index.twig,变量class_from_index未填充到index.twigbase.twig。我知道如果gallery.twig延伸index.twigindex.twig延伸base.twig,这将有效,但事实并非如此。

有没有办法实现我想要解释的内容? 谢谢:))

1 个答案:

答案 0 :(得分:1)

问题

如果 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;

通过另一种方式设计模板架构,必须有更好的解决方案来解决您的问题。问题本身并不重要,完全出于良好做法。