【问题标题】:How can I use a variable on my extended twig page (Symfony)?如何在我的扩展树枝页面 (Symfony) 上使用变量?
【发布时间】:2019-05-04 13:04:51
【问题描述】:

我使用我的 Controller.php 将数据返回到我的树枝模板:

  return $this->render('list.html.twig', ['page' => $page]);

在我的 list.html.twig 上,我可以输出我的变量:

{{page.name}}

但我在 list.html.twig 上扩展了我的 base.html 树枝:

{% extends 'base.html.twig' %}

所以当我想在我的 base.html.twig 上输出我的变量时:

{{page.name}}

然后我收到错误消息:

未捕获的 PHP 异常 Twig_Error_Runtime:“变量”页面“没有 存在。”在 /Users/work/project/templates/base.html.twig 第 70 行

【问题讨论】:

  • 你需要在模板中添加一个提供这个变量的服务,见symfony.com/doc/current/templating/global_variables.html
  • 变量page 应该在扩展模板中是已知的。请参阅here 请确保您正确传递了变量。在您的主模板中尝试{{ dump(_context) }}
  • @jeroen 我按照您的建议对其进行了测试。 globals: page: page 但现在我收到错误消息Impossible to access an attribute ("slug") on a string variable ("page").
  • 是的,没错。不过最好使用{{ dump(_context|keys) }} 转储 - 这将允许您查看所有已定义的变量
  • 是的,只有宏有另一个scope,但扩展的模板和包含的所有模板都使用相同的范围(在_context 中定义)

标签: php symfony variables twig


【解决方案1】:

在您的 base.html.twig 上添加一个类似

的块
{% block page %}{% endblock page %}

然后在list.html.twig 添加{% block page %}{{page.name}}{% endblock page %}

所以你可以有一个像base.html.twig这样的文件

<html>
    <body>
        <h1>{% block page %}{% endblock page %}
        <p>{% block content%}{% endblock content %}</p>
    </body>
</html>

还有一个list.html.twig 喜欢

{% extends 'base.html.twig' %}

{% block page %}{{ page.name }}{% endblock page %}
{% block content %}errything else for page here{% endblock content %}

它是有效的,并且会通过继承覆盖 base.html.twig 的页面块。

添加了一个 twigfiddle 示例 https://twigfiddle.com/d1hmo9

【讨论】:

  • 很遗憾,我不明白。我需要在 base.html.twig 上使用变量 {{ page.name }},因为它在 javascript 块中被多次使用。在我的所有页面上,我都想扩展 base.html.twig,否则我需要在任何页面上一次又一次地编写 javascipt 部分
  • 在你的例子中,我不能随意在我的 base.html.twig 上的任何地方使用 {{ page.name }} 变量
  • 如果您在list.html.twig 中扩展base.html.twig,就像我在上面发布的那样,它将冒泡并填写base.html.twig 上的块。尝试在您的base.html.twig 上创建{% block page %}{% endblock page %},然后将{% block page %}{{ page.name }}{% endblock page %} 添加到您的list.html.twig,试试看它是否正确填充。
  • 变量page 在主模板中应该是已知的。你不需要block's
  • 我仍然建议不要在块范围之外直接使用它,否则你必须在每个页面上包含页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多