覆盖树枝中的父变量

时间:2017-05-09 08:42:58

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

我有一个扩展名,我将它与twig / PHP放在一起。

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

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

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

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

我的(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不是通过twig引用传递的。

过去有人过去曾经碰过这堵墙并且知道一项工作吗?

请帮忙!

提前致谢

编辑:

建议的答案没有回答这个问题。它试图从模板文件中推迟渲染,我希望在运行时覆盖不同文件中的变量。

1 个答案:

答案 0 :(得分:0)

事实证明这是完全不可能的。

最后我写了一些代码来加载模板文件,使用正则表达式解析它以提取{% module .... %}行,抓取控制器,将其缓存到控制器的数组列表中以包含在所述页面中,然后下一步时间而不是解析我可以只查找有问题的视图的CRC(使用filemtime($path);)以查看它是否已更改,然后返回包含列表以包括在呈现之前设置变量的内容称为