webentwicklung-frage-antwort-db.com.de

Unescape oder HTML dekodieren in Twig (PHP Templating)

Ich verwende twig 1.12.2. Mein Code generiert einige Elemente aus Code-Behind, wenn diese mit der neuesten Version von twig= gerendert werden, erhalten sie HTML- codiert

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

Dies wird dies ausgeben

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

Beim Debuggen und Anzeigen der Daten, bevor sie an twig gesendet werden, wird kein Escape-Befehl ausgeführt. Ich habe keine Alternative zu {{item.Link}} gefunden, um die Daten so wie sie sind zu rendern .

Vielen Dank

25
Eric Herlitz

Sie können den Filter raw verwenden, um twig raw html zu rendern

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

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

Seien Sie vorsichtig bei der Verwendung von | raw. Wenn Sie sagen, dass die Daten sicher sind, bedeutet dies, dass Sie ihnen zu 100% vertrauen.

Persönlich würde ich vorschlagen, einen benutzerdefinierten twig Filter zu verwenden:

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

Fügen Sie Ihrer services.yml Folgendes hinzu (oder übersetzen Sie alternativ in XML).

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

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

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

Wenn Sie Drupal 8 verwenden und keiner von raw oder autoscape funktioniert, kann dies an der Variablen liegen, die Sie drucken möchten, wenn es sich um ein Rendering handelt Array mit einer Vorlage, die eine sichere Ausgabe enthält (z. B. ein hl2br Filter).

In diesem Fall müssten Sie auf den Wert über das Render-Array zugreifen und ihn filtern, zum Beispiel:

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