web-dev-qa-db-fra.com

Unescape ou décodage html dans Twig (PHP Templating)

J'utilise twig 1.12.2. Mon code génère des éléments à partir de code-behind, lors du rendu avec la dernière version de twig ils obtiennent html- encodé

{% 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 %}

Cela produira ce

<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>

Quand je débogue et regarde les données avant qu'elles ne soient envoyées à twig elles ne sont pas échappées. Je n'ai trouvé aucune alternative à {{item.Link}} pour rendre les données telles quelles) .

Merci

25
Eric Herlitz

Vous pouvez utiliser le filtre raw pour créer twig render raw html

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

{% autoescape %}
    {{ var|raw }} {# var won't be escaped #}
{% endautoescape %}
51
romainberger

Vous devez être prudent lorsque vous utilisez | raw. Dire que les données sont sécurisées signifie que vous leur faites confiance à 100%.

Personnellement, je suggère d'utiliser un filtre personnalisé twig:

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

Ajoutez ce qui suit à votre services.yml (ou bien traduisez-le en xml).

 services:
     ha.twig.custom_extension:
     class: HA\SiteBundle\Twig\CustomExtension
     tags:
         - { name: twig.extension }
14
PR Whitehead

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

{% autoescape false %}
   {{ your_item }}{# your_item won't be escaped #}
{% endautoescape %}
10
Promo IL

Si vous utilisez Drupal 8 et aucun des travaux raw ou autoscape, cela peut se produire en raison de la variable que vous essayez d'imprimer s'il s'agit d'un rendu tableau avec un modèle contenant une sortie sûre (par exemple, un hl2br filtre).

Dans ce cas, vous devrez accéder à la valeur via le tableau de rendu et la filtrer, par exemple:

{% autoescape false %}
  {{ item.content['#context']['value'] }}
{% endautoescape %}
1
Juan De León