我有枝條變量html。要顯示它在一個樹枝模板中,我做{{html}}
。枝條變量中的枝條變量
該變量的樣子:
<div>{{region_top}}</div><div>{{region_center}}</div>
region_*
是一個變量太多。當Twig解析我的html
變量時,它不解析內部變量(區域)。
我該怎麼辦?
我有枝條變量html。要顯示它在一個樹枝模板中,我做{{html}}
。枝條變量中的枝條變量
該變量的樣子:
<div>{{region_top}}</div><div>{{region_center}}</div>
region_*
是一個變量太多。當Twig解析我的html
變量時,它不解析內部變量(區域)。
我該怎麼辦?
我有樹枝變量html。爲了在樹枝模板中顯示它,我做了{{html}}。該變量看起來像{{region_top}} {{region_center}}。 region_ *也是變量。當樹枝解析我的html變量時,他沒有解析內部變量(區域)。我該怎麼做?
Twig將您的字符串作爲文字字符串,這意味着您將看到變量的內容轉義。如果你希望它能夠顯示{{region_top}}還有,我建議是這樣的:
{{html|replace({'{{region_top}}': region_top, '{{region_center}}': region_center})}}
如果您的HTML變量的內容也是動態的(這意味着它可以包含多隻這兩個變量),我會寫一個可以做你想做的事情的樹枝插件。編寫插件很容易。
編輯:這是我剛寫完的擴展。
編輯2:擴展現在使用的環境渲染字符串,所以它的計算結果,而不是僅僅更換變量的字符串。這意味着你的變量可以包含模板可以包含的任何東西,並且它將被Twig自身渲染和轉義。我真棒。
<?php
/**
* A twig extension that will add an "evaluate" filter, for dynamic evaluation.
*/
class EvaluateExtension extends \Twig_Extension {
/**
* Attaches the innervars filter to the Twig Environment.
*
* @return array
*/
public function getFilters() {
return array(
'evaluate' => new \Twig_Filter_Method($this, 'evaluate', array(
'needs_environment' => true,
'needs_context' => true,
'is_safe' => array(
'evaluate' => true
)
))
);
}
/**
* This function will evaluate $string through the $environment, and return its results.
*
* @param array $context
* @param string $string
*/
public function evaluate(\Twig_Environment $environment, $context, $string) {
$loader = $environment->getLoader();
$parsed = $this->parseString($environment, $context, $string);
$environment->setLoader($loader);
return $parsed;
}
/**
* Sets the parser for the environment to Twig_Loader_String, and parsed the string $string.
*
* @param \Twig_Environment $environment
* @param array $context
* @param string $string
* @return string
*/
protected function parseString(\Twig_Environment $environment, $context, $string) {
$environment->setLoader(new \Twig_Loader_String());
return $environment->render($string, $context);
}
/**
* Returns the name of this extension.
*
* @return string
*/
public function getName() {
return 'evaluate';
}
}
用法示例:
$twig_environment->addExtension(new EvaluateExtension());
在模板:
{% set var = 'inner variable' %}
{{'this is a string with an {{var}}'|evaluate}}
一種選擇是使你的模板爲字符串。你可以是這樣做的:
$env = new \Twig_Environment(new \Twig_Loader_String());
echo $env->render(
"Hello {{ name }}",
array("name" => "World")
);
我將讓你來決定究竟如何構造代碼,以使這項工作,但它可能會去是這樣的: 1)取內模板文本包含未被替換的變量。 2)將內部模板文本渲染到$ html變量中。一定要通過你需要的任何變量。 3)渲染包含{{html}}的原始模板。一定要在「HTML」 => $ HTML傳遞瓦爾數組中
見http://twig.sensiolabs.org/doc/functions/template_from_string.html
看來,這是頻頻失手,因爲大多數人認爲(和搜索)「EVAL」期待一個過濾器時/函數以當前正在起草的語言進行評估。字符串模板不是您想到的第一個搜索查詢。
搖擺 - 在這裏學到了新的東西。謝謝 – ejuhjav
你也可以傳遞一個數組或對象的視圖,然後用小樹枝屬性()方法:http://twig.sensiolabs.org/doc/functions/attribute.html
{% if attribute(array, key) is defined %}
{{ attribute(array, key) }}
{% endif %}
起初接受的答案您以前的問題... – jkucharovic
你賴特,遺憾的是 – Meliborn