如何从包含的分支模板中填充变量


How to populate up variables from included twig template

我希望能够从包含的分支模板中填充变量,就像扩展另一个模板一样。这里有一个例子:

我的基本假发如下:

{# base.twig #}
<html>
    <head></head>
    <body class="body {{class_from_index}}">
        <nav>...</nav>
        {% block content %}
        {% endblock %}
        <footer>...</footer>
    </body>
</html>

和index.trick如下:

{# 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 #}
{% set class_from_index = 'gallery' %}
<div>
    A gallery
</div>

并且在index.twig中加上{% include gallery.twig %},变量class_from_index不被填充到index.twigbase.twig。我知道,如果gallery.twig扩展index.twigindex.twig扩展base.twig,这将起作用,但事实并非如此。

有没有办法达到我想要解释的目的?谢谢:)

问题

如果main.titch包含:

{% include "gallery.twig" %}

编译结果为:

protected function doDisplay(array $context, array $blocks = array())
{
    // line 1
    $this->loadTemplate("gallery.twig", "main.twig", 1)->display($context);
}

如果gallery.trick包含:

{% 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;

你的问题一定有更好的解决方案。。。通过另一种方式设计模板架构。这个问题本身并不相关,这完全不符合良好的实践。