我有一个twig变量 html 。要在树枝模板中显示,我会{{html}}
。
该变量如下:
<div>{{region_top}}</div><div>{{region_center}}</div>
region_*
也是一个变量。当Twig解析我的html
变量时,它不会解析内部变量(区域)。
我应该做什么?
答案 0 :(得分:25)
我有twig变量html。要在树枝模板中显示,我会{{html}}。该变量看起来像{{region_top}} {{region_center}}。 region_ *也是变量。当twig解析我的html变量时,他没有解析内部变量(区域)。我该怎么办?
Twig将您的字符串作为文字字符串,这意味着您将看到变量的内容,已转义。如果您希望它能够显示{{region_top}},我建议这样:
{{html|replace({'{{region_top}}': region_top, '{{region_center}}': region_center})}}
如果你的html变量的内容也是动态的(意味着它可以包含的不仅仅是那两个变量),我会写一个可以做你想要的twig插件。编写插件非常容易。
编辑:这是我刚刚写完的扩展程序。
编辑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}}
答案 1 :(得分:15)
请参阅http://twig.sensiolabs.org/doc/functions/template_from_string.html
似乎这经常被忽略,因为大多数人在期望过滤器/函数以他们正在起草的当前语言进行评估时会想到(并搜索)“eval”。来自字符串的模板不是第一个搜索查询想到这一点。
答案 2 :(得分:4)
一种选择是将模板呈现为字符串。你可以这样做:
$env = new \Twig_Environment(new \Twig_Loader_String());
echo $env->render(
"Hello {{ name }}",
array("name" => "World")
);
我会留给你来决定如何构建你的代码以使其工作,但它可能是这样的: 1)获取包含未被替换的变量的内部模板文本。 2)将内部模板文本渲染为$ html变量。一定要传入你需要的任何变种。 3)渲染包含{{html}}的原始模板。一定要传递'html'=&gt; vars数组中的$ html
答案 3 :(得分:1)
您也可以将数组或对象传递给视图,然后使用twig attribute()方法:http://twig.sensiolabs.org/doc/functions/attribute.html
{% if attribute(array, key) is defined %}
{{ attribute(array, key) }}
{% endif %}