HTML-Elemente
Die Klasse Nette\Utils\Html ist ein Hilfsmittel zur Generierung von HTML-Code, der Cross Site Scripting (XSS)-Schwachstellen verhindert.
Sie funktioniert so, dass ihre Objekte HTML-Elemente darstellen, wir setzen ihre Parameter und lassen sie rendern:
Die Installation:
Alle Beispiele gehen davon aus, dass der folgende Klassenalias definiert ist:
Ein HTML-Element erstellen
Das Element wird mit der Methode Html::el()
erstellt:
Neben dem Namen können Sie weitere Attribute in der HTML-Syntax angeben:
Oder Sie übergeben sie als assoziatives Array an den zweiten Parameter:
Um einen Elementnamen zu ändern und zurückzugeben:
HTML-Attribute
Sie können einzelne HTML-Attribute auf drei Arten setzen und abrufen, es bleibt Ihnen überlassen, welche Ihnen besser gefällt. Die erste ist über die Eigenschaften:
Der zweite Weg ist der Aufruf von Methoden, die wir im Gegensatz zum Setzen von Eigenschaften aneinanderreihen können:
Und der dritte Weg ist der gesprächigste:
In der Masse können Attribute mit addAttributes(array $attrs)
gesetzt und mit
removeAttributes(array $attrNames)
gelöscht werden.
Der Wert eines Attributs muss nicht nur ein String sein, es können auch logische Werte für logische Attribute verwendet werden:
Ein Attribut kann auch ein Array von Token sein, die durch Leerzeichen getrennt aufgelistet werden, was sich z.B. für CSS-Klassen eignet:
Eine Alternative ist ein assoziatives Array, bei dem die Werte angeben, ob der Schlüssel aufgeführt werden soll:
CSS-Stile können in Form von assoziativen Arrays geschrieben werden:
Wir haben jetzt Eigenschaften verwendet, aber das Gleiche lässt sich auch mit den Methoden machen:
Oder sogar auf die gesprächigste Art und Weise:
Eine letzte Sache: Die Methode href()
kann die Zusammenstellung von Abfrageparametern in einer URL
erleichtern:
Daten-Attribute
Datenattribute haben eine besondere Unterstützung. Da ihre Namen Bindestriche enthalten, ist der Zugriff über Eigenschaften
und Methoden nicht so elegant, daher gibt es eine Methode data()
:
Wenn der Wert des Datenattributs ein Array ist, wird es automatisch in JSON serialisiert:
Element Inhalt
Der innere Inhalt des Elements wird mit den Methoden setHtml()
oder setText()
festgelegt. Verwenden
Sie die erste Methode nur, wenn Sie wissen, dass Sie zuverlässig einen sicheren HTML-String im Parameter übergeben.
Umgekehrt wird der innere Inhalt mit den Methoden getHtml()
oder getText()
ermittelt. Die zweite
Methode entfernt Tags aus der HTML-Ausgabe und wandelt die HTML-Entities in Zeichen um.
Kind-Knoten
Der innere Inhalt eines Elements kann auch ein Array von Kindern sein. Jedes dieser Elemente kann entweder eine Zeichenkette
oder ein anderes Html
Element sein. Sie werden mit addHtml()
oder addText()
eingefügt:
Eine andere Möglichkeit, einen neuen Html
Knoten zu erstellen und einzufügen:
Sie können mit Knoten arbeiten, als wären sie Array-Elemente. Greifen Sie also mit eckigen Klammern auf die einzelnen Knoten
zu, zählen Sie sie mit count()
und iterieren Sie über sie:
Mit insert(?int $index, $child, bool $replace = false)
kann ein neuer Knoten an einer bestimmten Position
eingefügt werden. Wenn $replace = false
, wird das Element an der Position $index
eingefügt und die
anderen verschoben. Wenn $index = null
, wird ein Element am Ende angehängt.
Alle Knoten werden von der Methode getChildren()
zurückgegeben und von der Methode removeChildren()
entfernt.
Erstellen eines Dokumentfragments
Wenn Sie mit einem Array von Knoten arbeiten wollen und nicht an dem umhüllenden Element interessiert sind, können Sie ein
sogenanntes Dokumentenfragment erstellen, indem Sie null
anstelle des Elementnamens übergeben:
Die Methoden fromHtml()
und fromText()
bieten eine schnellere Möglichkeit, ein Fragment zu
erstellen:
HTML-Ausgabe generieren
Der einfachste Weg, ein HTML-Element zu erzeugen, ist die Verwendung von echo
oder die Umwandlung eines Objekts in
(string)
. Sie können auch öffnende oder schließende Tags und Attribute separat drucken:
Eine wichtige Funktion ist der automatische Schutz gegen Cross Site Scripting (XSS). Alle Attributwerte oder
Inhalte, die mit setText()
oder addText()
eingefügt werden, werden zuverlässig escaped:
Konvertierung HTML ↔ Text
Sie können die statische Methode htmlToText()
verwenden, um HTML in Text umzuwandeln:
HtmlStringable
Das Objekt Nette\Utils\Html
implementiert die Schnittstelle Nette\HtmlStringable
, die z.B. von Latte
oder Formularen verwendet wird, um Objekte zu unterscheiden, die eine Methode __toString()
haben, die HTML-Code
zurückgibt. Das doppelte Escaping tritt also nicht auf, wenn wir z.B. das Objekt in der Vorlage mit {$el}
ausgeben.