Elementos HTML
La clase Nette\Utils\Html es una ayuda para generar código HTML que previene la vulnerabilidad Cross Site Scripting (XSS).
Funciona de tal forma que sus objetos representan elementos HTML, establecemos sus parámetros y dejamos que se rendericen:
Instalación:
Todos los ejemplos asumen que el siguiente alias de clase está definido:
Creación de un elemento HTML
El elemento se crea utilizando el método Html::el()
:
Además del nombre, puede introducir otros atributos en la sintaxis HTML:
O pasarlos como un array asociativo al segundo parámetro:
Para cambiar y devolver el nombre de un elemento:
Atributos HTML
Puedes establecer y obtener atributos HTML individuales de tres maneras, depende de quién te guste más. La primera es a través de las propiedades:
La segunda forma es llamar a métodos que, a diferencia de establecer propiedades, podemos encadenar:
Y la tercera forma es la más locuaz:
En bloque, los atributos pueden fijarse con addAttributes(array $attrs)
y borrarse con
removeAttributes(array $attrNames)
.
El valor de un atributo no tiene por qué ser sólo una cadena, también pueden utilizarse valores lógicos para atributos lógicos:
Un atributo también puede ser una matriz de tokens, que se enumeran separados por espacios, lo que es adecuado para las clases CSS, por ejemplo:
Una alternativa es un array asociativo, donde los valores dicen si la clave debe ser listada:
Los estilos CSS pueden escribirse en forma de matrices asociativas:
Ahora hemos utilizado propiedades, pero se puede hacer lo mismo utilizando los métodos:
O incluso de la forma más locuaz:
Una última cosa: el método href()
puede facilitar la composición de los parámetros de consulta en
una URL:
Atributos de datos
Los atributos de datos tienen un soporte especial. Debido a que sus nombres contienen guiones, el acceso a través de
propiedades y métodos no es tan elegante, por lo que existe un método data()
:
Si el valor del atributo de datos es un array, se serializa automáticamente a JSON:
Contenido del elemento
El contenido interno del elemento se establece mediante los métodos setHtml()
o setText()
. Utilice
el primero sólo si sabe que está pasando de forma fiable una cadena HTML segura en el parámetro.
Por el contrario, el contenido interno se obtiene mediante los métodos getHtml()
o getText()
. El
segundo elimina las etiquetas de la salida HTML y convierte las entidades HTML en caracteres.
Nodos hijos
El contenido interno de un elemento también puede ser un array de hijos. Cada uno de ellos puede ser una cadena u otro
elemento de Html
. Se insertan utilizando addHtml()
o addText()
:
Otra forma de crear e insertar un nuevo nodo Html
:
Puedes trabajar con nodos como si fueran elementos de un array. Así que accede a los individuales usando corchetes, cuéntalos
con count()
e itera sobre ellos:
Se puede insertar un nuevo nodo en una posición específica utilizando
insert(?int $index, $child, bool $replace = false)
. Si $replace = false
, inserta el elemento en la
posición $index
y desplaza los demás. Si $index = null
, añadirá un elemento al final.
Todos los nodos son devueltos por el método getChildren()
y eliminados por el método
removeChildren()
.
Creación de un fragmento de documento
Si desea trabajar con una matriz de nodos y no está interesado en el elemento envolvente, puede crear un llamado fragmento
de documento pasando null
en lugar del nombre del elemento:
Los métodos fromHtml()
y fromText()
ofrecen una forma más rápida de crear un fragmento:
Generar salida HTML
La forma más sencilla de generar un elemento HTML es utilizar echo
o lanzar un objeto a (string)
.
También puede imprimir etiquetas de apertura o cierre y atributos por separado:
Una característica importante es la protección automática contra Cross Site Scripting (XSS). Todos los valores de
atributos o contenidos insertados mediante setText()
o addText()
se escapan de forma fiable:
Conversión HTML ↔ Texto
Puede utilizar el método estático htmlToText()
para convertir HTML en texto:
HtmlStringable
El objeto Nette\Utils\Html
implementa la interfaz Nette\HtmlStringable
, que, por ejemplo, Latte
o forms utilizan para distinguir los objetos que tienen un método __toString()
que devuelve código HTML. Así, el
doble escape no se produce si, por ejemplo, imprimimos el objeto en la plantilla utilizando {$el}
.