2017-05-09 104 views
1

我有一個擴展,我將它放在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['meta']['title'] = microtime(true); 

和包裝的整個功能是明顯的渲染方法(從Slimphp - 簡化爲簡潔起見)

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

meta.title變量始終設置爲「從slim設置」在父模板中,無論我嘗試什麼,我都無法重寫它。

我已經嘗試了晚期靜態綁定,使用容器類靜態獲取/設置變量,但不管我嘗試的父母總是呈現與原始「設置從苗條」變量值。我有針對性地指出這一事實,$上下文不是通過引用繞過樹枝傳遞的。

當然有人過去曾經打過這堵牆,並知道工作?

請幫忙!

在此先感謝

編輯:

建議的回答沒有回答這個問題。它嘗試從模板文件中推遲渲染,我希望在運行時覆蓋來自不同文件的變量。

+0

可能有[Extends parent blocks從嵌入模板](http://stackoverflow.com/questions/42702118/extends-parent-blocks-from-embed-template) – DarkBee

+0

看看我在那裏鏈接的擴展。它應該給你一個方向 – DarkBee

+0

謝謝,但試圖在模板內設置變量不是嗎?我期待從一個不同的包含文件中設置/覆蓋它們 –

回答

0

原來這是絕對不可能的。

最後,我寫了一些代碼來加載模板文件,使用正則表達式解析它,以提取{% module .... %}行,抓住控制器,將其緩存到控制器的數組列表中以包含在所述頁面中,然後下一次而不是解析我只能查看有問題的視圖的CRC(使用filemtime($path);)來查看它是否發生了變化,然後返回包含列表以包含在調用渲染之前設置哪些變量