-
-
Notifications
You must be signed in to change notification settings - Fork 282
/
syntax.texy
270 lines (178 loc) · 14.9 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]
Η Syntax Latte γεννήθηκε από τις πρακτικές απαιτήσεις των σχεδιαστών ιστοσελίδων. Ψάχναμε για την πιο φιλική προς το χρήστη σύνταξη, με την οποία μπορείτε να γράψετε κομψά δομές που διαφορετικά αποτελούν πραγματική πρόκληση.
Ταυτόχρονα, όλες οι εκφράσεις γράφονται ακριβώς όπως και στην PHP, οπότε δεν χρειάζεται να μάθετε μια νέα γλώσσα. Απλώς αξιοποιείτε στο έπακρο αυτό που ήδη γνωρίζετε.
Ακολουθεί ένα ελάχιστο πρότυπο που απεικονίζει μερικά βασικά στοιχεία: ετικέτες, n:attributes, σχόλια και φίλτρα.
```latte
{* αυτό είναι ένα σχόλιο *}
<ul n:if="$items"> {* n:if is n:atribut *}
{foreach $items as $item} {* tag που αντιπροσωπεύει τον βρόχο 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 |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>
```
Εκτυπώσεις:
```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/el/tags#printing] tag):
```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
{* όπως 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]
==============================================================
Μόνο εκφράσεις PHP μπορούν να γραφτούν στο Latte. Δηλαδή, δεν μπορούν να χρησιμοποιηθούν δηλώσεις που τελειώνουν με άνω τελεία. Δεν μπορείτε να δηλώσετε κλάσεις ή να χρησιμοποιήσετε [δομές ελέγχου |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], [backticks |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 ...}` με ευθύνη του συντάκτη του προτύπου.