2015-08-26 174 views
0

我希望有人能夠幫助我解決這個問題。Twig轉義HTML並渲染爲原始

我從數據庫中提取細節以顯示在樹枝模板上(使用Symfony2),但將其保存在數據庫中的方式使得難以解釋HTML。

基本上,HTML標籤已經被翻譯成表中的實體,例如:

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

等。我已經研究了樹枝的渲染選項,並試圖(渲染產品說明的環基於我)以下:

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

,也只是:

{{ product.description|raw }} 

第一種方法只是呼應了現有的內容(實體),第二種方法只是呈現HTML標籤的頁面,如下所示:

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

所以,你可以看到,我不能找到一種方法,實際上解釋HTML標籤爲了顯示描述應該是。

有沒有辦法做到這一點?我不能做到這一點在PHP所有它做的是發送對象到通過循環模板:

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); 
} 
+0

因此,您已經在數據庫中轉義了HTML,並且您想將其作爲原始HTML輸出爲HTML格式?爲什麼它首先在數據庫中轉義? *這是你應該糾正的核心問題。 – deceze

+0

如果可能的話,不要在將數據存入數據庫時​​對數據進行編碼。一個好的閱讀將是[@ deceze的「大逃亡」](http://kunststube.net/escapism/)。 Deceze!你不能等待幾秒鐘;) – Yoshi

+1

@Yoshi我似乎被吸引到這些類型的問題...:d – deceze

回答

0

我認爲你必須定製逃避者寫插件解碼HTML實體,並使用它像這樣:

{{ product.description|myawesomehtmlentitiesdecoder|raw }} 

http://twig.sensiolabs.org/doc/filters/escape.html#custom-escapers僅供參考。

但通常情況下,最好將HTML存儲在數據庫中,然後在輸出中應用所需的安全過濾器。

2

您的核心問題是您的數據庫中沒有HTML開頭。 充其量枝條可以準確地輸出一些HTML實體,這將明顯呈現爲「<p> ...」,並在「最差」的樹枝將難逃文本渲染它,因爲它實際上是,這是「 & lt; p & gt; ...「。期待Twig輸出實際的HTML將會使段落不現實,因爲這不是你的原始數據所包含的。

您必須首先在PHP中對該文本進行HTML解碼,然後使用..|raw將其輸出到Twig中。 raw意味着Twig將按原樣輸出,而不會進一步轉義。由於從數據庫獲取數據到html_entity_decode這是無稽之談,所以您需要在這裏修復您的數據輸入不要 HTML編碼數據是將轉換成的數據庫,它沒有任何用處。

+0

正如我在上面的評論中所說的那樣,我無法控制數據的保存方式,因爲它是由Open Cart控制的,我簡單地編碼Admin該數據背後的區域。 –

+0

那麼,答案就是你需要用PHP解碼數據。你*可以*添加樹枝過濾器等,這樣做在樹枝,但這似乎錯位和矯枉過正。 – deceze