【问题标题】:Overriding parent variable in twig覆盖树枝中的父变量
【发布时间】:2017-05-09 08:42:58
【问题描述】:

我有一个与 twig / PHP 放在一起的扩展。

我的扩展程序查找如下行:

{% module 'blog' with {'controller':'controllers/posts.php', 'view':'templates/posts.html'} %}

在我的令牌解析器中,我查找控制器的路径 (posts.php) 并包含该文件 - 这一切正常。

在“posts.php”文件中,我想覆盖 $context 或覆盖我正在扩展的父模板中的变量,但是,似乎 $context 不是通过引用传递的,因此不能被覆盖。

我的 (base.html) 模板文件看起来像这样(为了便于阅读而缩短了)。

<title>{{meta.title}}</title>
{% block content %} Default  content {% endblock %}

我的 index.html(扩展 base.html 的模板)如下所示:

{% extends 'base.html' %}
{% block content %}
{% module 'blog' with {'controller':'controllers/posts.php', 'view':'templates/posts.html'} %}
{% endblock %}

在“posts.php”中,我(尝试)覆盖 $context(实际上是模板渲染的变量),如下所示:

$context['meta']['title'] = microtime(true);

包装整个功能显然是渲染方法(来自 Slimphp - 为简洁起见)

$twig->render('index.html', ['meta'=>['title'=>'Set from slim']]);

meta.title 变量总是在父模板中设置为“Set from slim”,无论我尝试什么,我都无法覆盖它。

我尝试过后期静态绑定,使用容器类静态获取/设置变量,但无论我尝试什么,父总是使用原始的“Set from slim”变量值呈现。我已经将这一点归结为 $context 不是通过引用在树枝周围传递的事实。

肯定有人过去曾碰过这堵墙并且知道解决办法吗?

请帮忙!

提前致谢

编辑:

建议的答案不能回答问题。它试图从模板文件中延迟渲染,我希望在运行时覆盖来自不同文件的变量。

【问题讨论】:

  • 观看我在其中链接的扩展程序。它应该给你一个方向
  • 谢谢,但是尝试在模板中设置变量不是吗?我希望从不同的包含文件中设置/覆盖它们
  • 你需要使用globals,因为每个模板都有自己的范围,你不能用扩展来改变它。
  • 后期静态绑定不会解决任何问题,因为树枝模板中的输出是 echo'd 并立即存储在 ob_buffer 中。使用全局 [此处][github.com/rybakit/…) 观看示例

标签: php twig slim slim-3 twig-extension


【解决方案1】:

事实证明这是绝对不可能的。

最后我写了一些代码来加载模板文件,使用正则表达式解析它以提取{% module .... %} 行,获取控制器,将其缓存到控制器的数组列表中以包含在所述页面中,然后下次代替解析时,我可以查找相关视图的 CRC(使用filemtime($path);)以查看它是否已更改,然后返回包含列表以包含在调用渲染之前设置的变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多