/
syntax.texy
270 lines (178 loc) · 13.2 KB
/
syntax.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
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
Синтаксис
*********
.[perex]
Синтаксис Latte народився з практичних потреб веб-дизайнерів. Ми шукали найзручніший синтаксис, за допомогою якого можна елегантно писати конструкції, які в інших випадках являють собою справжню проблему.
Водночас усі вирази написані точно так само, як у PHP, тому вам не доведеться вивчати нову мову. Ви просто використовуєте те, що вже знаєте.
Нижче наведено мінімальний шаблон, що ілюструє кілька базових елементів: теги, n:attributes, коментарі та фільтри.
```latte
{* це коментар *}
<ul n:if="$items"> {* n:if is n:atribut *}
{foreach $items as $item} {* тег, що представляє цикл foreach *}
<li>{$item|capitalize}</li> {* тег, що виводить змінну з фільтром *}
{/foreach} {* кінець циклу *}
</ul>
```
Давайте докладніше розглянемо ці важливі елементи і те, як вони можуть допомогти вам створити неймовірний шаблон.
Теги .[#toc-tags]
=================
Шаблон містить теги, які керують логікою шаблону (наприклад, цикли *foreach*) або вихідними виразами. Для обох випадків використовується один роздільник `{ ... }`, тому вам не потрібно думати про те, який роздільник використовувати в тій чи іншій ситуації, як в інших системах.
Якщо за символом `{` слідує лапка або пробіл, Latte не вважає його початком тега, тому ви можете без проблем використовувати у своїх шаблонах конструкції JavaScript, JSON або правила CSS.
Дивіться [огляд усіх тегів |tags]. Крім того, ви можете створювати [власні теги |extending-latte#Tags].
Latte розуміє PHP .[#toc-latte-understands-php]
===============================================
Усередині тегів можна використовувати вирази PHP, які ви добре знаєте:
- змінні
- рядки (включно з HEREDOC і NOWDOC), масиви, числа тощо.
- [оператори |https://www.php.net/manual/en/language.operators.php]
- виклики функцій і методів (які можуть бути обмежені [пісочницею |sandbox])
- [відповідність |https://www.php.net/manual/en/control-structures.match.php]
- [анонімні функції |https://www.php.net/manual/en/functions.arrow.php]
- [зворотні виклики |https://www.php.net/manual/en/functions.first_class_callable_syntax.php]
- багаторядкові коментарі `/* ... */`
- і т.д.
Крім того, Latte додає кілька [приємних розширень |#Syntactic-Sugar] до синтаксису PHP.
n:attributes .[#toc-n-attributes]
=================================
Кожен парний тег, наприклад `{if} … {/if}`, що працює з одним елементом HTML, може бути записаний у нотації [n:attribute |#n:attribute]. Наприклад, `{foreach}` у наведеному вище прикладі можна записати і так:
```latte
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
```
Функціональність тоді відповідає елементу HTML, у якому вона записана:
```latte
{var $items = ['I', '♥', 'Latte']}
<p n:foreach="$items as $item">{$item}</p>
```
Prints:
```latte
<p>I</p>
<p>♥</p>
<p>Latte</p>
```
Використовуючи префікс `inner-`, ми можемо змінити поведінку так, щоб функціональність застосовувалася тільки до тіла елемента:
```latte
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
```
Відбитки:
```latte
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Latte</p>
<hr>
</div>
```
Або за допомогою префікса `tag-` функціональність застосовується тільки до HTML-тегів:
```latte
<p><a href={$url} n:tag-if="$url">Title</a></p>
```
Залежно від значення змінної `$url` буде виведено таке:
```latte
// when $url is empty
<p>Title</p>
// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>
```
Однак n:attributes - це не тільки скорочення для парних тегів, є й деякі чисті n:attributes, наприклад, найкращий друг кодера [n:class |tags#n-class].
Фільтри .[#toc-filters]
=======================
Див. короткий опис [стандартних фільтрів |filters].
Latte дозволяє викликати фільтри за допомогою знака труби (пробіл перед фільтром допускається):
```latte
<h1>{$heading|upper}</h1>
```
Фільтри можуть бути з'єднані в ланцюжок, у цьому разі вони застосовуються в порядку зліва направо:
```latte
<h1>{$heading|lower|capitalize}</h1>
```
Параметри поміщаються після імені фільтра через двокрапку або кому:
```latte
<h1>{$heading|truncate:20,''}</h1>
```
Фільтри можуть бути застосовані до виразу:
```latte
{var $name = ($title|upper) . ($subtitle|lower)}
```
На блоці:
```latte
<h1>{block |lower}{$heading}{/block}</h1>
```
Або безпосередньо на значенні (у поєднанні з [`{=expr}` | https://latte.nette.org/uk/tags#printing] тег):
```latte
<h1>{=' Hello world '|trim}<h1>
```
Динамічні теги HTML .[#toc-dynamic-html-tags]
=============================================
Latte підтримує динамічні HTML-теги, які корисні, коли вам потрібна гнучкість у назвах тегів:
```latte
<h{$level}>Heading</h{$level}>
```
Наприклад, код вище може згенерувати `<h1>Heading</h1>` або `<h2>Heading</h2>` в залежності від значення змінної `$level`. Динамічні HTML-теги в Latte завжди повинні бути парними. Їх альтернативою є [n:tag |tags#n:tag].
Оскільки Latte є безпечною системою шаблонів, вона перевіряє, що результуюче ім'я тегу є дійсним і не містить небажаних або шкідливих значень. Вона також гарантує, що ім'я кінцевого тегу завжди збігається з ім'ям початкового тегу.
Коментарі .[#toc-comments]
==========================
Коментарі пишуться таким чином і не потрапляють у виведення:
```latte
{* це коментар у Latte *}
```
Коментарі PHP працюють усередині тегів:
```latte
{include 'file.info', /* value: 123 */}
```
Синтаксичний цукор .[#toc-syntactic-sugar]
==========================================
Рядки без лапок .[#toc-strings-without-quotation-marks]
-------------------------------------------------------
Для простих рядків лапки можна не ставити:
```latte
as in PHP: {var $arr = ['hello', 'btn--default', '€']}
abbreviated: {var $arr = [hello, btn--default, €]}
```
Прості рядки - це рядки, які складаються виключно з літер, цифр, підкреслень, дефісів і крапок. Вони не повинні починатися з цифри і не повинні починатися або закінчуватися дефісом.
Він не повинен складатися тільки із великих літер і знаків підкреслення, тому що тоді він вважається константою (наприклад, `PHP_VERSION`).
І він не повинен перетинатися з ключовими словами `and`, `array`, `clone`, `default`, `false`, `in`, `instanceof`, `new`, `null`, `or`, `return`, `true`, `xor`.
Короткий тернарний оператор .[#toc-short-ternary-operator]
----------------------------------------------------------
Якщо третє значення тернарного оператора порожнє, його можна опустити:
```latte
as in PHP: {$stock ? 'In stock' : ''}
abbreviated: {$stock ? 'In stock'}
```
Сучасна ключова нотація в масиві .[#toc-modern-key-notation-in-the-array]
-------------------------------------------------------------------------
Ключі масиву можуть бути записані аналогічно іменованим параметрам при виклику функцій:
```latte
as in PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
modern: {var $arr = [one: 'item 1', two: 'item 2']}
```
Фільтри .[#toc-filters]
-----------------------
Фільтри можна використовувати для будь-якого виразу, просто помістіть все в дужки:
```latte
{var $content = ($text|truncate: 30|upper)}
```
Оператор `in` .[#toc-operator-in]
---------------------------------
Оператор `in` може бути використаний для заміни функції `in_array()`. Порівняння завжди суворе:
```latte
{* like in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
```
Вікно в історію .[#toc-a-window-into-history]
---------------------------------------------
За свою історію Latte придумав кілька синтаксичних цукерок, які з'явилися в самому PHP кількома роками пізніше. Наприклад, у Latte можна було записувати масиви у вигляді `[1, 2, 3]` замість `array(1, 2, 3)` або використовувати оператор nullsafe `$obj?->foo` задовго до того, як це стало можливим у самому PHP. У Latte також з'явився оператор розширення масиву `(expand) $arr`, який є еквівалентом сьогоднішнього оператора `...$arr` з PHP.
Оператор undefined-safe `??->`, який схожий на оператор nullsafe `?->`, але не видає помилку, якщо змінна не існує, був створений з історичних причин і сьогодні ми рекомендуємо використовувати стандартний оператор PHP `?->`.
Обмеження PHP у Latte .[#toc-php-limitations-in-latte]
======================================================
У Latte можна писати лише PHP-вирази. Тобто не можна використовувати вирази, що закінчуються крапкою з комою. Не можна оголошувати класи або використовувати [керуючі структури |https://www.php.net/manual/en/language.control-structures.php], такі як `if`, `foreach`, `switch`, `return`, `try`, `throw` та інші, замість яких Latte пропонує свої [теги |tags].
Ви також не можете використовувати [атрибути |https://www.php.net/manual/en/language.attributes.php], [бектики |https://www.php.net/manual/en/language.operators.execution.php] або будь-які [магічні константи |https://www.php.net/manual/en/language.constants.magic.php].
Ви навіть не можете використовувати `unset`, `echo`, `include`, `require`, `exit`, `eval`, тому що це не функції, а спеціальні конструкції мови PHP, а отже, не вирази. Підтримуються тільки багаторядкові коментарі `/* ... */`.
Однак ви можете обійти ці обмеження, активувавши розширення [RawPhpExtension |develop#RawPhpExtension], яке дає змогу використовувати будь-який PHP-код у тезі `{php ...}` під відповідальність автора шаблону.