forked from nette/docs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhtml-elements.texy
181 lines (124 loc) · 4.76 KB
/
html-elements.texy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
HTML elementy
*************
.[perex]
Třída [Nette\Utils\Html |api:] je pomocník pro generování HTML kódu.
/--php
use Nette\Utils\Html;
$el = Html::el('img'); // vytvoří element <img>
$el->src = 'image.jpg'; // nastaví atribut src
echo $el; // vypíše <img src="image.jpg" />
echo $el->getName(); // vrací 'img', název elementu
echo $el->isEmpty(); // vrací TRUE, jelikož <img> je prázdný element
\--
Měnit a číst atributy HTML elementu je možné přes proměnné objektu. Zrušit je můžeme funkcí `unset` nebo přiřazením hodnoty `NULL`:
/--php
echo $el->src; // vypíše 'image.jpg'
unset($el->src); // nebo $el->src = NULL; - zruší atribut src
\--
Téhož lze dosáhnout i voláním metod. V takovém případě lze využít zřetězených volání (fluent interfaces):
/--php
// <img src="image.jpg" alt="photo" />
echo Html::el('img')->src('image.jpg')->alt('photo');
\--
Atributy lze také nastavit hromadně, dokonce přímo při vytváření elementu těmito způsoby:
/--php
$el = Html::el('input type=text class="red important"');
$el = Html::el('input', [
'type' => 'text',
'class' => ['red', 'important'],
]);
$el->addAttributes([ // hromadné nastavení dalších atributů
'value' => $val,
'required' => TRUE,
]);
\--
Důležitým rysem je automatická ochrana proti [Cross Site Scriptingu (XSS) |vulnerability-protection#toc-cross-site-scripting-xss]:
/--php
echo Html::el('input')->value('<script>alert()</script>');
// <input value="<script>alert()</script>" />
\--
Hodnotou atributu nemusí být jen řetězec, lze používat i logické hodnoty nebo pole.
/--php
$checkbox = Html::el('input')->type('checkbox');
$checkbox->checked = TRUE; // <input type="checkbox" checked="checked" />
$checkbox->checked = FALSE; // <input type="checkbox" />
// použití pole
$el->class[] = $active ? 'active' : NULL; // NULL se ignoruje
$el->class[] = 'top';
// alternativně $el->class['top'] = TRUE; nebo $el->class('top', TRUE);
$el->style['color'] = 'green'; // obdobně $el->style('color', 'green');
$el->style['display'] = 'block';
echo $el;
// <input class="active top" style="color: green; display: block" />
\--
Metoda `href()` umí usnadnit skládání URL:
/--php
echo Html::el('a')->href('index.php', [
'id' => 10,
'lang' => 'en',
]);
// <a href="index.php?id=10&lang=en"></a>
\--
V HTML 5 lze používat tzv. datové atributy pro uživatelská data:
/---html
<img src="img.jpg" data-max-size="500x300" />
\---
Obvykle pak hodnoty těchto atributů využívá JavaScript. A fungují ve všech prohlížečích.
Třída Html disponuje přímou podporou pro datové atributy z HTML5:
/--php
$el = Html::el('img');
$el->data['max-size'] = '500x300';
// nebo
$el->data('max-size', '500x300');
\--
Obsah elementů
--------------
Textový obsah elementu můžeme nastavit metodami `setText()` či `setHtml()` nebo přímo při vytváření elementu:
/--php
echo Html::el('a')->href('#')->setText('link<br>');
// <a href="#">link<br></a>
echo Html::el('a')->href('#')->setHtml('link<br>');
// <a href="#">link<br></a>
echo Html::el('strong', 'Nette');
// <strong>Nette</strong> odpovídá použití setText()
\--
Získat textový obsah elementu lze metodami `getText()` či `getHtml()`.
Obsahem však mohou být i další elementy:
/--php
$el = Html::el('div');
// vložíme do <div> nový element <strong>
$strong = $el->create('strong', 'Nette');
// nebo $el->create('strong')->setText('Nette')
// vložíme do <div> hotový Html object
$el->add( Html::el('br') ); // $el[] = Html::el('br');
echo $el; // <div><strong>Nette</strong><br /></div>
// vložíme do <div> textový uzel
$el->add('<i>Yes!</i>'); // na rozdíl od setHtml() nesmaže obsah elementu
$el->insert(0, Html::el('span')); // vloží prvek na první pozici
\--
Všechny prvky odstraní metoda `removeChildren()`.
S dětmi lze pracovat stejně, jako by se jednalo o pole. Včetně iterace:
/--php
echo $el[2]; // <br />
foreach ($el as $child) { ... }
echo count($el); // 4 - počet dětí
\--
Generování HTML výstupu
-----------------------
Nejjednodušším způsobem, jak vypsat HTML element, je použít `echo` nebo objekt přetypovat na řetězec operátorem `(string)`. Lze také samostatně vypsat otevírací nebo uzavírací značky:
/--php
$el = Html::el('div class=header');
echo $el; // <div class="header"></div>
$s = (string) $el; // vloží do $s řetězec '<div class="header"></div>'
echo $el->startTag(); // <div class="header">
echo $el->endTag(); // </div>
\--
Výstupní formát určuje statická proměnná `Html::$xhtml`. Výchozím nastavením je `FALSE`, tj. HTML výstup.
/--php
$el = Html::el('input')->disabled(TRUE);
echo $el; // <input disabled>
Html::$xhtml = TRUE;
echo $el; // <input disabled="disabled" />
\--
{{toc: title}}
{{composer: nette/utils}}