問題
嫩枝上下文從不存儲在模板對象,所以這將是很難找到一個乾淨的方式來實現這一目標。例如,下面的嫩枝代碼:
{% set test = 'Hello, world' %}
將編譯到:
<?php
class __TwigTemplate_20df0122e7c88760565e671dea7b7d68c33516f833acc39288f926e234b08380 extends Twig_Template
{
/* ... */
protected function doDisplay(array $context, array $blocks = array())
{
// line 1
$context["test"] = "Hello, world";
}
/* ... */
}
正如你所看到的,繼承的上下文不傳遞到由參考doDisplay方法,並且永遠不會存儲在對象本身(如$this->context = $context
)。此設計允許模板可重複使用,並且內存友好。
解決方法1:使用全局變量
我不知道你是知道的嫩枝Global Variables。你可以用它們做一堆黑客。
最簡單的用法是將所有的全局變量加載到你的樹枝環境中。
$loader = new Twig_Loader_Filesystem(__DIR__.'/view');
$env = new Twig_Environment($loader);
$env->addGlobal('foo', 'bar');
$env->addGlobal('Hello', 'world!');
然後,你可以把你的整個應用程序中使用{{ foo }}
和{{ Hello }}
。
但也有2個問題在這裏:
解決方法2:用一根樹枝延伸
您還可以創建一個存儲擴展,它提供了一個save
功能某處堅持一些模板的情況下,和一個restore
功能合併在一個又一個這樣存儲的上下文。
proof_of_concept.php
<?php
require __DIR__.'/vendor/autoload.php';
class StorageTwigExtension extends Twig_Extension
{
protected $storage = [];
public function getFunctions() {
return [
new Twig_SimpleFunction('save', [$this, 'save'], ['needs_context' => true]),
new Twig_SimpleFunction('restore', [$this, 'restore'], ['needs_context' => true]),
];
}
public function save($context, $name) {
$this->storage = array_merge($this->storage, $context);
}
public function restore(&$context, $name) {
$context = array_merge($context, $this->storage);
}
public function getName() {
return 'storage';
}
}
/* usage example */
$loader = new Twig_Loader_Filesystem(__DIR__.'/view');
$env = new Twig_Environment($loader);
$env->addExtension(new StorageTwigExtension());
echo $env->render('test.twig'), PHP_EOL;
樹枝/ variables.twig
{% set foo = 'bar' %}
{% set Hello = 'world!' %}
{{ save('test') }}
樹枝/ test.twig
{% include 'variables.twig' %}
{{ restore('test') }}
{{ foo }}
注意:如果你只想要導入變量,而無需實際渲染裏面有什麼樹枝/ variables.twig,你也可以使用:
{% set tmp = include('variables.twig') %}
{{ restore('test') }}
{{ foo }}
最後說明
我不習慣JavaScript的樹枝端口,但它看起來像你仍然可以擴展它,這是你的去:)
是否有一個或兩個文件在第二個代碼塊? –
@ A.L他們是單獨的文件,我更新了我的問題。 – Evans
你能否說出你爲什麼要這樣做?看一下[include](http://twig.sensiolabs.org/doc/tags/include.html)文檔中不需要模板名稱。也許你可以用自定義的小枝功能解決它。 – DarkBee