Twig转义HTML并渲染为原始

时间:2015-08-26 08:33:46

标签: html symfony twig

我希望有人可以在这个问题上帮助我。

我从数据库中提取细节以显示在树枝模板上(使用Symfony2),但它在数据库中的保存方式使得难以解释HTML。

基本上,HTML标签已经被翻译为表格中的实体,例如:

{% set strategy = 'html' %}
{% autoescape 'html' %}
{{ product.description|escape('html')|raw }}
{% endautoescape %}

等等。我已经研究了twig中的渲染选项,并尝试了以下内容(基于我渲染产品描述的循环):

{{ product.description|raw }}

并且还只是:

<p>Bach Flower Crab Apple Remedy: the "cleansing" Remedy can be used both internally and externally.</p><p><strong>...

第一种方法只是回显现有内容(作为实体),第二种方法只是将HTML标记呈现给页面,如下所示:

public function showAction(Request $request, $store_id=0)
{
    $max = 1000;
    $repository = $this->getDoctrine()->getRepository('AppBundle:Product');
    $products = $repository->getProductsByStoreId($store_id,$max);
    $paginator  = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $products,
        $request->query->get('page', 1),
        20
    );

    $return['products'] = $pagination;
    $return['categories'] = $this->getCategories();

    return $this->render('AppBundle:tables:productstable.html.twig', $return);
}

因此,正如您所看到的,我无法找到实际解释HTML标记的方法,以便按原样显示描述。

有办法做到这一点吗?我不能在PHP中这样做,因为它正在做的是将一个对象发送到循环的模板:

local spriteList = {}  
local function spawnRedThing(dt)
  local sprite = cc.Sprite:create("land.png")
  table.insert(spriteList,sprite)
end

local function touchBegan(touch,event)
  for index,obj in pairs(spriteList) do
    if cc.rectContainsPoint(obj:getBoundingBox(),touch:getLocation()) then
      --sprite touched
    end
  end
  return true
end 

1 个答案:

答案 0 :(得分:2)

您的核心问题是您的数据库中没有HTML。 充其量 Twig可以输出一些 HTML实体,它们会明显呈现为“&lt; p&gt; ...”,而在“最差”的Twig会将文本转义为实际上准确地渲染它,这是“&amp; lt; p&amp; gt; ...”。期望Twig输出将呈现段落的实际HTML是不现实的,因为这不是原始数据所包含的内容。

您必须先在PHP中对该文本进行HTML解码,然后使用 <reference name="head"> <action method="setRobots"><value>NOINDEX,NOFOLLOW</value></action> </reference> 在Twig中输出。 ..|raw表示Twig将按原样输出,而不会进一步转义它。由于将数据从数据库中获取到html_entity_decode是无意义的,因此您需要在此处修复数据输入 不要 HTML编码进入数据库的数据,它没有用处。