我有一个扩展名,我将它与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引用传递的。
过去有人过去曾经碰过这堵墙并且知道一项工作吗?
请帮忙!
提前致谢
编辑:
建议的答案没有回答这个问题。它试图从模板文件中推迟渲染,我希望在运行时覆盖不同文件中的变量。
答案 0 :(得分:0)
事实证明这是完全不可能的。
最后我写了一些代码来加载模板文件,使用正则表达式解析它以提取{% module .... %}
行,抓取控制器,将其缓存到控制器的数组列表中以包含在所述页面中,然后下一步时间而不是解析我可以只查找有问题的视图的CRC(使用filemtime($path);
)以查看它是否已更改,然后返回包含列表以包括在呈现之前设置变量的内容称为