我试图覆盖所包含模板中的变量。
我可以在Symfony3 & Twig
?
我的twig
模板如下所示:
{% set foo = 'bar' %}
{% include 'first.html.twig' %}
{% include 'second.html.twig' %}
// first.html.twig
{{ foo }}
{% set foo = 'second' %}
// second.html.twig
{{ foo }}
我得到了这样的结果:
酒吧
但我希望:
第二个
答案 0 :(得分:0)
以下Twig代码:
{% set a = 42 %}
{{ include("first.twig") }}
将编译成这一个:
// line 1
$context["a"] = 42;
// line 2
echo twig_include($this->env, $context, "first.twig");
twig_include
原型是:
# lib/Twig/Extension/Core.php
function twig_include(Twig_Environment $env, $context, $template, $variables = array(), $withContext = true, $ignoreMissing = false, $sandboxed = false)
因此,变量是通过复制传递的,而不是通过包含模板中的引用传递的。因此,包含模板中的更改不会反映到包含模板。
此外,自Twig 2.0以来,一旦初始化twig运行时,就无法调用TwigEnvironment::addGlobal
,因此使用简单的扩展就不会出现故障。
总而言之,您可以理解,如果您需要跨模板更新变量,则意味着某些模板包含业务逻辑,而Twig不是为此而构建的。您需要在控制器中准备整个上下文。
答案 1 :(得分:0)
或者,您可以从TWIG调用PHP类方法。生成pdf时所需的页面计数器示例。
自定义类:
class PageCounter
{
private $pageNumber = 0;
public function incrementPageCounter()
{
$this->pageNumber ++;
return $this->pageNumber;
}
}
控制器:
....
$twigVariables = [
...
'pageCounter' => new PageCounter()
];
return $this->render('template.html.twig', $twigVariables);
嫩枝模板(对象pageCounter
可从任何包含的模板中获得)
{{ pageCounter.incrementPageCounter() }} / {{totalPages}}
答案 2 :(得分:-1)
为什么不使用include
标记/功能覆盖您的变量,如:
{% include 'first.html.twig' with {'foo': 'second'} %}
或:
{ include('first.html.twig', {foo: 'second'}) }}