Twig如何将子模板变量传递给父模板中include的模板
问题原因
Twig 中块内部通过set定义的变量作用域仅限当前块,你在navbar_style块内定义的color变量无法被块外的include语句读取,因此不生效。
解决方案
方案1:子模板全局定义变量(最简便)
不需要额外新增块,直接在子模板的所有块之外定义color变量,该变量会进入全局作用域,父模板可直接读取:
{# File: theme.html.twig #} {% extends 'base.html.twig' %} {# 块外定义的变量为全局变量,父模板可直接访问 #} {% set color = 'dark' %} {% block content %} {# 你的页面内容 #} {% endblock %}
父模板可保留原有逻辑,也可以给color加默认值避免变量未定义报错:
{# File: base.html.twig #} <body> {# 这里的color优先读取子模板定义的值,没有则用默认值light #} {{ include('_navbar.html.twig', {color: color|default('light')}) }} {% block content %}{% endblock %} {{ include('_footer.html.twig') }} </body>
方案2:将导航栏引入逻辑放入块中
把导航栏的引入代码整体封装到块内,子模板重写块时直接传入自定义参数:
{# File: base.html.twig #} <body> {% block navbar %} {# 块内默认传参light #} {{ include('_navbar.html.twig', {color: 'light'}) }} {% endblock %} {% block content %}{% endblock %} {{ include('_footer.html.twig') }} </body>
子模板重写navbar块即可自定义color:
{# File: theme.html.twig #} {% extends 'base.html.twig' %} {% block navbar %} {# 重写块,传入自定义的color值 #} {{ include('_navbar.html.twig', {color: 'dark'}) }} {% endblock %} {% block content %} {# 你的页面内容 #} {% endblock %}
方案3:声明全局变量突破块作用域限制
如果要保留你原本的块定义逻辑,只需要在set变量时声明为全局作用域即可:
{# File: base.html.twig #} {% block navbar_style %} {# 声明为global,块外也能读取该变量 #} {% set global color = 'light' %} {% endblock %} <body> {{ include('_navbar.html.twig', {color: color}) }} {% block content %}{% endblock %} {{ include('_footer.html.twig') }} </body>
子模板重写块时同样声明全局变量:
{# File: theme.html.twig #} {% extends 'base.html.twig' %} {% block navbar_style %} {% set global color = 'dark' %} {% endblock %} {% block content %} {# 你的页面内容 #} {% endblock %}
内容的提问来源于stack exchange,提问作者AlexNica
相关产品推荐
相关产品推荐

