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