Elementi HTML
La classe Nette\Utils\Html è un aiuto per la generazione di codice HTML che previene le vulnerabilità Cross Site Scripting (XSS).
Funziona in modo tale che i suoi oggetti rappresentano elementi HTML, si impostano i loro parametri e si lascia che vengano resi:
Installazione:
Tutti gli esempi presuppongono che sia definito il seguente alias di classe:
Creazione di un elemento HTML
L'elemento viene creato con il metodo Html::el()
:
Oltre al nome, è possibile inserire altri attributi nella sintassi HTML:
Oppure passarli come array associativo al secondo parametro:
Per modificare e restituire il nome di un elemento:
Attributi HTML
È possibile impostare e ottenere i singoli attributi HTML in tre modi, a seconda di quello che si preferisce. Il primo è attraverso le proprietà:
Il secondo modo è quello di chiamare metodi che, a differenza dell'impostazione delle proprietà, possono essere concatenati tra loro:
E il terzo modo è il più loquace:
In blocco, gli attributi possono essere impostati con addAttributes(array $attrs)
e cancellati con
removeAttributes(array $attrNames)
.
Il valore di un attributo non deve essere necessariamente una stringa, ma si possono usare anche valori logici per gli attributi logici:
Un attributo può anche essere un array di token, separati da spazi, adatto per esempio alle classi CSS:
Un'alternativa è un array associativo, in cui i valori dicono se la chiave deve essere elencata:
Gli stili CSS possono essere scritti sotto forma di array associativi:
Abbiamo utilizzato le proprietà, ma la stessa cosa può essere fatta utilizzando i metodi:
O anche nel modo più loquace:
Un'ultima cosa: il metodo href()
può facilitare la composizione dei parametri di query in un URL:
Attributi dei dati
Gli attributi dei dati hanno un supporto speciale. Poiché i loro nomi contengono dei trattini, l'accesso tramite proprietà e
metodi non è molto elegante, quindi esiste un metodo data()
:
Se il valore dell'attributo dati è un array, viene automaticamente serializzato in JSON:
Contenuto dell'elemento
Il contenuto interno dell'elemento viene impostato dai metodi setHtml()
o setText()
. Usare il primo
solo se si sa che si sta passando in modo affidabile una stringa HTML sicura nel parametro.
Al contrario, il contenuto interno si ottiene con i metodi getHtml()
o getText()
. Il secondo rimuove
i tag dall'output HTML e converte le entità HTML in caratteri.
Nodi figli
Il contenuto interno di un elemento può anche essere un array di figli. Ognuno di essi può essere una stringa o un altro
elemento Html
. Vengono inseriti usando addHtml()
o addText()
:
Un altro modo per creare e inserire un nuovo nodo Html
:
È possibile lavorare con i nodi come se fossero elementi di un array. Si può quindi accedere ai singoli nodi usando le
parentesi quadre, contarli con count()
e iterare su di essi:
Un nuovo nodo può essere inserito in una posizione specifica usando
insert(?int $index, $child, bool $replace = false)
. Se $replace = false
, inserisce l'elemento nella
posizione $index
e sposta gli altri. Se $index = null
, aggiunge un elemento alla fine.
Tutti i nodi vengono restituiti dal metodo getChildren()
e rimossi dal metodo removeChildren()
.
Creare un frammento di documento
Se si vuole lavorare con una matrice di nodi e non si è interessati all'elemento che li avvolge, si può creare un cosiddetto
frammento di documento passando null
al posto del nome dell'elemento:
I metodi fromHtml()
e fromText()
offrono un modo più rapido per creare un frammento:
Generare l'output HTML
Il modo più semplice per generare un elemento HTML è usare echo
o lanciare un oggetto in (string)
.
È anche possibile stampare separatamente i tag e gli attributi di apertura o chiusura:
Una caratteristica importante è la protezione automatica contro il Cross Site Scripting (XSS). Tutti i valori degli
attributi o i contenuti inseriti con setText()
o addText()
vengono evasi in modo affidabile:
Conversione HTML ↔ Testo
È possibile utilizzare il metodo statico htmlToText()
per convertire l'HTML in testo:
HtmlStringable
L'oggetto Nette\Utils\Html
implementa l'interfaccia Nette\HtmlStringable
, che, ad esempio, Latte
o i form utilizzano per distinguere gli oggetti che hanno un metodo __toString()
che restituisce codice HTML.
Quindi il doppio escape non si verifica se, ad esempio, si stampa l'oggetto nel modello usando {$el}
.