是否可以在twig文件中设置全局变量,以便我可以从其他文件,宏和块中访问这些变量。
例如,我想拥有variables.twig
文件并在其中设置我的变量,然后我可以将其包含在其他模板中。
我知道可以从框架(例如Symfony)设置全局变量,但我想要一个仅使用twig功能的解决方案。
答案 0 :(得分:23)
如果您使用的是Symfony2,则可以在config.yml
文件中设置全局变量:
# app/config/config.yml
twig:
# ...
globals:
myStuff: %someParam%
然后在您的应用中的任何位置使用{{ myStuff }}
。
如果您在另一个项目中使用Twig,则可以直接在环境中设置全局变量:
$twig = new Twig_Environment($loader);
$twig->addGlobal('myStuff', $someVariable);
然后在您的应用中的任何位置使用{{ myStuff }}
。
如果您有许多全局变量并且只想为应用程序的特定部分指定一组全局变量,则可以创建一个Twig扩展:
class Some_Twig_Extension extends Twig_Extension implements Twig_Extension_GlobalsInterface
{
public function getGlobals()
{
return array(
'someStuff' => $this->myVar,
// ...
);
}
// ...
}
然后仅在需要时将其导入您的环境:
$twig = new Twig_Environment($loader);
$twig->addExtension(new Project_Twig_Extension());
并且仍在应用中的任何位置使用{{ myStuff }}
。
当你包含一段Twig代码时,你只包括来自该代码的渲染视图,而不是代码本身。因此,设计中不可能按照您要查找的方式包含一组变量。
答案 1 :(得分:0)
自 Symfony 4 起,您可以在config/packages/twig.yaml
中设置全局变量。
# config/packages/twig.yaml
twig:
# ...
globals:
ga_tracking: 'UA-xxxxx-x'
答案 2 :(得分:0)
似乎您可以在顶级模板中分配全局READONLY变量,并在所有基础模板中使用它们。但是,您当然不能覆盖它们。 它涵盖了我的情况,也许对其他人有用。
base.html.twig
<!DOCTYPE html>
{# assign global vars here #}
{% set myReadonlyJar = your_custom_ext_twig_function() %}
<html>
<body>
{% block body %}{% endblock %}
</body>
</html>
my_page.twig
{% extends 'stack/base.html.twig' %}
{% block body %}
{{ myReadonlyJar.v1 }}
{{ myReadonlyJar.v2 }}
{{ include('stack/deep.twig') }}
{% endblock %}
deep.twig
Check top vars very deep inside: <br>
{{ myReadonlyJar.v2 }}