Elementos HTML
A classe Nette\Utils\Html é uma ajuda para gerar código HTML que evita a vulnerabilidade de Cross Site Scripting (XSS).
Ela funciona de tal forma que seus objetos representam elementos HTML, nós definimos seus parâmetros e os deixamos renderizar:
Instalação:
Todos os exemplos assumem que a seguinte classe está definida:
Criação de um Elemento HTML
O elemento é criado usando o método Html::el()
:
Além do nome, você pode inserir outros atributos na sintaxe HTML:
Ou passe-as como uma matriz associativa para o segundo parâmetro:
Para mudar e devolver um nome de elemento:
Atributos HTML
Você pode definir e obter atributos HTML individuais de três maneiras, cabe a você quem você mais gosta. A primeira é através das propriedades:
A segunda maneira é chamar métodos que, em contraste com a definição de propriedades, podemos encadear juntos:
E a terceira maneira é a mais faladora:
Em grandes quantidades, os atributos podem ser definidos com addAttributes(array $attrs)
e excluídos com
removeAttributes(array $attrNames)
.
O valor de um atributo não tem que ser apenas uma string, também podem ser usados valores lógicos para atributos lógicos:
Um atributo também pode ser um conjunto de fichas, que são listadas separadas por espaços, o que é adequado para classes CSS, por exemplo:
Uma alternativa é uma matriz associativa, onde os valores dizem se a chave deve ser listada:
Os estilos CSS podem ser escritos sob a forma de matrizes associativas:
Agora usamos propriedades, mas o mesmo pode ser feito com os métodos:
Ou mesmo da maneira mais faladora:
Uma última coisa: o método href()
pode facilitar a composição de parâmetros de consulta em uma URL:
Atributos de dados
Os atributos de dados têm suporte especial. Como seus nomes contêm hífens, o acesso através de propriedades e métodos
não é tão elegante, por isso existe um método data()
:
Se o valor do atributo de dados for um array, ele é automaticamente serializado para o JSON:
Conteúdo do Elemento
O conteúdo interno do elemento é definido pelos métodos setHtml()
ou setText()
. Use o primeiro
somente se você souber que está passando com segurança uma string HTML segura no parâmetro.
Por outro lado, o conteúdo interno é obtido pelos métodos getHtml()
ou getText()
. O segundo
remove as tags da saída HTML e converte as entidades HTML em caracteres.
Nodos Infantis
O conteúdo interno de um elemento também pode ser um conjunto de crianças. Cada um deles pode ser um fio ou outro elemento
Html
. Eles são inseridos usando addHtml()
ou addText()
:
Outra maneira de criar e inserir um novo nódulo Html
:
Você pode trabalhar com nós como se fossem itens de matriz. Portanto, acesse os individuais usando colchetes, conte-os com
count()
e itere sobre eles:
Um novo nó pode ser inserido em uma posição específica usando
insert(?int $index, $child, bool $replace = false)
. Se $replace = false
, ele insere o elemento na
posição $index
e move os outros. Se $index = null
, ele anexará um elemento no final.
Todos os nós são devolvidos pelo método getChildren()
e removidos pelo método
removeChildren()
.
Criação de um fragmento de documento
Se você quiser trabalhar com um conjunto de nós e não estiver interessado no elemento de embalagem, você pode criar um
fragmento chamado documento passando null
em vez do nome do elemento:
Os métodos fromHtml()
e fromText()
oferecem uma maneira mais rápida de criar um fragmento:
Geração de saída HTML
A maneira mais fácil de gerar um elemento HTML é usar echo
ou lançar um objeto para (string)
.
Você também pode imprimir tags e atributos de abertura ou fechamento separadamente:
Uma característica importante é a proteção automática contra o Cross Site Scripting (XSS). Todos os valores de
atributos ou conteúdos inseridos usando setText()
ou addText()
escapam de forma confiável:
Conversão HTML ↔ Texto
Você pode usar o método estático htmlToText()
para converter HTML em texto:
HtmlStringable
O objeto Nette\Utils\Html
implementa a interface Nette\HtmlStringable
, que, por exemplo, Latte ou
formulários usam para distinguir objetos que têm um método __toString()
que retorna o código HTML. Assim, a
dupla fuga não ocorre se, por exemplo, imprimirmos o objeto no modelo usando {$el}
.