-
-
Notifications
You must be signed in to change notification settings - Fork 277
Expand file tree
/
Copy pathsyntax.texy
More file actions
276 lines (179 loc) · 14.7 KB
/
syntax.texy
File metadata and controls
276 lines (179 loc) · 14.7 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
Σύνταξη
*******
.[perex]
Η σύνταξη του Latte προέκυψε από τις πρακτικές απαιτήσεις των web designers. Αναζητήσαμε την πιο φιλική σύνταξη, με την οποία μπορείτε να γράψετε κομψά ακόμα και κατασκευές που διαφορετικά αποτελούν πραγματικό γρίφο. Ταυτόχρονα, όλες οι εκφράσεις γράφονται ακριβώς όπως στην PHP, οπότε δεν χρειάζεται να μάθετε μια νέα γλώσσα. Απλά αξιοποιείτε ό,τι ήδη γνωρίζετε.
Παρακάτω παρουσιάζεται ένα ελάχιστο πρότυπο που απεικονίζει μερικά βασικά στοιχεία: tags, n:attributes, σχόλια και φίλτρα.
```latte
{* αυτό είναι ένα σχόλιο *}
<ul n:if=$items> {* το n:if είναι ένα n:attribute *}
{foreach $items as $item} {* tag που αντιπροσωπεύει τον βρόχο foreach *}
<li>{$item|capitalize}</li> {* tag που εκτυπώνει μια μεταβλητή με φίλτρο *}
{/foreach} {* τέλος βρόχου *}
</ul>
```
Ας δούμε πιο προσεκτικά αυτά τα σημαντικά στοιχεία και πώς μπορούν να σας βοηθήσουν να δημιουργήσετε ένα εκπληκτικό πρότυπο.
Tags
====
Το πρότυπο περιέχει tags που ελέγχουν τη λογική του προτύπου (για παράδειγμα, βρόχους *foreach*) ή εκτυπώνουν εκφράσεις. Και για τα δύο χρησιμοποιείται ένας μοναδικός οριοθέτης `{ ... }`, οπότε δεν χρειάζεται να σκέφτεστε ποιον οριοθέτη να χρησιμοποιήσετε σε ποια κατάσταση, όπως συμβαίνει σε άλλα συστήματα. Εάν μετά τον χαρακτήρα `{` ακολουθεί εισαγωγικό ή κενό, το Latte δεν το θεωρεί ως αρχή ενός tag, χάρη στο οποίο μπορείτε να χρησιμοποιείτε στα πρότυπα χωρίς προβλήματα και κατασκευές JavaScript, JSON ή κανόνες CSS.
Δείτε την [επισκόπηση όλων των tags|tags]. Επιπλέον, μπορείτε να δημιουργήσετε και [προσαρμοσμένα tags|custom tags].
Το Latte καταλαβαίνει PHP
=========================
Μέσα στα tags μπορείτε να χρησιμοποιείτε εκφράσεις PHP που γνωρίζετε καλά:
- μεταβλητές
- strings (συμπεριλαμβανομένων HEREDOC και NOWDOC), πίνακες, αριθμούς, κ.λπ.
- [τελεστές |https://www.php.net/manual/en/language.operators.php]
- κλήσεις συναρτήσεων και μεθόδων (οι οποίες μπορούν να περιοριστούν με [sandbox|sandbox])
- [match |https://www.php.net/manual/en/control-structures.match.php]
- [ανώνυμες συναρτήσεις |https://www.php.net/manual/en/functions.arrow.php]
- [callbacks |https://www.php.net/manual/en/functions.first_class_callable_syntax.php]
- σχόλια πολλαπλών γραμμών `/* ... */`
- κ.λπ…
Επιπλέον, το Latte συμπληρώνει τη σύνταξη της PHP με μερικές [ευχάριστες επεκτάσεις |#Συντακτικό Ζαχαρούχο].
n:attributes
============
Όλα τα ζευγαρωτά tags, για παράδειγμα `{if} … {/if}`, που λειτουργούν πάνω σε ένα στοιχείο HTML, μπορούν να ξαναγραφτούν με τη μορφή n:attributes. Με αυτόν τον τρόπο θα μπορούσε να γραφτεί για παράδειγμα και το `{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 tags:
```latte
<p><a href={$url} n:tag-if="$url">Title</a></p>
```
Το οποίο εκτυπώνει ανάλογα με τη μεταβλητή `$url`:
```latte
{* όταν το $url είναι κενό *}
<p>Title</p>
{* όταν το $url περιέχει 'https://nette.org' *}
<p><a href="https://nette.org">Title</a></p>
```
Ωστόσο, τα n:attributes δεν είναι απλώς μια συντομογραφία για ζευγαρωτά tags. Υπάρχουν και καθαρά n:attributes, όπως για παράδειγμα το [n:href |application:creating-links#Στο Πρότυπο του Presenter] ή ο πολύ χρήσιμος βοηθός του κωδικοποιητή [n:class |tags#n:class].
Φίλτρα
======
Δείτε την επισκόπηση των [τυπικών φίλτρων |filters].
Τα φίλτρα γράφονται μετά από μια κάθετη γραμμή (μπορεί να υπάρχει κενό πριν από αυτήν):
```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>
```
Ή απευθείας στην τιμή (σε συνδυασμό με το tag [`{=expr}` |tags#Εκτύπωση]):
```latte
<h1>{=' Hello world '|trim}<h1>
```
Δυναμικά HTML tags .{data-version:3.0.9}
========================================
Το Latte υποστηρίζει δυναμικά HTML tags, τα οποία είναι χρήσιμα όταν χρειάζεστε ευελιξία στα ονόματα των tags:
```latte
<h{$level}>Heading</h{$level}>
```
Ο παραπάνω κώδικας μπορεί για παράδειγμα να δημιουργήσει `<h1>Heading</h1>` ή `<h2>Heading</h2>` ανάλογα με την τιμή της μεταβλητής `$level`. Τα δυναμικά HTML tags στο Latte πρέπει πάντα να είναι ζευγαρωτά. Η εναλλακτική τους είναι το [n:tag |tags#n:tag].
Επειδή το Latte είναι ένα ασφαλές σύστημα προτύπων, ελέγχει αν το προκύπτον όνομα του tag είναι έγκυρο και δεν περιέχει ανεπιθύμητες ή κακόβουλες τιμές. Επιπλέον, διασφαλίζει ότι το όνομα του τελικού tag θα είναι πάντα το ίδιο με το όνομα του αρχικού tag.
Σχόλια
======
Τα σχόλια γράφονται με αυτόν τον τρόπο και δεν περιλαμβάνονται στην έξοδο:
```latte
{* αυτό είναι ένα σχόλιο στο Latte *}
```
Μέσα στα tags λειτουργούν τα σχόλια PHP:
```latte
{include 'file.info', /* value: 123 */}
```
Συντακτικό Ζαχαρούχο
====================
Strings χωρίς εισαγωγικά
------------------------
Για απλά strings, μπορείτε να παραλείψετε τα εισαγωγικά:
```latte
όπως στην PHP: {var $arr = ['hello', 'btn--default', '€']}
συντομογραφία: {var $arr = [hello, btn--default, €]}
```
Απλά strings είναι αυτά που αποτελούνται αποκλειστικά από γράμματα, αριθμούς, κάτω παύλες, παύλες και τελείες. Δεν πρέπει να ξεκινούν με αριθμό και δεν πρέπει να ξεκινούν ή να τελειώνουν με παύλα. Δεν πρέπει να αποτελούνται μόνο από κεφαλαία γράμματα και κάτω παύλες, γιατί τότε θεωρούνται σταθερές (π.χ. `PHP_VERSION`). Και δεν πρέπει να συγκρούονται με τις λέξεις-κλειδιά: `and`, `array`, `clone`, `default`, `false`, `in`, `instanceof`, `new`, `null`, `or`, `return`, `true`, `xor`.
Σταθερές
--------
Επειδή μπορείτε να παραλείψετε τα εισαγωγικά για απλά strings, συνιστούμε να γράφετε τις καθολικές σταθερές με μια κάθετο στην αρχή για διάκριση:
```latte
{if \PROJECT_ID === 1} ... {/if}
```
Αυτή η γραφή είναι απολύτως έγκυρη στην ίδια την PHP, η κάθετος δηλώνει ότι η σταθερά βρίσκεται στο καθολικό namespace.
Συντομογραφημένος τριαδικός τελεστής
------------------------------------
Εάν η τρίτη τιμή του τριαδικού τελεστή είναι κενή, μπορεί να παραλειφθεί:
```latte
όπως στην PHP: {$stock ? 'Σε απόθεμα' : ''}
συντομογραφία: {$stock ? 'Σε απόθεμα'}
```
Σύγχρονη γραφή κλειδιών σε πίνακα
---------------------------------
Τα κλειδιά σε έναν πίνακα μπορούν να γραφτούν παρόμοια με τις ονομασμένες παραμέτρους κατά την κλήση συναρτήσεων:
```latte
όπως στην PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
μοντέρνα: {var $arr = [one: 'item 1', two: 'item 2']}
```
Φίλτρα
------
Τα φίλτρα μπορούν να χρησιμοποιηθούν για οποιεσδήποτε εκφράσεις, αρκεί να περικλείσετε το σύνολο σε παρενθέσεις:
```latte
{var $content = ($text|truncate: 30|upper)}
```
Τελεστής `in`
-------------
Ο τελεστής `in` μπορεί να αντικαταστήσει τη συνάρτηση `in_array()`. Η σύγκριση είναι πάντα αυστηρή:
```latte
{* παρόμοιο με in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
```
Ιστορικό Παράθυρο
-----------------
Το 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
=============================
Στο Latte μπορούν να γραφτούν μόνο εκφράσεις PHP. Δηλαδή, δεν μπορούν να χρησιμοποιηθούν εντολές που τερματίζονται με ερωτηματικό. Δεν μπορούν να δηλωθούν κλάσεις ή να χρησιμοποιηθούν [δομές ελέγχου |https://www.php.net/manual/en/language.control-structures.php], π.χ. `if`, `foreach`, `switch`, `return`, `try`, `throw` και άλλες, αντί των οποίων το Latte προσφέρει τα δικά του [tags|tags]. Επίσης, δεν μπορούν να χρησιμοποιηθούν [attributes |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], χάρη στην οποία μπορεί στη συνέχεια να χρησιμοποιηθεί στο tag `{php ...}` οποιοσδήποτε κώδικας PHP με ευθύνη του συγγραφέα του προτύπου.