2016-04-22 7 views
2

einen Zweig Makro auf sicheren Inhalt Verwendung scheint die sicheren FlaggenZweig sicher html funktioniert nicht innerhalb Makro

{% macro identity(value) %} 
    {{ value }} 
{% endmacro %} 
{{ "<br>"| raw }} 
{{ _self.identity( "<br>"| raw) }} 
{% autoescape false %} 
    {{ _self.identity( "<br>"| raw) }} 
{% endautoescape %} 

Der obigen Code zeigt nur 2 <br> zu entfernen. Gibt es eine Möglichkeit, das Ausbrechen zu deaktivieren oder meinen Inhalt als sicher zu markieren, ohne mein Zweigmakro zu bearbeiten?

+1

Vielleicht wollten Sie '_self.identity ("
") schreiben roh, wenn Sie das rohe Ergebnis von der Funktion wünschen. –

+0

Es funktioniert nicht. Ich denke, das liegt daran, dass ich im Filter "{{}}' habe, was äquivalent zum Aufrufen des Escape-Filters ist:
| e'. Meine einzige Problemumgehung besteht darin, einen rohen Filter in alle meine Makros einzufügen und manuell zu entkommen, wenn ich es brauche. '' '{% Makroidentität (Wert)%} {{Wert | roh}} {% endmacro%} {{self.identity (no_safe_content) | e}} '' ' – Jerome

+0

Ja, es funktioniert nur mit' {{value | raw}} '. Es sieht so aus, als ob '{{value}}' die HTML-Tags ausblendet. Der Aufruf von '{% autodescape false%}' ändert das Ergebnis nicht, da die HTML-Tags bereits in HTML-Entities umgewandelt wurden. –

Antwort

0

Sie sind in der Tat richtig, dass Sie den rohen Filter in das Makro einfügen müssen, um zu verhindern, dass die Tags innerhalb des Makros ihren Eingaben entgehen, und dies wäre, zumindest meiner Meinung nach, das erwartete Verhalten.

In Twig sind Makros keine Funktion oder Filter, sie sind einfach Abkürzungen, die Sie davon abhalten, Standard-Tags und -Code zu wiederholen. Es hilft, wenn Sie erstellen und verwenden Sie ein Makro, zu denken, den gesamten Code jedes Mal, wenn Sie es verwenden, dh

Anstatt denken Sie an Ihr Makro als Anruf {{ _self.identity("<br>"| raw) }} eigentlich denken, dass was Sie schreiben ist {{ {{ "<br>"| raw }} }} weil Sie übergeben die Ausgabe der Eingabe des Makros als Literal, nicht den Ausdruck, den Sie geschrieben haben.

Wenn Sie möchten, dass Ihre Makros mit der bereitgestellten Eingabe als Vorlage arbeiten und nicht wie vorgesehen auf der Ausgabe von dem, was Sie übergeben, arbeiten, können Sie die Funktion template_from_string aktivieren.

Verwandte Themen