2013-03-16 9 views
17

Używam gałązki 1.12.2. Mój kod generuje pewne elementy kodu źródłowego, podczas renderowania te z najnowszej wersji gałązka dostać html zakodowanyUnescape lub dekodowanie html w Twig (PHP Templating)

{% for item in files_folders %} 
<tr class="{{ cycle(['tr_odd', 'tr_even'], loop.index) }}"> 
    <td><img src="../templates/images/sharepoint/{{ item.ContentType }}.gif" border="0" alt=""/></td> 
    <td>{{ item.Link }}</td> 
    <td>{{ item.Modified }}</td> 
    <td>{{ item.FileSize }}</td> 
    <td>{{ item.FileType }}</td> 
</tr> 
{% endfor %} 

Wyjście to będzie to

<tr class="tr_even"> 
    <td><img src="../templates/images/sharepoint/Document.gif" border="0" alt=""/></td> 
    <td>&lt;a href=&#039;?download=/ddd.png&#039;&gt;ddd.png&lt;/a&gt;</td> 
    <td>2013-03-04 17:47:38</td> 
    <td>64.8 KB</td> 
    <td>png</td> 
</tr> 
<tr class="tr_odd"> 
    <td><img src="../templates/images/sharepoint/Document.gif" border="0" alt=""/></td> 
    <td>&lt;a href=&#039;?download=/asdasd.png&#039;&gt;asdasd.png&lt;/a&gt;</td> 
    <td>2013-03-03 20:01:52</td> 
    <td>66.04 KB</td> 
    <td>png</td> 
</tr> 

Kiedy debugowanie i spojrzeć na dane przed wysłaniem do gałązki nie są chronione. Nie znalazłem żadnej alternatywy dla {{item.Link}} do renderowania danych bez zmian.

Dzięki

Odpowiedz

37

Można użyć filtru raw aby uczynić gałązka surowy HTML

http://twig.sensiolabs.org/doc/filters/raw.html

{% autoescape %} 
    {{ var|raw }} {# var won't be escaped #} 
{% endautoescape %} 
+0

Dobra odpowiedź +1 Jednak proszę podać przykład, aby zapewnić odpowiedź pozostaje istotne jako łącza może 'die' lub stały brakuje. –

+1

Jak zawsze: Należy zachować ostrożność podczas używania | raw. Jeśli wprowadzasz surowego użytkownika, otwierasz bramki dla XSS. – Rubinum

11

Należy być ostrożnym przy użyciu | surowe. Mówiąc, że dane są bezpieczne, oznacza to, że ufasz temu w 100%.

Osobiście proponuję przy użyciu niestandardowych filtrów gałązka:

class CustomExtension extends \Twig_Extension 
{ 
    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('unescape', array($this, 'unescape')), 
     ); 
    } 

    public function unescape($value) 
    { 
     return html_entity_decode($value); 
    } 
} 

Dodaj następujące do services.yml (lub alternatywnie przełożyć na XML).

services: 
    ha.twig.custom_extension: 
    class: HA\SiteBundle\Twig\CustomExtension 
    tags: 
     - { name: twig.extension } 
+0

To jest eleganckie, ale w aplikacjach, które nie są społecznościami lub publicznymi stronami internetowymi, 100% zaufania nie jest tak naprawdę problemem :) –

+1

Zgadzam się, ale nadal powinno to być brane pod uwagę, chroniąc na przykład dewelopera przed sobą. –