在Twig中设置默认原始过滤器

时间:2014-03-05 00:07:01

标签: php symfony twig silex

我正在使用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>

通过查看源代码看起来像这样:

&lt;span class=&#039;title light&#039;&gt;Contacto y&lt;/span&gt;&lt;br&gt;&lt;span class=&#039;title&#039;&gt;Ubicación&lt;/span&gt;

我浏览文档,我知道我可以在模板上使用原始过滤器来避免这种情况,如下所示:

{{ bannerTitle|raw }}

但我希望尽可能保持模板上的代码,并避免将raw放到模板上的所有内容中。

有没有办法告诉Twig始终将生成的输出视为原始的?

P.S:我也尝试使用htmlentities,html_entity_decode等解析生成的数据而没有运气:(

2 个答案:

答案 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'
)