Елементи 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}
.