Элементы HTML
Класс Nette\Utils\Html – это помощник для генерации HTML-кода, который не допускает уязвимости Cross Site Scripting (XSS).
Принцип его работы заключается в том, что его объекты – это элементы HTML, которым мы задаем параметры и позволяем их отрисовывать:
Установка:
Во всех примерах предполагается, что псевдоним уже создан:
Создание элемента HTML
Создайте элемент, используя метод Html::el()
:
Помимо имени, вы можете указать другие атрибуты в синтаксисе HTML:
Или передайте их как ассоциативное поле со вторым параметром:
Изменение и возвращение имени элемента:
Атрибуты HTML
Существует три способа изменения и чтения отдельных атрибутов HTML, и вы сами решаете, какой из них вам больше нравится. Первый – через собственность:
Второй способ – вызов методов, которые, в отличие от установки свойств, можно объединять в цепочки:
И третий способ – самый многословный:
Атрибуты могут быть установлены массово с помощью
addAttributes(array $attrs)
и удалены с помощью removeAttributes(array $attrNames)
.
Значение атрибута не обязательно должно быть строкой, вы также можете использовать логические значения для логических атрибутов:
Атрибут также может быть массивом значений, которые выводятся через пробелы, что полезно, например, для классов CSS:
Альтернативой является ассоциативный массив, где значения указывают, должен ли ключ быть выведен:
Стили CSS могут быть записаны в виде ассоциативных полей:
Сейчас мы использовали свойство, но то же самое можно написать, используя методы:
Или даже в самом кратком виде:
И последняя деталь: метод href()
может облегчить составление
параметров запроса в URL:
Атрибуты данных
Атрибуты данных имеют специальную поддержку. Поскольку их имена
содержат дефисы, доступ через свойства и методы не так элегантен,
поэтому существует метод data()
:
Если значением атрибута данных является массив, он автоматически сериализуется в JSON:
Содержание элемента
Установите внутреннее содержимое элемента с помощью методов
setHtml()
или setText()
. Используйте первый вариант только в том
случае, если вы знаете, что передаете в параметре надежно защищенную
строку HTML.
И наоборот, для получения внутреннего содержимого используйте
методы getHtml()
или getText()
. Последний метод удаляет HTML-теги из
вывода и преобразует HTML-сущности в символы.
Дочерние узлы
Внутри элемента также может быть массив дочерних узлов. Каждый из них
может быть либо строкой, либо другим элементом Html
. Они
вставляются с помощью addHtml()
или addText()
:
Другой способ создания и вставки нового узла Html
:
Вы можете работать с узлами так, как если бы они были массивами. То
есть, обращайтесь к каждому из них с помощью квадратных скобок,
считайте их с помощью count()
и выполняйте итерации:
Новый узел может быть вставлен в определенное место с помощью
insert(?int $index, $child, bool $replace = false)
. Если $replace = false
, то будет
вставлен элемент в позицию $index
и перемещены остальные. Если это
$index = null
, то элемент добавляется последним.
Все узлы извлекаются с помощью метода getChildren()
и удаляются с
помощью метода removeChildren()
.
Создание фрагмента документа
Если мы хотим работать с массивом узлов и нас не интересует элемент
обертки, мы можем создать фрагмент документа, передав null
вместо имени элемента:
Методы fromHtml()
и fromText()
предлагают более быстрый способ
создания фрагмента:
Генерирование вывода HTML
Самый простой способ вывода элемента HTML – использовать echo
или переписать объект на (string)
. Вы также можете выводить
открывающие или закрывающие теги и атрибуты отдельно:
Важной особенностью является автоматическая защита от межсайтового скриптинга (XSS).
Любые значения атрибутов или содержимое, вставленное через
setText()
или addText()
, надежно экранируется:
HTML ↔ преобразование текста
Для преобразования HTML в текст можно использовать статический метод
htmlToText()
:
HtmlStringable
Объект Nette\Utils\Html
реализует интерфейс Nette\HtmlStringable
,
который, например, Latte или Forms использует для различения объектов,
имеющих метод __toString()
, возвращающий HTML-код. Поэтому не будет
двойного экранирования, если, например, мы перечислим объект в шаблоне,
используя {$el}
.