HTML elementy
Třída Nette\Utils\Html je pomocník pro generování HTML kódu, který nedovolí vznik zranitelnosti Cross Site Scripting (XSS).
Funguje tak, že jeho objekty představují HTML elementy, kterým nastavíme parametry a necháme je vykreslit:
Instalace:
Všechny příklady předpokládají vytvořený alias:
Vyvoření HTML elementu
Element vytvoříme metodou Html::el()
:
Kromě názvu můžete zadat i další atributy v HTML syntaxi:
Nebo je předat jako asociativní pole druhým parametrem:
Změna a vrácení názvu elementu:
HTML atributy
Jednotlivé HTML atributy můžeme měnit a číst třemi způsoby, záleží na vás, který se vám bude líbit víc. První z nich je skrze property:
Druhou cestou je volání metod, které oproti nastavování properties můžeme za sebe řetězit:
A třetí způsob je nejvíce upovídaný:
Hromadně lze atributy nastavit pomocí addAttributes(array $attrs)
a odstranit pomocí
removeAttributes(array $attrNames)
.
Hodnotou atributu nemusí být jen řetězec, lze používat i logické hodnoty pro logické atributy:
Atributem může být i pole hodnot, které se vypíší oddělené mezerami, což se hodí například pro CSS třídy:
Alternativou je asociativní pole, kde hodnoty říkají, zda má být klíč vypsán:
CSS styly lze zapisovat ve formě asociativních polí:
Nyní jsme používali property, ale totéž se dá zapsat pomocí metod:
Nebo i tím nejvíce upovídaným způsobem:
Ještě drobnost na závěr: metoda href()
umí usnadnit skládání query parametrů v URL:
Data attributy
Speciální podporu mají datové atributy. Protože jejich názvy obsahují pomlčky, není přístup přes property a metody
tak elegantní, proto existuje metoda data()
:
Pokud je hodnotou datového attributu pole, automaticky se serializuje do JSONu:
Obsah elementu
Vnitřní obsah elementu nastavíme metodami setHtml()
či setText()
. První z nich použijte jen
v případě, že víte, že v parametru předáváte spolehlivě bezpečný HTML řetězec.
A obráceně vnitřní obsah získáme metodami getHtml()
či getText()
. Druhá z nich odstraní
z výstupu HTML značky a HTML entity převede na znaky.
Podřízené uzly
Vnitřek elementu může být také pole podřízených (children) uzlů. Každý z nich může být buď řetězec, nebo
další Html
element. Vkládáme je pomocí addHtml()
či addText()
:
Další způsob pro vytvoření a vložení nového Html
uzlu:
S uzly lze pracovat stejně, jako by se jednalo o pole. Tedy přistupovat k jednotlivým z nich pomocí hranatých
závorek, spočítat je pomocí count()
a iterovat nad nimi:
Nový uzel lze na konkrétní místo vložit pomocí insert(?int $index, $child, bool $replace = false)
. Pokud je
$replace = false
, vloží prvek na pozici $index
a ostatní posune. Pokud je $index = null
,
přidá prvek nakonec.
Všechny uzly získáme metodou getChildren()
a odstraníme je metodou removeChildren()
.
Vytvoření document fragment
Pokud chceme pracovat s polem uzlů a nezajímá nás obalovací element, můžeme vytvořit tzv. document fragment
předáním null
místo jména elementu:
Rychlejší způsob vytvoření fragmentu nabízí metody fromHtml()
a fromText()
:
Generování HTML výstupu
Nejjednodušším způsobem, jak vypsat HTML element, je použít echo
nebo objekt přetypovat na
(string)
. Lze také samostatně vypsat otevírací nebo uzavírací značky a atributy:
Důležitým rysem je automatická ochrana proti Cross Site Scriptingu (XSS). Všechny hodnoty
atributů nebo obsah vložený přes setText()
či addText()
se spolehlivě escapuje:
Konverze HTML ↔ text
Pro převod HTML do textu můžete využít statickou metodu htmlToText()
:
HtmlStringable
Objekt Nette\Utils\Html
implementuje rozhraní Nette\HtmlStringable
, kterým například Latte nebo
formuláře rozlišují objekty, které mají metodu __toString()
vracející HTML kód. Takže nedojde k dvojímu
escapování, pokud třeba objekt vypíšeme v šabloně pomocí {$el}
.