-
-
Notifications
You must be signed in to change notification settings - Fork 277
Expand file tree
/
Copy pathhtml-elements.texy
More file actions
316 lines (222 loc) · 8.73 KB
/
html-elements.texy
File metadata and controls
316 lines (222 loc) · 8.73 KB
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
Elemente HTML
*************
.[perex]
Clasa [api:Nette\Utils\Html] este un ajutor pentru generarea codului HTML care previne vulnerabilitatea Cross Site Scripting (XSS).
Funcționează astfel: obiectele sale reprezintă elemente HTML cărora le setăm atributele și apoi le randăm:
```php
$el = Html::el('img'); // creează elementul <img>
$el->src = 'image.jpg'; // setează atributul src
echo $el; // afișează '<img src="image.jpg">'
```
Instalare:
```shell
composer require nette/utils
```
Toate exemplele presupun că a fost creat un alias:
```php
use Nette\Utils\Html;
```
Crearea unui element HTML
=========================
Elementul se creează folosind metoda `Html::el()`:
```php
$el = Html::el('img'); // creează elementul <img>
```
Pe lângă nume, puteți specifica și alte atribute folosind sintaxa HTML:
```php
$el = Html::el('input type=text class="red important"');
```
Sau le puteți transmite ca array asociativ în al doilea parametru:
```php
$el = Html::el('input', [
'type' => 'text',
'class' => 'important',
]);
```
Modificarea și obținerea numelui elementului:
```php
$el->setName('img');
$el->getName(); // 'img'
$el->isEmpty(); // true, deoarece <img> este un element gol
```
Atribute HTML
=============
Atributele HTML individuale pot fi setate și citite în trei moduri; depinde de dvs. care preferați. Primul mod este prin proprietăți:
```php
$el->src = 'image.jpg'; // setează atributul src
echo $el->src; // 'image.jpg'
unset($el->src); // elimină atributul
// sau $el->src = null;
```
Al doilea mod este prin apelarea metodelor, care, spre deosebire de setarea proprietăților, pot fi înlănțuite:
```php
$el = Html::el('img')->src('image.jpg')->alt('photo');
// <img src="image.jpg" alt="photo">
$el->alt(null); // eliminarea atributului
```
Și al treilea mod este cel mai verbos:
```php
$el = Html::el('img')
->setAttribute('src', 'image.jpg')
->setAttribute('alt', 'photo');
echo $el->getAttribute('src'); // 'image.jpg'
$el->removeAttribute('alt');
```
Atributele pot fi setate în bloc folosind `addAttributes(array $attrs)` și eliminate folosind `removeAttributes(array $attrNames)`.
Valoarea atributului nu trebuie să fie doar un șir; se pot folosi și valori booleene pentru atributele booleene:
```php
$checkbox = Html::el('input')->type('checkbox');
$checkbox->checked = true; // <input type="checkbox" checked>
$checkbox->checked = false; // <input type="checkbox">
```
Atributul poate fi și un array de valori, care se afișează separate prin spații, util, de exemplu, pentru clasele CSS:
```php
$el = Html::el('input');
$el->class[] = 'active';
$el->class[] = null; // null este ignorat
$el->class[] = 'top';
echo $el; // '<input class="active top">'
```
O alternativă este un array asociativ, unde valorile indică dacă cheia trebuie afișată:
```php
$el = Html::el('input');
$el->class['active'] = true;
$el->class['top'] = false;
echo $el; // '<input class="active">'
```
Stilurile CSS pot fi scrise sub formă de array-uri asociative:
```php
$el = Html::el('input');
$el->style['color'] = 'green';
$el->style['display'] = 'block';
echo $el; // '<input style="color: green; display: block">'
```
Am folosit proprietăți, dar același lucru se poate scrie folosind metode:
```php
$el = Html::el('input');
$el->style('color', 'green');
$el->style('display', 'block');
echo $el; // '<input style="color: green; display: block">'
```
Sau chiar în modul cel mai verbos:
```php
$el = Html::el('input');
$el->appendAttribute('style', 'color', 'green');
$el->appendAttribute('style', 'display', 'block');
echo $el; // '<input style="color: green; display: block">'
```
Un mic detaliu la final: metoda `href()` poate facilita compunerea parametrilor query în URL:
```php
echo Html::el('a')->href('index.php', [
'id' => 10,
'lang' => 'en',
]);
// '<a href="index.php?id=10&lang=en"></a>'
```
Atribute data-*
---------------
Atributele data-* (data attributes) au un suport special. Deoarece numele lor conțin cratime, accesul prin proprietăți și metode nu este la fel de elegant, de aceea există metoda `data()`:
```php
$el = Html::el('input');
$el->{'data-max-size'} = '500x300'; // nu este la fel de elegant
$el->data('max-size', '500x300'); // este elegant
echo $el; // '<input data-max-size="500x300">'
```
Dacă valoarea unui atribut data-* este un array, acesta se serializează automat în JSON:
```php
$el = Html::el('input');
$el->data('items', [1, 2, 3]);
echo $el; // '<input data-items="[1,2,3]">'
```
Conținutul elementului
======================
Conținutul intern al elementului se setează cu metodele `setHtml()` sau `setText()`. Folosiți `setHtml()` doar dacă sunteți sigur că parametrul conține un șir HTML sigur.
```php
echo Html::el('span')->setHtml('hello<br>');
// '<span>hello<br></span>'
echo Html::el('span')->setText('10 < 20');
// '<span>10 < 20</span>'
```
Invers, conținutul intern se obține cu metodele `getHtml()` sau `getText()`. `getText()` elimină tag-urile HTML din conținut și convertește entitățile HTML în caractere.
```php
echo $el->getHtml(); // '10 < 20'
echo $el->getText(); // '10 < 20'
```
Noduri copil
------------
Conținutul unui element poate fi, de asemenea, un array de noduri copil (children). Fiecare nod poate fi fie un șir, fie un alt element `Html`. Le adăugăm folosind `addHtml()` sau `addText()`:
```php
$el = Html::el('span')
->addHtml('hello<br>')
->addText('10 < 20')
->addHtml( Html::el('br') );
// <span>hello<br>10 < 20<br></span>
```
Altă modalitate de a crea și insera un nou nod `Html`:
```php
$ul = Html::el('ul');
$ul->create('li', ['class' => 'first'])
->setText('primul');
// <ul><li class="first">primul</li></ul>
```
Cu nodurile se poate lucra la fel ca și cu un array. Adică, accesarea individuală a acestora folosind paranteze drepte, numărarea lor folosind `count()` și iterarea peste ele:
```php
$el = Html::el('div');
$el[] = '<b>hello</b>';
$el[] = Html::el('span');
echo $el[1]; // '<span></span>'
foreach ($el as $child) { /* ... */ }
echo count($el); // 2
```
Un nod nou poate fi inserat într-o poziție specifică folosind `insert(?int $index, $child, bool $replace = false)`. Dacă `$replace` este `false`, inserează elementul la poziția `$index` și le deplasează pe celelalte. Dacă `$index` este `null`, adaugă elementul la sfârșit.
```php
// inserează elementul la prima poziție și le deplasează pe celelalte
$el->insert(0, Html::el('span'));
```
Toate nodurile copil se obțin cu metoda `getChildren()` și se elimină cu metoda `removeChildren()`.
Crearea unui fragment de document
---------------------------------
Dacă dorim să lucrăm cu un array de noduri fără un element înconjurător, putem crea un *fragment de document* transmițând `null` în loc de numele elementului:
```php
$el = Html::el(null)
->addHtml('hello<br>')
->addText('10 < 20')
->addHtml( Html::el('br') );
// hello<br>10 < 20<br>
```
Metodele `fromHtml()` și `fromText()` oferă o modalitate mai rapidă de a crea un fragment:
```php
$el = Html::fromHtml('hello<br>');
echo $el; // 'hello<br>'
$el = Html::fromText('10 < 20');
echo $el; // '10 < 20'
```
Generarea ieșirii HTML
======================
Cel mai simplu mod de a afișa un element HTML este să folosiți `echo` sau să convertiți obiectul la `(string)`. Se pot, de asemenea, afișa separat tag-urile de deschidere sau închidere și atributele:
```php
$el = Html::el('div class=header')->setText('hello');
echo $el; // '<div class="header">hello</div>'
$s = (string) $el; // '<div class="header">hello</div>'
$s = $el->toHtml(); // '<div class="header">hello</div>'
$s = $el->toText(); // 'hello'
echo $el->startTag(); // '<div class="header">'
echo $el->endTag(); // '</div>'
echo $el->attributes(); // 'class="header"'
```
O caracteristică importantă este protecția automată împotriva [Cross Site Scripting (XSS) |nette:glossary#Cross-Site Scripting XSS]. Toate valorile atributelor sau conținutul inserat prin `setText()` sau `addText()` sunt escapate în mod fiabil:
```php
echo Html::el('div')
->title('" onmouseover="bad()')
->setText('<script>bad()</script>');
// <div title='" onmouseover="bad()'><script>bad()</script></div>
```
Conversie HTML ↔ text
=====================
Pentru a converti HTML în text, puteți utiliza metoda statică `htmlToText()`:
```php
echo Html::htmlToText('<span>One & Two</span>'); // 'One & Two'
```
HtmlStringable
==============
Obiectul `Nette\Utils\Html` implementează interfața `Nette\HtmlStringable`. Latte și formularele folosesc această interfață pentru a distinge obiectele care au o metodă `__toString()` ce returnează cod HTML. Astfel, nu se produce dublă escapare dacă, de exemplu, afișăm obiectul într-un șablon folosind `{$el}`.