我正在使用Silex构建一个站点,并使用Twig来显示基于json文件的内容。
这是控制器中的代码:
$app->get('/', function() use ($app) {
$data = $app['data']->get('contactUs', 'es');
return $app['twig']->render('test.html', $data);
});
Data
只是一个自定义类,它将要显示的页面和要使用的语言作为参数,并根据Twig用作页面数据的json文件返回一个数组。
问题是json文件包含HTML标记,当Twig呈现页面时,它将它们显示为实体,例如,我的test.html模板如下所示:
<!DOCTYPE html>
<html>
<head>
<title>Twit Test</title>
</head>
<body>
{{ bannerTitle }}
</body>
</html>
但是,这会在{{ bannerTitle }}
上输出以下内容:
<span class='title light'>Contact Us</span>
通过查看源代码看起来像这样:
<span class='title light'>Contacto y</span><br><span class='title'>Ubicación</span>
我浏览文档,我知道我可以在模板上使用原始过滤器来避免这种情况,如下所示:
{{ bannerTitle|raw }}
但我希望尽可能保持模板上的代码,并避免将raw
放到模板上的所有内容中。
有没有办法告诉Twig始终将生成的输出视为原始的?
P.S:我也尝试使用htmlentities,html_entity_decode等解析生成的数据而没有运气:(
答案 0 :(得分:5)
我很确定这可以通过在树枝中使用{% autoescape false %} {% endautoescape %}
标签来实现。
即
{% autoescape false %}
<!DOCTYPE html>
<html>
<head>
<title>Twit Test</title>
</head>
<body>
{{ bannerTitle }}
{{ moreHTMLdata }}
{{ evenMoreHTMLdata }}
</body>
</html>
{% endautoescape %}
更多信息 http://twig.sensiolabs.org/doc/tags/autoescape.html
如果没有给{% filter raw %} {% endfilter %}
一个地方,那么这就省去了你必须为每个变量添加|raw
。使用这些方法中的任何一种,只需记住|escape
任何可能需要它的变量。
答案 1 :(得分:0)
您不应将HTML作为数据传递给模板引擎。如果JSON具有标记,那么您将需要在每个变量之后放置|raw
。出于安全原因,Twig可能会这样做。
否则:
<!DOCTYPE html>
<html>
<head>
<title>Twit Test</title>
</head>
<body>
<span class='title light'>{{ bannerTitle }}</span>
</body>
现在您需要传递的是:
Array(
'bannerTitle' => 'Contact Us'
)