【发布时间】: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