Elementy HTML
Klasa Nette\Utils\Html jest pomocnikiem do generowania kodu HTML, który nie pozwala na wykorzystanie luk Cross Site Scripting (XSS).
Sposób, w jaki działa, polega na tym, że jego obiekty są elementami HTML, do których ustawiamy parametry i pozwalamy im renderować:
Instalacja:
Wszystkie przykłady zakładają, że alias został utworzony:
Tworzenie elementu HTML
Utwórz element za pomocą metody Html::el()
:
Oprócz nazwy można określić inne atrybuty w składni HTML:
Lub przekazać je jako pole asocjacyjne z drugim parametrem:
Zmień i zwróć nazwę elementu:
Atrybuty HTML
Istnieją trzy sposoby zmiany i odczytu poszczególnych atrybutów HTML, to od Ciebie zależy, który z nich bardziej Ci się podoba. Pierwszy z nich odbywa się za pośrednictwem nieruchomości:
Drugim sposobem jest wywołanie metod, które w przeciwieństwie do ustawiania właściwości można łączyć w łańcuchy:
A trzeci sposób jest najbardziej dosłowny:
Atrybuty mogą być ustawiane masowo za pomocą addAttributes(array $attrs)
i usuwane za pomocą
removeAttributes(array $attrNames)
.
Wartość atrybutu nie musi być ciągiem znaków, możesz również użyć wartości logicznych dla atrybutów logicznych:
Atrybut może być również tablicą wartości, które są wypisane oddzielone spacjami, co jest przydatne na przykład dla klas CSS:
Alternatywą jest tablica asocjacyjna, gdzie wartości mówią, czy klucz powinien być wyprowadzony:
Style CSS mogą być zapisane jako pola asocjacyjne:
Teraz użyliśmy właściwości, ale to samo można napisać używając metod:
Albo nawet w najbardziej dosadny sposób:
Jeden ostatni szczegół: metoda href()
może ułatwić komponowanie parametrów zapytania w adresach URL:
Atrybuty danych
Atrybuty danych mają specjalne wsparcie. Ponieważ ich nazwy zawierają myślniki, dostęp poprzez właściwości i metody
nie jest tak elegancki, więc istnieje metoda data()
:
Jeśli wartość atrybutu danych jest tablicą, jest ona automatycznie serializowana do JSON:
Zawartość elementu
Ustawia wewnętrzną zawartość elementu metodami setHtml()
lub setText()
. Użyj tego pierwszego
tylko wtedy, gdy wiesz, że przekazujesz niezawodnie bezpieczny ciąg HTML w parametrze.
I odwrotnie, użyj metod getHtml()
lub getText()
, aby uzyskać wewnętrzną zawartość. Ta ostatnia
metoda usuwa znaczniki HTML z wyjścia i konwertuje encje HTML na znaki.
Węzły dzieci
Wnętrze elementu może być również tablicą węzłów dziecięcych. Każdy z nich może być ciągiem znaków lub innym
elementem Html
. Wstawia się je za pomocą strony addHtml()
lub addText()
:
Inny sposób tworzenia i wstawiania nowego węzła Html
:
Możesz pracować z węzłami tak, jakby były tablicami. To znaczy, uzyskać dostęp do każdego z nich za pomocą nawiasów
kwadratowych, policzyć je za pomocą count()
i iterować nad nimi:
Nowy węzeł może być wstawiony w określonym miejscu za pomocą
insert(?int $index, $child, bool $replace = false)
. Jeśli $replace = false
, to wstawi element na
pozycji $index
i przesunie pozostałe. Jeśli jest to $index = null
, to dodaje element jako
ostatni.
Wszystkie węzły są pobierane za pomocą metody getChildren()
i usuwane za pomocą metody
removeChildren()
.
Tworzenie fragmentu dokumentu
Jeśli chcemy pracować z tablicą węzłów i nie interesuje nas element wrapper, możemy stworzyć fragment
dokumentu przekazując null
zamiast nazwy elementu:
Metody fromHtml()
i fromText()
oferują szybszy sposób tworzenia fragmentu:
Generowanie danych wyjściowych HTML
Najprostszym sposobem wyprowadzenia elementu HTML jest użycie echo
lub przepisanie obiektu na
(string)
. Można również wyprowadzić osobno znaczniki otwierające lub zamykające oraz atrybuty:
Ważną cechą jest automatyczna ochrona przed Cross
Site Scripting (XSS). Wszelkie wartości atrybutów lub treści wstawiane za pośrednictwem setText()
lub
addText()
są niezawodnie unikane:
Konwersja HTML ↔ tekst
Do konwersji HTML na tekst można użyć statycznej metody htmlToText()
:
HtmlStringable
Obiekt Nette\Utils\Html
implementuje interfejs Nette\HtmlStringable
, który jest używany np. przez
Latte lub formularze do rozróżniania obiektów posiadających metodę __toString()
zwracającą kod HTML. Tak więc
nie będzie podwójnego escapingu, jeśli na przykład obiekt zostanie wypisany w szablonie za pomocą {$el}
.