Nette Documentation Preview

syntax
Ετικέτες Latte
**************

.[perex]
Περίληψη και περιγραφή όλων των ενσωματωμένων ετικετών Latte.

.[table-latte-tags language-latte]
|## Εκτύπωση
| `{$var}`, `{...}` ή `{=...}` | [εκτυπώνει μια μεταβλητή ή έκφραση με διαφυγή |#printing]
| `{$var\|filter}` | [εκτυπώνει με φίλτρα |#filters]
| `{l}` ή `{r}` | εκτυπώνει χαρακτήρα `{` or `}`

.[table-latte-tags language-latte]
|## Συνθήκες
| `{if}`... `{elseif}`... `{else}`... `{/if}` | [condition if |#if-elseif-else]
| `{ifset}`... `{elseifset}`... `{/ifset}` | [συνθήκη ifset |#ifset-elseifset]
| `{ifchanged}`... `{/ifchanged}` | [test if there has been a change |#ifchanged]
| `{switch}` `{case}` `{default}` `{/switch}` | [condition switch |#switch-case-default]
| `n:else` | [εναλλακτικό περιεχόμενο για τους όρους |#n:else]

.[table-latte-tags language-latte]
|## Βρόχοι
| `{foreach}`... `{/foreach}` | [foreach |#foreach]
| `{for}`... `{/for}` | [for |#for]
| `{while}`... `{/while}` | [while |#while]
| `{continueIf $cond}` | [συνέχεια στην επόμενη επανάληψη |#continueif-skipif-breakif]
| `{skipIf $cond}` | [παράλειψη της τρέχουσας επανάληψης του βρόχου |#continueif-skipif-breakif]
| `{breakIf $cond}` | [διακόπτει το βρόχο |#continueif-skipif-breakif]
| `{exitIf $cond}` | [πρόωρη έξοδος |#exitif]
| `{first}`... `{/first}` | [είναι η πρώτη επανάληψη; |#first-last-sep]
| `{last}`... `{/last}` | [είναι η τελευταία επανάληψη; |#first-last-sep]
| `{sep}`... `{/sep}` | [θα ακολουθήσει επόμενη επανάληψη; |#first-last-sep]
| `{iterateWhile}`... `{/iterateWhile}` | [structured foreach |#iterateWhile]
| `$iterator` | [ειδική μεταβλητή μέσα στο βρόχο foreach |#$iterator]

.[table-latte-tags language-latte]
|## Συμπερίληψη άλλων προτύπων
| `{include 'file.latte'}` | [περιλαμβάνει ένα πρότυπο από άλλο αρχείο |#include]
| `{sandbox 'file.latte'}` | [περιλαμβάνει ένα πρότυπο σε λειτουργία sandbox |#sandbox]

.[table-latte-tags language-latte]
|## Μπλοκ, διατάξεις, κληρονομικότητα προτύπων
| `{block}` | [ανώνυμο μπλοκ |#block]
| `{block blockname}` | [ορισμός μπλοκ |template-inheritance#blocks]
| `{define blockname}` | [ορισμός μπλοκ για μελλοντική χρήση |template-inheritance#definitions]
| `{include blockname}` | [εκτυπώσεις μπλοκ |template-inheritance#printing-blocks]
| `{include blockname from 'file.latte'}` | [εκτυπώνει ένα μπλοκ από αρχείο |template-inheritance#printing-blocks]
| `{import 'file.latte'}` | [φορτώνει μπλοκ από άλλο πρότυπο |template-inheritance#horizontal-reuse]
| `{layout 'file.latte'}` / `{extends}` | [καθορίζει ένα αρχείο διάταξης |template-inheritance#layout-inheritance]
| `{embed}`... `{/embed}` | [φορτώνει το πρότυπο ή το μπλοκ και σας επιτρέπει να αντικαταστήσετε τα μπλοκ |template-inheritance#unit-inheritance]
| `{ifset blockname}`... `{/ifset}` | [συνθήκη αν έχει οριστεί μπλοκ |template-inheritance#checking-block-existence]

.[table-latte-tags language-latte]
|## Χειρισμός εξαιρέσεων
| `{try}`... `{else}`... `{/try}` | [αντιμετώπιση εξαιρέσεων |#try]
| `{rollback}` | [απορρίπτει το μπλοκ try |#rollback]

.[table-latte-tags language-latte]
|## Μεταβλητές
| `{var $foo = value}` | [δημιουργία μεταβλητών |#var-default]
| `{default $foo = value}` | [προεπιλεγμένη τιμή όταν η μεταβλητή δεν έχει δηλωθεί |#var-default]
| `{parameters}` | [δηλώνει μεταβλητές, τύπους και προεπιλεγμένες τιμές |#parameters]
| `{capture}`... `{/capture}` | [αποτυπώνει ένα τμήμα σε μια μεταβλητή |#capture]

.[table-latte-tags language-latte]
|## Τύποι
| `{varType}` | [δηλώνει τον τύπο της μεταβλητής |type-system#varType]
| `{varPrint}` | [προτείνει τύπους μεταβλητών |type-system#varPrint]
| `{templateType}` | [δηλώνει τύπους μεταβλητών χρησιμοποιώντας κλάση |type-system#templateType]
| `{templatePrint}` | [δημιουργεί κλάση με ιδιότητες |type-system#templatePrint]

.[table-latte-tags language-latte]
|## Μετάφραση
| `{_string}` | [εκτυπώνει μεταφρασμένα |#Translation]
| `{translate}`... `{/translate}` | [μεταφράζει το περιεχόμενο |#Translation]

.[table-latte-tags language-latte]
|## Άλλοι
| `{contentType}` | [αλλάζει τον τρόπο διαφυγής και στέλνει επικεφαλίδα HTTP |#contenttype]
| `{debugbreak}` | [θέτει σημείο διακοπής στον κώδικα |#debugbreak]
| `{do}` | [αξιολογεί μια έκφραση χωρίς να την εκτυπώσει |#do]
| `{dump}` | [Απορρίπτει μεταβλητές στη γραμμή Tracy Bar|#dump]
| `{php}` | [εκτελεί οποιονδήποτε κώδικα PHP |#php]
| `{spaceless}`... `{/spaceless}` | [αφαιρεί τα περιττά κενά διαστήματα |#spaceless]
| `{syntax}` | [αλλάζει τη σύνταξη κατά την εκτέλεση |#syntax]
| `{trace}` | [εμφανίζει ίχνος στοίβας |#trace]

.[table-latte-tags language-latte]
|## Βοηθοί ετικετών HTML
| `n:class` | [έξυπνο χαρακτηριστικό κλάσης |#n:class]
| `n:attr` | [έξυπνα χαρακτηριστικά HTML |#n:attr]
| `n:tag` | [δυναμικό όνομα στοιχείου HTML |#n:tag]
| `n:ifcontent` | [Παράλειψη κενής ετικέτας HTML |#n:ifcontent]

.[table-latte-tags language-latte]
|## Διαθέσιμο μόνο στο Nette Framework
| `n:href` | [σύνδεσμος σε στοιχεία HTML `<a>`  |application:creating-links#In the Presenter Template]
| `{link}` | [εκτυπώνει έναν σύνδεσμο |application:creating-links#In the Presenter Template]
| `{plink}` | [εκτυπώνει έναν σύνδεσμο προς έναν παρουσιαστή |application:creating-links#In the Presenter Template]
| `{control}` | [εκτυπώνει ένα στοιχείο |application:components#Rendering]
| `{snippet}`... `{/snippet}` | [ένα απόσπασμα προτύπου που μπορεί να σταλεί μέσω AJAX |application:ajax#snippets-in-latte]
| `{snippetArea}` | [φάκελος αποσπασμάτων |application:ajax#snippet-areas]
| `{cache}`... `{/cache}` | [προσωρινή αποθήκευση ενός τμήματος προτύπου |caching:en#caching-in-latte]

.[table-latte-tags language-latte]
|## Διαθέσιμο μόνο με Nette Forms
| `{form}`... `{/form}` | [εκτυπώνει ένα στοιχείο φόρμας |forms:rendering#form]
| `{label}`... `{/label}` | [εκτυπώνει μια ετικέτα εισόδου φόρμας |forms:rendering#label-input]
| `{input}` | [εκτυπώνει ένα στοιχείο εισόδου φόρμας |forms:rendering#label-input]
| `{inputError}` | [εκτυπώνει μήνυμα σφάλματος για το στοιχείο εισόδου φόρμας |forms:rendering#inputError]
| `n:name` | [ενεργοποιεί ένα στοιχείο εισόδου HTML |forms:rendering#n:name]
| `{formContainer}`... `{/formContainer}` | [απόδοση του δοχείου της φόρμας |forms:rendering#special-cases]


Εκτύπωση .[#toc-printing]
=========================


`{$var}` `{...}` `{=...}`
-------------------------

Η Latte χρησιμοποιεί την ετικέτα `{=...}` για να εκτυπώσει οποιαδήποτε έκφραση στην έξοδο. Εάν η έκφραση αρχίζει με μια μεταβλητή ή κλήση συνάρτησης, δεν χρειάζεται να γράψετε ένα σύμβολο ισότητας. Το οποίο στην πράξη σημαίνει ότι δεν χρειάζεται σχεδόν ποτέ να γραφτεί:

```latte
Name: {$name} {$surname}<br>
Age: {date('Y') - $birth}<br>
```

Μπορείτε να γράψετε οτιδήποτε γνωρίζετε από την PHP ως έκφραση. Απλά δεν χρειάζεται να μάθετε μια νέα γλώσσα. Για παράδειγμα:


```latte
{='0' . ($num ?? $num * 3) . ', ' . PHP_VERSION}
```

αλλά αν βρείτε κάποιο εκεί, γράψτε μας :-)


Διαφυγή εξόδου .[#toc-escaping-output]
--------------------------------------

Ποια είναι η πιο σημαντική εργασία ενός συστήματος προτύπων; Η αποφυγή κενών ασφαλείας. Και αυτό ακριβώς κάνει το Latte κάθε φορά που εκτυπώνετε κάτι στην έξοδο. Αποφεύγει αυτόματα τα πάντα:

```latte
<p>{='one < two'}</p>   {* prints: '<p>one &lt; two</p>' *}
```

Για να είμαστε ακριβείς, το Latte χρησιμοποιεί το context-sensitive escaping, το οποίο είναι ένα τόσο σημαντικό και μοναδικό χαρακτηριστικό που του έχουμε αφιερώσει [ένα ξεχωριστό κεφάλαιο |safety-first#context-aware-escaping].

Και αν εκτυπώνετε περιεχόμενο κωδικοποιημένο σε HTML από αξιόπιστη πηγή; Τότε μπορείτε εύκολα να απενεργοποιήσετε τη διαφυγή:

```latte
{$trustedHtmlString|noescape}
```

.[warning]
Η κατάχρηση του φίλτρου `noescape` μπορεί να οδηγήσει σε ευπάθεια XSS! Ποτέ μην το χρησιμοποιείτε, εκτός αν είστε **απολύτως σίγουροι** για το τι κάνετε και ότι η συμβολοσειρά που εκτυπώνετε προέρχεται από αξιόπιστη πηγή.


Εκτύπωση σε JavaScript .[#toc-printing-in-javascript]
-----------------------------------------------------

Χάρη στο context-sensitive escaping, είναι θαυμάσια εύκολο να εκτυπώσετε μεταβλητές μέσα στη JavaScript, και το Latte θα τις αποφύγει σωστά.

Η μεταβλητή δεν χρειάζεται να είναι συμβολοσειρά, υποστηρίζεται οποιοσδήποτε τύπος δεδομένων, ο οποίος στη συνέχεια κωδικοποιείται ως JSON:

```latte
{var $foo = ['hello', true, 1]}
<script>
	alert({$foo});
</script>
```

Παράγει:

```latte
<script>
	alert(["hello", true, 1]);
</script>
```

Μην βάζετε τη μεταβλητή σε εισαγωγικά**: Latte τα προσθέτει γύρω από τις συμβολοσειρές. Και αν θέλετε να βάλετε μια μεταβλητή συμβολοσειράς μέσα σε μια άλλη συμβολοσειρά, απλά συνδέστε τις:

```latte
<script>
	alert('Hello ' + {$name} + '!');  // OK

	alert({="Hello $name!"});         // OK

	alert('Hello {$name} !');         // ERROR!
</script>
```


Φίλτρα .[#toc-filters]
----------------------

Η εκτυπωμένη έκφραση μπορεί να τροποποιηθεί [με φίλτρα |syntax#filters]. Για παράδειγμα, αυτό το παράδειγμα μετατρέπει τη συμβολοσειρά σε κεφαλαία γράμματα και τη συντομεύει σε 30 χαρακτήρες το πολύ:

```latte
{$string|upper|truncate:30}
```

Μπορείτε επίσης να εφαρμόσετε φίλτρα σε τμήματα μιας έκφρασης ως εξής:

```latte
{$left . ($middle|upper) . $right}
```


Συνθήκες .[#toc-conditions]
===========================


`{if}` `{elseif}` `{else}`
--------------------------

Οι συνθήκες συμπεριφέρονται με τον ίδιο τρόπο όπως οι αντίστοιχες της PHP. Μπορείτε να χρησιμοποιήσετε τις ίδιες εκφράσεις που γνωρίζετε από την PHP, δεν χρειάζεται να μάθετε μια νέα γλώσσα.

```latte
{if $product->inStock > Stock::Minimum}
	In stock
{elseif $product->isOnWay()}
	On the way
{else}
	Not available
{/if}
```

Όπως κάθε ετικέτα pair, ένα ζεύγος `{if} ... {/ if}` μπορεί να γραφτεί ως [n:attribute |syntax#n:attributes], για παράδειγμα:

```latte
<p n:if="$count > 0">In stock {$count} items</p>
```

Γνωρίζετε ότι μπορείτε να προσθέσετε το πρόθεμα `tag-` σε n:attributes; Τότε η συνθήκη θα επηρεάζει μόνο τις ετικέτες HTML και το περιεχόμενο μεταξύ τους θα εκτυπώνεται πάντα:

```latte
<a href="..." n:tag-if="$clickable">Hello</a>

{* prints 'Hello' when $clickable is falsey *}
{* prints '<a href="...">Hello</a>' when $clickable is truthy *}
```

Ωραία.


`n:else` .{data-version:3.0.11}
-------------------------------

Αν γράψετε τη συνθήκη `{if} ... {/if}` με τη μορφή ενός [n:attribute |syntax#n:attributes], έχετε τη δυνατότητα να καθορίσετε μια εναλλακτική διακλάδωση χρησιμοποιώντας το `n:else`:

```latte
<strong n:if="$count > 0">In stock {$count} items</strong>

<em n:else>not available</em>
```

Το χαρακτηριστικό `n:else` μπορεί επίσης να χρησιμοποιηθεί σε συνδυασμό με το [`n:ifset` |#ifset-elseifset], [`n:foreach` |#foreach], [`n:try` |#try], [`n:ifcontent` |#n:ifcontent], και [`n:ifchanged` |#ifchanged].


`{/if $cond}`
-------------

Μπορεί να εκπλαγείτε από το γεγονός ότι η έκφραση στη συνθήκη `{if}` μπορεί επίσης να καθοριστεί στην ετικέτα end. Αυτό είναι χρήσιμο σε περιπτώσεις όπου δεν γνωρίζουμε ακόμα την τιμή της συνθήκης όταν ανοίγει η ετικέτα. Ας το ονομάσουμε αναβαλλόμενη απόφαση.

Για παράδειγμα, ξεκινάμε την απαρίθμηση ενός πίνακα με εγγραφές από τη βάση δεδομένων και μόνο μετά την ολοκλήρωση της αναφοράς συνειδητοποιούμε ότι δεν υπήρχε καμία εγγραφή στη βάση δεδομένων. Έτσι, βάζουμε συνθήκη στο τέλος της ετικέτας `{/if}` και αν δεν υπάρχει εγγραφή, δεν θα εκτυπωθεί τίποτα από αυτά:

```latte
{if}
	<h1>Printing rows from the database</h1>

	<table>
	{foreach $resultSet as $row}
		...
	{/foreach}
	</table>
{/if isset($row)}
```

Δεν είναι πρακτικό;

Μπορείτε επίσης να χρησιμοποιήσετε το `{else}` στην αναβαλλόμενη συνθήκη, αλλά όχι το `{elseif}`.


`{ifset}` `{elseifset}`
-----------------------

.[note]
Βλέπε επίσης [`{ifset block}` |template-inheritance#checking-block-existence]

Χρησιμοποιήστε τη συνθήκη `{ifset $var}` για να προσδιορίσετε αν μια μεταβλητή (ή πολλαπλές μεταβλητές) υπάρχει και έχει μη μηδενική τιμή. Στην πραγματικότητα είναι το ίδιο με το `if (isset($var))` στην PHP. Όπως κάθε ετικέτα pair, μπορεί να γραφτεί με τη μορφή [n:attribute |syntax#n:attributes], οπότε ας το δείξουμε σε παράδειγμα:

```latte
<meta name="robots" content={$robots} n:ifset="$robots">
```


`{ifchanged}`
-------------

`{ifchanged}` ελέγχει αν η τιμή μιας μεταβλητής έχει αλλάξει από την τελευταία επανάληψη του βρόχου (foreach, for ή while).

Αν καθορίσουμε μία ή περισσότερες μεταβλητές στην ετικέτα, θα ελέγξει αν κάποια από αυτές έχει αλλάξει και θα εκτυπώσει τα περιεχόμενα ανάλογα. Για παράδειγμα, το ακόλουθο παράδειγμα εκτυπώνει το πρώτο γράμμα ενός ονόματος ως επικεφαλίδα κάθε φορά που αλλάζει κατά την καταχώριση ονομάτων:

```latte
{foreach ($names|sort) as $name}
	{ifchanged $name[0]} <h2>{$name[0]}</h2> {/ifchanged}

	<p>{$name}</p>
{/foreach}
```

Ωστόσο, αν δεν δοθεί κανένα όρισμα, το ίδιο το περιεχόμενο που αποδίδεται θα ελεγχθεί σε σχέση με την προηγούμενη κατάστασή του. Αυτό σημαίνει ότι στο προηγούμενο παράδειγμα, μπορούμε με ασφάλεια να παραλείψουμε το όρισμα στην ετικέτα. Και φυσικά μπορούμε επίσης να χρησιμοποιήσουμε το [n:attribute |syntax#n:attributes]:

```latte
{foreach ($names|sort) as $name}
	<h2 n:ifchanged>{$name[0]}</h2>

	<p>{$name}</p>
{/foreach}
```

Μπορείτε επίσης να συμπεριλάβετε μια ρήτρα `{else}` μέσα στο `{ifchanged}`.


`{switch}` `{case}` `{default}`
-------------------------------
Συγκρίνει την τιμή με πολλαπλές επιλογές. Είναι παρόμοια με τη δομή `switch` που γνωρίζετε από την PHP. Ωστόσο, η Latte τη βελτιώνει:

- χρησιμοποιεί αυστηρή σύγκριση (`===`)
- δεν χρειάζεται μια `break`

Έτσι είναι το ακριβές ισοδύναμο της δομής `match` που διαθέτει η PHP 8.0.

```latte
{switch $transport}
	{case train}
		By train
	{case plane}
		By plane
	{default}
		Differently
{/switch}
```

Η ρήτρα `{case}` μπορεί να περιέχει πολλαπλές τιμές που χωρίζονται με κόμμα:

```latte
{switch $status}
{case $status::New}<b>new item</b>
{case $status::Sold, $status::Unknown}<i>not available</i>
{/switch}
```


Βρόχοι .[#toc-loops]
====================

Στο Latte, όλοι οι βρόχοι που γνωρίζετε από την PHP είναι στη διάθεσή σας: foreach, for και while.


`{foreach}`
-----------

Γράφετε τον κύκλο με τον ίδιο ακριβώς τρόπο όπως και στην PHP:

```latte
{foreach $langs as $code => $lang}
	<span>{$lang}</span>
{/foreach}
```

Επιπλέον, έχει κάποιες εύχρηστες βελτιώσεις για τις οποίες θα μιλήσουμε τώρα.

Για παράδειγμα, ο Latte ελέγχει ότι οι μεταβλητές που δημιουργούνται δεν αντικαθιστούν κατά λάθος παγκόσμιες μεταβλητές με το ίδιο όνομα. Αυτό θα σας σώσει όταν υποθέτετε ότι η `$lang` είναι η τρέχουσα γλώσσα της σελίδας και δεν αντιλαμβάνεστε ότι η `foreach $langs as $lang` έχει αντικαταστήσει αυτή τη μεταβλητή.

Ο βρόχος foreach μπορεί επίσης να γραφτεί πολύ κομψά και οικονομικά με το [n:attribute |syntax#n:attributes]:

```latte
<ul>
	<li n:foreach="$items as $item">{$item->name}</li>
</ul>
```

Γνωρίζατε ότι μπορείτε να προτάξετε το πρόθεμα `inner-` στο n:attributes; Τώρα τότε μόνο το εσωτερικό μέρος του στοιχείου θα επαναλαμβάνεται στο βρόχο:

```latte
<div n:inner-foreach="$items as $item">
	<h4>{$item->title}</h4>
	<p>{$item->description}</p>
</div>
```

Έτσι, εκτυπώνεται κάτι σαν:

```latte
<div>
	<h4>Foo</h4>
	<p>Lorem ipsum.</p>
	<h4>Bar</h4>
	<p>Sit dolor.</p>
</div>
```


`{else}` .{toc: foreach-else}
-----------------------------

Ο βρόχος `foreach` μπορεί να λάβει μια προαιρετική ρήτρα `{else}` της οποίας το κείμενο εμφανίζεται εάν ο δεδομένος πίνακας είναι άδειος:

```latte
<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sorry, no users in this list</em></li>
	{/foreach}
</ul>
```


`$iterator`
-----------

Μέσα στο βρόχο `foreach` αρχικοποιείται η μεταβλητή `$iterator`. Διατηρεί σημαντικές πληροφορίες σχετικά με τον τρέχοντα βρόχο.

- `$iterator->first` - είναι αυτή η πρώτη επανάληψη;
- `$iterator->last` - είναι αυτή η τελευταία επανάληψη;
- `$iterator->counter` - μετρητής επανάληψης, ξεκινά από το 1
- `$iterator->counter0` - μετρητής επανάληψης, ξεκινά από 0
- `$iterator->odd` - είναι αυτή η επανάληψη περιττή;
- `$iterator->even` - είναι αυτή η επανάληψη άρτια;
- `$iterator->parent` - ο επαναλήπτης που περιβάλλει τον τρέχοντα
- `$iterator->nextValue` - το επόμενο στοιχείο του βρόχου
- `$iterator->nextKey` - το κλειδί του επόμενου στοιχείου του βρόχου


```latte
{foreach $rows as $row}
	{if $iterator->first}<table>{/if}

	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>

	{if $iterator->last}</table>{/if}
{/foreach}
```

Ο λάτε είναι έξυπνος και το `$iterator->last` λειτουργεί όχι μόνο για πίνακες, αλλά και όταν ο βρόχος εκτελείται πάνω σε έναν γενικό επαναλήπτη όπου ο αριθμός των στοιχείων δεν είναι γνωστός εκ των προτέρων.


`{first}` `{last}` `{sep}`
--------------------------

Αυτές οι ετικέτες μπορούν να χρησιμοποιηθούν μέσα στο βρόχο `{foreach}`. Τα περιεχόμενα του `{first}` αποδίδονται για το πρώτο πέρασμα.
Τα περιεχόμενα του `{last}` αποδίδονται ... μπορείτε να μαντέψετε; Ναι, για το τελευταίο πέρασμα. Αυτές είναι στην πραγματικότητα συντομεύσεις για τις ετικέτες `{if $iterator->first}` και `{if $iterator->last}`.

Οι ετικέτες μπορούν επίσης να γραφούν ως [n:attributes |syntax#n:attributes]:

```latte
{foreach $rows as $row}
	{first}<h1>List of names</h1>{/first}

	<p>{$row->name}</p>

	<hr n:last>
{/foreach}
```

Τα περιεχόμενα του `{sep}` αποδίδονται εάν η επανάληψη δεν είναι η τελευταία, οπότε είναι κατάλληλο για την εκτύπωση οριοθετών, όπως κόμματα μεταξύ των παρατιθέμενων στοιχείων:

```latte
{foreach $items as $item} {$item} {sep}, {/sep} {/foreach}
```

Αυτό είναι αρκετά πρακτικό, έτσι δεν είναι;


`{iterateWhile}`
----------------

Απλοποιεί την ομαδοποίηση των γραμμικών δεδομένων κατά την επανάληψη σε έναν βρόχο foreach, εκτελώντας την επανάληψη σε έναν εμφωλευμένο βρόχο εφόσον ικανοποιείται η συνθήκη. [Διαβάστε τις οδηγίες στο βιβλίο μαγειρικής |cookbook/iteratewhile].

Μπορεί επίσης να αντικαταστήσει κομψά τα `{first}` και `{last}` στο παραπάνω παράδειγμα:

```latte
{foreach $rows as $row}
	<table>

	{iterateWhile}
	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>
	{/iterateWhile true}

	</table>
{/foreach}
```


`{for}`
-------

Γράφουμε τον κύκλο με τον ίδιο ακριβώς τρόπο όπως και στην PHP:

```latte
{for $i = 0; $i < 10; $i++}
	<span>Item #{$i}</span>
{/for}
```

Η ετικέτα μπορεί επίσης να γραφτεί ως [n:attribute |syntax#n:attributes]:

```latte
<h1 n:for="$i = 0; $i < 10; $i++">{$i}</h1>
```


`{while}`
---------

Και πάλι, γράφουμε τον κύκλο με τον ίδιο ακριβώς τρόπο όπως και στην PHP:

```latte
{while $row = $result->fetch()}
	<span>{$row->title}</span>
{/while}
```

ή ως [n:attribute |syntax#n:attributes]:

```latte
<span n:while="$row = $result->fetch()">
	{$row->title}
</span>
```

Μια παραλλαγή με συνθήκη στην ετικέτα τέλους αντιστοιχεί στον βρόχο do-while της PHP:

```latte
{while}
	<span>{$item->title}</span>
{/while $item = $item->getNext()}
```


`{continueIf}` `{skipIf}` `{breakIf}`
-------------------------------------

Υπάρχουν ειδικές ετικέτες που μπορείτε να χρησιμοποιήσετε για τον έλεγχο οποιουδήποτε βρόχου - `{continueIf ?}` και `{breakIf ?}` οι οποίες μεταπηδούν στην επόμενη επανάληψη και τερματίζουν τον βρόχο, αντίστοιχα, εάν πληρούνται οι συνθήκες:

```latte
{foreach $rows as $row}
	{continueIf $row->date < $now}
	{breakIf $row->parent === null}
	...
{/foreach}
```


Η ετικέτα `{skipIf}` μοιάζει πολύ με την `{continueIf}`, αλλά δεν αυξάνει τον μετρητή. Έτσι δεν υπάρχουν κενά στην αρίθμηση όταν εκτυπώνετε το `$iterator->counter` και παραλείπετε κάποια στοιχεία. Επίσης, η ρήτρα {else} θα αποδίδεται όταν παραλείπετε όλα τα στοιχεία.

```latte
<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sorry, no adult users in this list</em></li>
	{/foreach}
</ul>
```


`{exitIf}` .{data-version:3.0.5}
--------------------------------

Τερματίζει την απόδοση ενός προτύπου ή μπλοκ όταν ικανοποιείται μια συνθήκη (δηλαδή "πρόωρη έξοδος").

```latte
{exitIf !$messages}

<h1>Messages</h1>
<div n:foreach="$messages as $message">
   {$message}
</div>
```


Συμπερίληψη προτύπων .[#toc-including-templates]
================================================


`{include 'file.latte'}` .{toc: include}
----------------------------------------

.[note]
Βλέπε επίσης [`{include block}` |template-inheritance#printing-blocks]

Η ετικέτα `{include}` φορτώνει και αποδίδει το καθορισμένο πρότυπο. Στην αγαπημένη μας γλώσσα PHP είναι σαν:

```php
<?php include 'header.phtml'; ?>
```

Τα περιεχόμενα πρότυπα δεν έχουν πρόσβαση στις μεταβλητές του ενεργού πλαισίου, αλλά έχουν πρόσβαση στις παγκόσμιες μεταβλητές.

Μπορείτε να περάσετε μεταβλητές στο εισαγόμενο πρότυπο με τον ακόλουθο τρόπο:

```latte
{include 'template.latte', foo: 'bar', id: 123}
```

Το όνομα του προτύπου μπορεί να είναι οποιαδήποτε έκφραση της PHP:

```latte
{include $someVar}
{include $ajax ? 'ajax.latte' : 'not-ajax.latte'}
```

Το εισαγόμενο περιεχόμενο μπορεί να τροποποιηθεί με τη χρήση [φίλτρων |syntax#filters]. Το ακόλουθο παράδειγμα αφαιρεί όλα τα στοιχεία HTML και ρυθμίζει την περίπτωση:

```latte
<title>{include 'heading.latte' |stripHtml|capitalize}</title>
```

Η [κληρονομικότητα προτύπου |template inheritance] **δεν εμπλέκεται** σε αυτό από προεπιλογή. Ενώ μπορείτε να προσθέσετε ετικέτες μπλοκ σε πρότυπα που περιλαμβάνονται, δεν θα αντικαταστήσουν τα αντίστοιχα μπλοκ στο πρότυπο στο οποίο περιλαμβάνονται. Σκεφτείτε τα includes ως ανεξάρτητα και θωρακισμένα μέρη σελίδων ή ενοτήτων. Αυτή η συμπεριφορά μπορεί να αλλάξει χρησιμοποιώντας τον τροποποιητή `with blocks`:

```latte
{include 'template.latte' with blocks}
```

Η σχέση μεταξύ του ονόματος αρχείου που καθορίζεται στην ετικέτα και του αρχείου στο δίσκο είναι θέμα του [φορτωτή |extending-latte#Loaders].


`{sandbox}`
-----------

Όταν συμπεριλαμβάνετε ένα πρότυπο που έχει δημιουργηθεί από έναν τελικό χρήστη, θα πρέπει να εξετάσετε το ενδεχόμενο να το κάνετε sandboxing (περισσότερες πληροφορίες στην [τεκμηρίωση sandbox |sandbox]):

```latte
{sandbox 'untrusted.latte', level: 3, data: $menu}
```


`{block}`
=========

.[note]
Βλέπε επίσης [`{block name}` |template-inheritance#blocks]

Τα μπλοκ χωρίς όνομα χρησιμεύουν στη δυνατότητα εφαρμογής [φίλτρων |syntax#filters] σε ένα τμήμα του προτύπου. Για παράδειγμα, μπορείτε να εφαρμόσετε ένα φίλτρο [strip |filters#strip] για να αφαιρέσετε τα περιττά κενά:

```latte
{block|strip}
<ul>
	<li>Hello World</li>
</ul>
{/block}
```


Χειρισμός εξαιρέσεων .[#toc-exception-handling]
===============================================


`{try}`
-------

Αυτή η ετικέτα καθιστά εξαιρετικά εύκολη την κατασκευή ισχυρών προτύπων.

Εάν προκύψει μια εξαίρεση κατά την απόδοση του μπλοκ `{try}`, ολόκληρο το μπλοκ απορρίπτεται και η απόδοση θα συνεχιστεί μετά από αυτό:

```latte
{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
{/try}
```

Τα περιεχόμενα της προαιρετικής ρήτρας `{else}` αποδίδονται μόνο όταν εμφανιστεί εξαίρεση:

```latte
{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sorry, the tweets could not be loaded.</p>
{/try}
```

Η ετικέτα μπορεί επίσης να γραφτεί ως [n:attribute |syntax#n:attributes]:

```latte
<ul n:try>
	...
</ul>
```

Είναι επίσης δυνατό να ορίσετε [δικό σας χειριστή εξαιρέσεων |develop#exception handler] για π.χ. καταγραφή:


`{rollback}`
------------

Το μπλοκ `{try}` μπορεί επίσης να σταματήσει και να παραλειφθεί χειροκίνητα χρησιμοποιώντας το `{rollback}`. Έτσι, δεν χρειάζεται να ελέγξετε εκ των προτέρων όλα τα δεδομένα εισόδου και μόνο κατά τη διάρκεια της απόδοσης μπορείτε να αποφασίσετε αν έχει νόημα να αποδοθεί το αντικείμενο.

```latte
{try}
<ul>
	{foreach $people as $person}
 		{skipIf $person->age < 18}
 		<li>{$person->name}</li>
	{else}
		{rollback}
	{/foreach}
</ul>
{/try}
```


Μεταβλητές .[#toc-variables]
============================


`{var}` `{default}`
-------------------

Θα δημιουργήσουμε νέες μεταβλητές στο πρότυπο με την ετικέτα `{var}`:

```latte
{var $name = 'John Smith'}
{var $age = 27}

{* Πολλαπλή δήλωση *}
{var $name = 'John Smith', $age = 27}
```

Η ετικέτα `{default}` λειτουργεί παρόμοια, με τη διαφορά ότι δημιουργεί μεταβλητές μόνο αν δεν υπάρχουν:

```latte
{default $lang = 'cs'}
```

Μπορείτε επίσης να καθορίσετε [τύπους μεταβλητών |type-system]. Προς το παρόν, είναι πληροφοριακές και η Latte δεν τις ελέγχει.

```latte
{var string $name = $article->getTitle()}
{default int $id = 0}
```


`{parameters}`
--------------

Ακριβώς όπως μια συνάρτηση δηλώνει τις παραμέτρους της, ένα πρότυπο μπορεί να δηλώσει τις μεταβλητές του στην αρχή του:

```latte
{parameters
	$a,
	?int $b,
	int|string $c = 10
}
```

Οι μεταβλητές `$a` και `$b` χωρίς προεπιλεγμένη τιμή έχουν αυτόματα την προεπιλεγμένη τιμή `null`. Οι δηλωμένοι τύποι εξακολουθούν να είναι πληροφοριακοί και το Latte δεν τους ελέγχει.

Εκτός από τις δηλωμένες μεταβλητές δεν περνούν στο πρότυπο. Αυτή είναι μια διαφορά από την ετικέτα `{default}`.


`{capture}`
-----------

Χρησιμοποιώντας την ετικέτα `{capture}` μπορείτε να αποτυπώσετε την έξοδο σε μια μεταβλητή:

```latte
{capture $var}
<ul>
	<li>Hello World</li>
</ul>
{/capture}

<p>Captured: {$var}</p>
```

Η ετικέτα μπορεί επίσης να γραφτεί ως [n:attribute |syntax#n:attributes], όπως κάθε ετικέτα ανά ζεύγη:

```latte
<ul n:capture="$var">
	<li>Hello World</li>
</ul>
```

Η έξοδος HTML αποθηκεύεται στη μεταβλητή `$var` ως αντικείμενο `Latte\Runtime\Html` για να [αποφευχθεί η ανεπιθύμητη διαφυγή |develop#disabling-auto-escaping-of-variable] κατά την εκτύπωση.


Άλλοι .[#toc-others]
====================


`{contentType}`
---------------

Χρησιμοποιήστε την ετικέτα για να καθορίσετε τον τύπο περιεχομένου που αντιπροσωπεύει το πρότυπο. Οι επιλογές είναι οι εξής:

- `html` (προεπιλεγμένος τύπος)
- `xml`
- `javascript`
- `css`
- `calendar` (iCal)
- `text`

Η χρήση του είναι σημαντική, διότι θέτει τη [διαφυγή σε συνάρτηση με το περιβάλλον |safety-first#context-aware-escaping] και μόνο τότε μπορεί το Latte να διαφύγει σωστά. Για παράδειγμα, το `{contentType xml}` μεταβαίνει σε λειτουργία XML, το `{contentType text}` απενεργοποιεί εντελώς την αποφυγή διαφυγής.

Εάν η παράμετρος είναι ένας τύπος MIME με πλήρεις δυνατότητες, όπως το `application/xml`, στέλνει επίσης μια επικεφαλίδα HTTP `Content-Type` στο πρόγραμμα περιήγησης:

```latte
{contentType application/xml}
<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>RSS feed</title>
		<item>
			...
		</item>
	</channel>
</rss>
```


`{debugbreak}`
--------------

Καθορίζει το σημείο στο οποίο θα διακοπεί η εκτέλεση του κώδικα. Χρησιμοποιείται για σκοπούς αποσφαλμάτωσης για να επιθεωρήσει ο προγραμματιστής το περιβάλλον εκτέλεσης και να διασφαλίσει ότι ο κώδικας εκτελείται όπως αναμένεται. Υποστηρίζει το [Xdebug |https://xdebug.org]. Επιπλέον, μπορείτε να καθορίσετε μια συνθήκη κατά την οποία ο κώδικας θα πρέπει να διακόπτεται.

```latte
{debugbreak}                {* διακόπτει το πρόγραμμα *}

{debugbreak $counter == 1}  {* σπάει το πρόγραμμα αν ικανοποιείται η συνθήκη *}
```


`{do}`
------

Εκτελεί τον κώδικα PHP και δεν εκτυπώνει τίποτα. Όπως και με όλες τις άλλες ετικέτες, ο κώδικας PHP είναι μια ενιαία έκφραση, βλέπε [περιορισμοί PHP |syntax#PHP Limitations in Latte].

```latte
{do $num++}
```


`{dump}`
--------

Απορρίπτει μια μεταβλητή ή το τρέχον πλαίσιο.

```latte
{dump $name} {* Απορρίπτει τη μεταβλητή $name *}

{dump}       {* Απορρίπτει όλες τις καθορισμένες μεταβλητές *}
```

.[caution]
Απαιτεί το πακέτο [Tracy |tracy:en].


`{php}`
-------

Σας επιτρέπει να εκτελέσετε οποιοδήποτε κώδικα PHP. Η ετικέτα πρέπει να ενεργοποιηθεί χρησιμοποιώντας την επέκταση [RawPhpExtension |develop#RawPhpExtension].


`{spaceless}`
-------------

Αφαιρεί τα περιττά κενά διαστήματα. Είναι παρόμοιο με το φίλτρο [χωρίς κενά |filters#spaceless].

```latte
{spaceless}
	<ul>
		<li>Hello</li>
	</ul>
{/spaceless}
```

Έξοδοι:

```latte
<ul> <li>Hello</li> </ul>
```

Η ετικέτα μπορεί επίσης να γραφτεί ως [n:attribute |syntax#n:attributes]:


`{syntax}`
----------

Οι ετικέτες Latte δεν χρειάζεται να περικλείονται μόνο σε μονές αγκύλες. Μπορείτε να επιλέξετε άλλο διαχωριστικό, ακόμη και κατά την εκτέλεση. Αυτό γίνεται με το `{syntax…}`, όπου η παράμετρος μπορεί να είναι:

- double: `{{...}}`
- off: απενεργοποιεί εντελώς τις ετικέτες Latte

Χρησιμοποιώντας τον συμβολισμό n:attribute μπορούμε να απενεργοποιήσουμε το Latte μόνο για ένα μπλοκ JavaScript:

```latte
<script n:syntax="off">
	var obj = {var: 123}; // this isn't a tag any more
</script>
```

Το Latte μπορεί να χρησιμοποιηθεί πολύ άνετα μέσα στη JavaScript, απλώς αποφύγετε κατασκευές όπως σε αυτό το παράδειγμα, όπου το γράμμα ακολουθεί αμέσως μετά το `{`, βλέπε [Latte μέσα στη JavaScript ή CSS |recipes#Latte inside JavaScript or CSS].

Αν απενεργοποιήσετε το Latte με το `{syntax off}` (δηλαδή την ετικέτα, όχι το χαρακτηριστικό n:attribute), θα αγνοήσει αυστηρά όλες τις ετικέτες μέχρι το `{/syntax}`.


{trace}
-------

Εκτοξεύει μια εξαίρεση `Latte\RuntimeException`, της οποίας το ίχνος στοίβας είναι στο πνεύμα των προτύπων. Έτσι, αντί για κλήση συναρτήσεων και μεθόδων, περιλαμβάνει κλήση μπλοκ και εισαγωγή προτύπων. Αν χρησιμοποιείτε ένα εργαλείο για την ευκρινή εμφάνιση των πεταμένων εξαιρέσεων, όπως το [Tracy |tracy:en], θα δείτε καθαρά τη στοίβα κλήσης, συμπεριλαμβανομένων όλων των ορίων που έχουν περάσει.


Βοηθοί ετικετών HTML .[#toc-html-tag-helpers]
=============================================


n:class .[#toc-n-class]
-----------------------

Χάρη στο `n:class`, είναι πολύ εύκολο να δημιουργήσετε το χαρακτηριστικό HTML `class` ακριβώς όπως το χρειάζεστε.

Παράδειγμα: Θέλω το ενεργό στοιχείο να έχει την κλάση `active`:

```latte
{foreach $items as $item}
	<a n:class="$item->isActive() ? active">...</a>
{/foreach}
```

Και επιπλέον θέλω το πρώτο στοιχείο να έχει τις κλάσεις `first` και `main`:

```latte
{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main'">...</a>
{/foreach}
```

Και όλα τα στοιχεία πρέπει να έχουν την κλάση `list-item`:

```latte
{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main', list-item">...</a>
{/foreach}
```

Δεν είναι εκπληκτικά απλό;


n:attr .[#toc-n-attr]
---------------------

Το χαρακτηριστικό `n:attr` μπορεί να δημιουργήσει αυθαίρετα χαρακτηριστικά HTML με την ίδια κομψότητα όπως το [n:class |#n:class].

```latte
{foreach $data as $item}
	<input type="checkbox" n:attr="value: $item->getValue(), checked: $item->isActive()">
{/foreach}
```

Ανάλογα με τις επιστρεφόμενες τιμές, εμφανίζει π.χ:

```latte
<input type="checkbox">

<input type="checkbox" value="Hello">

<input type="checkbox" value="Hello" checked>
```


n:tag .[#toc-n-tag]
-------------------

Το χαρακτηριστικό `n:tag` μπορεί να αλλάξει δυναμικά το όνομα ενός στοιχείου HTML.

```latte
<h1 n:tag="$heading" class="main">{$title}</h1>
```

Εάν `$heading === null`, το `<h1>` εκτυπώνεται χωρίς αλλαγή. Διαφορετικά, το όνομα του στοιχείου αλλάζει με την τιμή της μεταβλητής, οπότε για το `$heading === 'h3'` γράφει:

```latte
<h3 class="main">...</h3>
```

Επειδή το Latte είναι ένα ασφαλές σύστημα διαμόρφωσης προτύπων, ελέγχει ότι το όνομα της νέας ετικέτας είναι έγκυρο και δεν περιέχει ανεπιθύμητες ή κακόβουλες τιμές.


n:ifcontent .[#toc-n-ifcontent]
-------------------------------

Αποτρέπει την εκτύπωση ενός κενού στοιχείου HTML, δηλαδή ενός στοιχείου που δεν περιέχει τίποτα άλλο εκτός από κενά.

```latte
<div>
	<div class="error" n:ifcontent>{$error}</div>
</div>
```

Ανάλογα με τις τιμές της μεταβλητής `$error` αυτό θα εκτυπωθεί:

```latte
{* $error = '' *}
<div>
</div>

{* $error = 'Required' *}
<div>
	<div class="error">Required</div>
</div>
```


Μετάφραση .[#toc-translation]
=============================

Για να λειτουργήσουν οι ετικέτες μετάφρασης, πρέπει να [ρυθμίσετε το μεταφραστή |develop#TranslatorExtension]. Μπορείτε επίσης να χρησιμοποιήσετε το [`translate` |filters#translate] φίλτρο για τη μετάφραση.


`{_...}`
--------

Μεταφράζει τις τιμές σε άλλες γλώσσες.

```latte
<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>
```

Στον μεταφραστή μπορούν επίσης να μεταβιβαστούν και άλλες παράμετροι:

```latte
<a href="basket">{_'Basket', domain: order}</a>
```


`{translate}`
-------------

Překládá části šablony:

```latte
<h1>{translate}Order{/translate}</h1>

{translate domain: order}Lorem ipsum ...{/translate}
```

 [attribute |syntax#n:attributes], για να μεταφραστεί το εσωτερικό του στοιχείου:

```latte
<h1 n:translate>Order</h1>
```

Ετικέτες Latte

Περίληψη και περιγραφή όλων των ενσωματωμένων ετικετών Latte.

Εκτύπωση
{$var}, {...} ή {=...} εκτυπώνει μια μεταβλητή ή έκφραση με διαφυγή
{$var|filter} εκτυπώνει με φίλτρα
{l} ή {r} εκτυπώνει χαρακτήρα { or }
Συνθήκες
{if}{elseif}{else}{/if} condition if
{ifset}{elseifset}{/ifset} συνθήκη ifset
{ifchanged}{/ifchanged} test if there has been a change
{switch} {case} {default} {/switch} condition switch
n:else εναλλακτικό περιεχόμενο για τους όρους
Βρόχοι
{foreach}{/foreach} foreach
{for}{/for} for
{while}{/while} while
{continueIf $cond} συνέχεια στην επόμενη επανάληψη
{skipIf $cond} παράλειψη της τρέχουσας επανάληψης του βρόχου
{breakIf $cond} διακόπτει το βρόχο
{exitIf $cond} πρόωρη έξοδος
{first}{/first} είναι η πρώτη επανάληψη;
{last}{/last} είναι η τελευταία επανάληψη;
{sep}{/sep} θα ακολουθήσει επόμενη επανάληψη;
{iterateWhile}{/iterateWhile} structured foreach
$iterator ειδική μεταβλητή μέσα στο βρόχο foreach
Συμπερίληψη άλλων προτύπων
{include 'file.latte'} περιλαμβάνει ένα πρότυπο από άλλο αρχείο
{sandbox 'file.latte'} περιλαμβάνει ένα πρότυπο σε λειτουργία sandbox
Μπλοκ, διατάξεις, κληρονομικότητα προτύπων
{block} ανώνυμο μπλοκ
{block blockname} ορισμός μπλοκ
{define blockname} ορισμός μπλοκ για μελλοντική χρήση
{include blockname} εκτυπώσεις μπλοκ
{include blockname from 'file.latte'} εκτυπώνει ένα μπλοκ από αρχείο
{import 'file.latte'} φορτώνει μπλοκ από άλλο πρότυπο
{layout 'file.latte'} / {extends} καθορίζει ένα αρχείο διάταξης
{embed}{/embed} φορτώνει το πρότυπο ή το μπλοκ και σας επιτρέπει να αντικαταστήσετε τα μπλοκ
{ifset blockname}{/ifset} συνθήκη αν έχει οριστεί μπλοκ
Χειρισμός εξαιρέσεων
{try}{else}{/try} αντιμετώπιση εξαιρέσεων
{rollback} απορρίπτει το μπλοκ try
Μεταβλητές
{var $foo = value} δημιουργία μεταβλητών
{default $foo = value} προεπιλεγμένη τιμή όταν η μεταβλητή δεν έχει δηλωθεί
{parameters} δηλώνει μεταβλητές, τύπους και προεπιλεγμένες τιμές
{capture}{/capture} αποτυπώνει ένα τμήμα σε μια μεταβλητή
Τύποι
{varType} δηλώνει τον τύπο της μεταβλητής
{varPrint} προτείνει τύπους μεταβλητών
{templateType} δηλώνει τύπους μεταβλητών χρησιμοποιώντας κλάση
{templatePrint} δημιουργεί κλάση με ιδιότητες
Μετάφραση
{_string} εκτυπώνει μεταφρασμένα
{translate}{/translate} μεταφράζει το περιεχόμενο
Άλλοι
{contentType} αλλάζει τον τρόπο διαφυγής και στέλνει επικεφαλίδα HTTP
{debugbreak} θέτει σημείο διακοπής στον κώδικα
{do} αξιολογεί μια έκφραση χωρίς να την εκτυπώσει
{dump} Απορρίπτει μεταβλητές στη γραμμή Tracy Bar
{php} εκτελεί οποιονδήποτε κώδικα PHP
{spaceless}{/spaceless} αφαιρεί τα περιττά κενά διαστήματα
{syntax} αλλάζει τη σύνταξη κατά την εκτέλεση
{trace} εμφανίζει ίχνος στοίβας
Βοηθοί ετικετών HTML
n:class έξυπνο χαρακτηριστικό κλάσης
n:attr έξυπνα χαρακτηριστικά HTML
n:tag δυναμικό όνομα στοιχείου HTML
n:ifcontent Παράλειψη κενής ετικέτας HTML
Διαθέσιμο μόνο στο Nette Framework
n:href σύνδεσμος σε στοιχεία HTML <a>
{link} εκτυπώνει έναν σύνδεσμο
{plink} εκτυπώνει έναν σύνδεσμο προς έναν παρουσιαστή
{control} εκτυπώνει ένα στοιχείο
{snippet}{/snippet} ένα απόσπασμα προτύπου που μπορεί να σταλεί μέσω AJAX
{snippetArea} φάκελος αποσπασμάτων
{cache}{/cache} προσωρινή αποθήκευση ενός τμήματος προτύπου
Διαθέσιμο μόνο με Nette Forms
{form}{/form} εκτυπώνει ένα στοιχείο φόρμας
{label}{/label} εκτυπώνει μια ετικέτα εισόδου φόρμας
{input} εκτυπώνει ένα στοιχείο εισόδου φόρμας
{inputError} εκτυπώνει μήνυμα σφάλματος για το στοιχείο εισόδου φόρμας
n:name ενεργοποιεί ένα στοιχείο εισόδου HTML
{formContainer}{/formContainer} απόδοση του δοχείου της φόρμας

Εκτύπωση

{$var} {...} {=...}

Η Latte χρησιμοποιεί την ετικέτα {=...} για να εκτυπώσει οποιαδήποτε έκφραση στην έξοδο. Εάν η έκφραση αρχίζει με μια μεταβλητή ή κλήση συνάρτησης, δεν χρειάζεται να γράψετε ένα σύμβολο ισότητας. Το οποίο στην πράξη σημαίνει ότι δεν χρειάζεται σχεδόν ποτέ να γραφτεί:

Name: {$name} {$surname}<br>
Age: {date('Y') - $birth}<br>

Μπορείτε να γράψετε οτιδήποτε γνωρίζετε από την PHP ως έκφραση. Απλά δεν χρειάζεται να μάθετε μια νέα γλώσσα. Για παράδειγμα:

{='0' . ($num ?? $num * 3) . ', ' . PHP_VERSION}

αλλά αν βρείτε κάποιο εκεί, γράψτε μας :-)

Διαφυγή εξόδου

Ποια είναι η πιο σημαντική εργασία ενός συστήματος προτύπων; Η αποφυγή κενών ασφαλείας. Και αυτό ακριβώς κάνει το Latte κάθε φορά που εκτυπώνετε κάτι στην έξοδο. Αποφεύγει αυτόματα τα πάντα:

<p>{='one < two'}</p>   {* prints: '<p>one &lt; two</p>' *}

Για να είμαστε ακριβείς, το Latte χρησιμοποιεί το context-sensitive escaping, το οποίο είναι ένα τόσο σημαντικό και μοναδικό χαρακτηριστικό που του έχουμε αφιερώσει ένα ξεχωριστό κεφάλαιο.

Και αν εκτυπώνετε περιεχόμενο κωδικοποιημένο σε HTML από αξιόπιστη πηγή; Τότε μπορείτε εύκολα να απενεργοποιήσετε τη διαφυγή:

{$trustedHtmlString|noescape}

Η κατάχρηση του φίλτρου noescape μπορεί να οδηγήσει σε ευπάθεια XSS! Ποτέ μην το χρησιμοποιείτε, εκτός αν είστε απολύτως σίγουροι για το τι κάνετε και ότι η συμβολοσειρά που εκτυπώνετε προέρχεται από αξιόπιστη πηγή.

Εκτύπωση σε JavaScript

Χάρη στο context-sensitive escaping, είναι θαυμάσια εύκολο να εκτυπώσετε μεταβλητές μέσα στη JavaScript, και το Latte θα τις αποφύγει σωστά.

Η μεταβλητή δεν χρειάζεται να είναι συμβολοσειρά, υποστηρίζεται οποιοσδήποτε τύπος δεδομένων, ο οποίος στη συνέχεια κωδικοποιείται ως JSON:

{var $foo = ['hello', true, 1]}
<script>
	alert({$foo});
</script>

Παράγει:

<script>
	alert(["hello", true, 1]);
</script>

Μην βάζετε τη μεταβλητή σε εισαγωγικά**: Latte τα προσθέτει γύρω από τις συμβολοσειρές. Και αν θέλετε να βάλετε μια μεταβλητή συμβολοσειράς μέσα σε μια άλλη συμβολοσειρά, απλά συνδέστε τις:

<script>
	alert('Hello ' + {$name} + '!');  // OK

	alert({="Hello $name!"});         // OK

	alert('Hello {$name} !');         // ERROR!
</script>

Φίλτρα

Η εκτυπωμένη έκφραση μπορεί να τροποποιηθεί με φίλτρα. Για παράδειγμα, αυτό το παράδειγμα μετατρέπει τη συμβολοσειρά σε κεφαλαία γράμματα και τη συντομεύει σε 30 χαρακτήρες το πολύ:

{$string|upper|truncate:30}

Μπορείτε επίσης να εφαρμόσετε φίλτρα σε τμήματα μιας έκφρασης ως εξής:

{$left . ($middle|upper) . $right}

Συνθήκες

{if} {elseif} {else}

Οι συνθήκες συμπεριφέρονται με τον ίδιο τρόπο όπως οι αντίστοιχες της PHP. Μπορείτε να χρησιμοποιήσετε τις ίδιες εκφράσεις που γνωρίζετε από την PHP, δεν χρειάζεται να μάθετε μια νέα γλώσσα.

{if $product->inStock > Stock::Minimum}
	In stock
{elseif $product->isOnWay()}
	On the way
{else}
	Not available
{/if}

Όπως κάθε ετικέτα pair, ένα ζεύγος {if} ... {/ if} μπορεί να γραφτεί ως n:attribute, για παράδειγμα:

<p n:if="$count > 0">In stock {$count} items</p>

Γνωρίζετε ότι μπορείτε να προσθέσετε το πρόθεμα tag- σε n:attributes; Τότε η συνθήκη θα επηρεάζει μόνο τις ετικέτες HTML και το περιεχόμενο μεταξύ τους θα εκτυπώνεται πάντα:

<a href="..." n:tag-if="$clickable">Hello</a>

{* prints 'Hello' when $clickable is falsey *}
{* prints '<a href="...">Hello</a>' when $clickable is truthy *}

Ωραία.

n:else

Αν γράψετε τη συνθήκη {if} ... {/if} με τη μορφή ενός n:attribute, έχετε τη δυνατότητα να καθορίσετε μια εναλλακτική διακλάδωση χρησιμοποιώντας το n:else:

<strong n:if="$count > 0">In stock {$count} items</strong>

<em n:else>not available</em>

Το χαρακτηριστικό n:else μπορεί επίσης να χρησιμοποιηθεί σε συνδυασμό με το n:ifset, n:foreach, n:try, n:ifcontent, και n:ifchanged.

{/if $cond}

Μπορεί να εκπλαγείτε από το γεγονός ότι η έκφραση στη συνθήκη {if} μπορεί επίσης να καθοριστεί στην ετικέτα end. Αυτό είναι χρήσιμο σε περιπτώσεις όπου δεν γνωρίζουμε ακόμα την τιμή της συνθήκης όταν ανοίγει η ετικέτα. Ας το ονομάσουμε αναβαλλόμενη απόφαση.

Για παράδειγμα, ξεκινάμε την απαρίθμηση ενός πίνακα με εγγραφές από τη βάση δεδομένων και μόνο μετά την ολοκλήρωση της αναφοράς συνειδητοποιούμε ότι δεν υπήρχε καμία εγγραφή στη βάση δεδομένων. Έτσι, βάζουμε συνθήκη στο τέλος της ετικέτας {/if} και αν δεν υπάρχει εγγραφή, δεν θα εκτυπωθεί τίποτα από αυτά:

{if}
	<h1>Printing rows from the database</h1>

	<table>
	{foreach $resultSet as $row}
		...
	{/foreach}
	</table>
{/if isset($row)}

Δεν είναι πρακτικό;

Μπορείτε επίσης να χρησιμοποιήσετε το {else} στην αναβαλλόμενη συνθήκη, αλλά όχι το {elseif}.

{ifset} {elseifset}

Βλέπε επίσης {ifset block}

Χρησιμοποιήστε τη συνθήκη {ifset $var} για να προσδιορίσετε αν μια μεταβλητή (ή πολλαπλές μεταβλητές) υπάρχει και έχει μη μηδενική τιμή. Στην πραγματικότητα είναι το ίδιο με το if (isset($var)) στην PHP. Όπως κάθε ετικέτα pair, μπορεί να γραφτεί με τη μορφή n:attribute, οπότε ας το δείξουμε σε παράδειγμα:

<meta name="robots" content={$robots} n:ifset="$robots">

{ifchanged}

{ifchanged} ελέγχει αν η τιμή μιας μεταβλητής έχει αλλάξει από την τελευταία επανάληψη του βρόχου (foreach, for ή while).

Αν καθορίσουμε μία ή περισσότερες μεταβλητές στην ετικέτα, θα ελέγξει αν κάποια από αυτές έχει αλλάξει και θα εκτυπώσει τα περιεχόμενα ανάλογα. Για παράδειγμα, το ακόλουθο παράδειγμα εκτυπώνει το πρώτο γράμμα ενός ονόματος ως επικεφαλίδα κάθε φορά που αλλάζει κατά την καταχώριση ονομάτων:

{foreach ($names|sort) as $name}
	{ifchanged $name[0]} <h2>{$name[0]}</h2> {/ifchanged}

	<p>{$name}</p>
{/foreach}

Ωστόσο, αν δεν δοθεί κανένα όρισμα, το ίδιο το περιεχόμενο που αποδίδεται θα ελεγχθεί σε σχέση με την προηγούμενη κατάστασή του. Αυτό σημαίνει ότι στο προηγούμενο παράδειγμα, μπορούμε με ασφάλεια να παραλείψουμε το όρισμα στην ετικέτα. Και φυσικά μπορούμε επίσης να χρησιμοποιήσουμε το n:attribute:

{foreach ($names|sort) as $name}
	<h2 n:ifchanged>{$name[0]}</h2>

	<p>{$name}</p>
{/foreach}

Μπορείτε επίσης να συμπεριλάβετε μια ρήτρα {else} μέσα στο {ifchanged}.

{switch} {case} {default}

Συγκρίνει την τιμή με πολλαπλές επιλογές. Είναι παρόμοια με τη δομή switch που γνωρίζετε από την PHP. Ωστόσο, η Latte τη βελτιώνει:

  • χρησιμοποιεί αυστηρή σύγκριση (===)
  • δεν χρειάζεται μια break

Έτσι είναι το ακριβές ισοδύναμο της δομής match που διαθέτει η PHP 8.0.

{switch $transport}
	{case train}
		By train
	{case plane}
		By plane
	{default}
		Differently
{/switch}

Η ρήτρα {case} μπορεί να περιέχει πολλαπλές τιμές που χωρίζονται με κόμμα:

{switch $status}
{case $status::New}<b>new item</b>
{case $status::Sold, $status::Unknown}<i>not available</i>
{/switch}

Βρόχοι

Στο Latte, όλοι οι βρόχοι που γνωρίζετε από την PHP είναι στη διάθεσή σας: foreach, for και while.

{foreach}

Γράφετε τον κύκλο με τον ίδιο ακριβώς τρόπο όπως και στην PHP:

{foreach $langs as $code => $lang}
	<span>{$lang}</span>
{/foreach}

Επιπλέον, έχει κάποιες εύχρηστες βελτιώσεις για τις οποίες θα μιλήσουμε τώρα.

Για παράδειγμα, ο Latte ελέγχει ότι οι μεταβλητές που δημιουργούνται δεν αντικαθιστούν κατά λάθος παγκόσμιες μεταβλητές με το ίδιο όνομα. Αυτό θα σας σώσει όταν υποθέτετε ότι η $lang είναι η τρέχουσα γλώσσα της σελίδας και δεν αντιλαμβάνεστε ότι η foreach $langs as $lang έχει αντικαταστήσει αυτή τη μεταβλητή.

Ο βρόχος foreach μπορεί επίσης να γραφτεί πολύ κομψά και οικονομικά με το n:attribute:

<ul>
	<li n:foreach="$items as $item">{$item->name}</li>
</ul>

Γνωρίζατε ότι μπορείτε να προτάξετε το πρόθεμα inner- στο n:attributes; Τώρα τότε μόνο το εσωτερικό μέρος του στοιχείου θα επαναλαμβάνεται στο βρόχο:

<div n:inner-foreach="$items as $item">
	<h4>{$item->title}</h4>
	<p>{$item->description}</p>
</div>

Έτσι, εκτυπώνεται κάτι σαν:

<div>
	<h4>Foo</h4>
	<p>Lorem ipsum.</p>
	<h4>Bar</h4>
	<p>Sit dolor.</p>
</div>

{else}

Ο βρόχος foreach μπορεί να λάβει μια προαιρετική ρήτρα {else} της οποίας το κείμενο εμφανίζεται εάν ο δεδομένος πίνακας είναι άδειος:

<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sorry, no users in this list</em></li>
	{/foreach}
</ul>

$iterator

Μέσα στο βρόχο foreach αρχικοποιείται η μεταβλητή $iterator. Διατηρεί σημαντικές πληροφορίες σχετικά με τον τρέχοντα βρόχο.

  • $iterator->first – είναι αυτή η πρώτη επανάληψη;
  • $iterator->last – είναι αυτή η τελευταία επανάληψη;
  • $iterator->counter – μετρητής επανάληψης, ξεκινά από το 1
  • $iterator->counter0 – μετρητής επανάληψης, ξεκινά από 0
  • $iterator->odd – είναι αυτή η επανάληψη περιττή;
  • $iterator->even – είναι αυτή η επανάληψη άρτια;
  • $iterator->parent – ο επαναλήπτης που περιβάλλει τον τρέχοντα
  • $iterator->nextValue – το επόμενο στοιχείο του βρόχου
  • $iterator->nextKey – το κλειδί του επόμενου στοιχείου του βρόχου
{foreach $rows as $row}
	{if $iterator->first}<table>{/if}

	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>

	{if $iterator->last}</table>{/if}
{/foreach}

Ο λάτε είναι έξυπνος και το $iterator->last λειτουργεί όχι μόνο για πίνακες, αλλά και όταν ο βρόχος εκτελείται πάνω σε έναν γενικό επαναλήπτη όπου ο αριθμός των στοιχείων δεν είναι γνωστός εκ των προτέρων.

{first} {last} {sep}

Αυτές οι ετικέτες μπορούν να χρησιμοποιηθούν μέσα στο βρόχο {foreach}. Τα περιεχόμενα του {first} αποδίδονται για το πρώτο πέρασμα. Τα περιεχόμενα του {last} αποδίδονται … μπορείτε να μαντέψετε; Ναι, για το τελευταίο πέρασμα. Αυτές είναι στην πραγματικότητα συντομεύσεις για τις ετικέτες {if $iterator->first} και {if $iterator->last}.

Οι ετικέτες μπορούν επίσης να γραφούν ως n:attributes:

{foreach $rows as $row}
	{first}<h1>List of names</h1>{/first}

	<p>{$row->name}</p>

	<hr n:last>
{/foreach}

Τα περιεχόμενα του {sep} αποδίδονται εάν η επανάληψη δεν είναι η τελευταία, οπότε είναι κατάλληλο για την εκτύπωση οριοθετών, όπως κόμματα μεταξύ των παρατιθέμενων στοιχείων:

{foreach $items as $item} {$item} {sep}, {/sep} {/foreach}

Αυτό είναι αρκετά πρακτικό, έτσι δεν είναι;

{iterateWhile}

Απλοποιεί την ομαδοποίηση των γραμμικών δεδομένων κατά την επανάληψη σε έναν βρόχο foreach, εκτελώντας την επανάληψη σε έναν εμφωλευμένο βρόχο εφόσον ικανοποιείται η συνθήκη. Διαβάστε τις οδηγίες στο βιβλίο μαγειρικής.

Μπορεί επίσης να αντικαταστήσει κομψά τα {first} και {last} στο παραπάνω παράδειγμα:

{foreach $rows as $row}
	<table>

	{iterateWhile}
	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>
	{/iterateWhile true}

	</table>
{/foreach}

{for}

Γράφουμε τον κύκλο με τον ίδιο ακριβώς τρόπο όπως και στην PHP:

{for $i = 0; $i < 10; $i++}
	<span>Item #{$i}</span>
{/for}

Η ετικέτα μπορεί επίσης να γραφτεί ως n:attribute:

<h1 n:for="$i = 0; $i < 10; $i++">{$i}</h1>

{while}

Και πάλι, γράφουμε τον κύκλο με τον ίδιο ακριβώς τρόπο όπως και στην PHP:

{while $row = $result->fetch()}
	<span>{$row->title}</span>
{/while}

ή ως n:attribute:

<span n:while="$row = $result->fetch()">
	{$row->title}
</span>

Μια παραλλαγή με συνθήκη στην ετικέτα τέλους αντιστοιχεί στον βρόχο do-while της PHP:

{while}
	<span>{$item->title}</span>
{/while $item = $item->getNext()}

{continueIf} {skipIf} {breakIf}

Υπάρχουν ειδικές ετικέτες που μπορείτε να χρησιμοποιήσετε για τον έλεγχο οποιουδήποτε βρόχου – {continueIf ?} και {breakIf ?} οι οποίες μεταπηδούν στην επόμενη επανάληψη και τερματίζουν τον βρόχο, αντίστοιχα, εάν πληρούνται οι συνθήκες:

{foreach $rows as $row}
	{continueIf $row->date < $now}
	{breakIf $row->parent === null}
	...
{/foreach}

Η ετικέτα {skipIf} μοιάζει πολύ με την {continueIf}, αλλά δεν αυξάνει τον μετρητή. Έτσι δεν υπάρχουν κενά στην αρίθμηση όταν εκτυπώνετε το $iterator->counter και παραλείπετε κάποια στοιχεία. Επίσης, η ρήτρα {else} θα αποδίδεται όταν παραλείπετε όλα τα στοιχεία.

<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sorry, no adult users in this list</em></li>
	{/foreach}
</ul>

{exitIf}

Τερματίζει την απόδοση ενός προτύπου ή μπλοκ όταν ικανοποιείται μια συνθήκη (δηλαδή „πρόωρη έξοδος“).

{exitIf !$messages}

<h1>Messages</h1>
<div n:foreach="$messages as $message">
   {$message}
</div>

Συμπερίληψη προτύπων

{include 'file.latte'}

Βλέπε επίσης {include block}

Η ετικέτα {include} φορτώνει και αποδίδει το καθορισμένο πρότυπο. Στην αγαπημένη μας γλώσσα PHP είναι σαν:

<?php include 'header.phtml'; ?>

Τα περιεχόμενα πρότυπα δεν έχουν πρόσβαση στις μεταβλητές του ενεργού πλαισίου, αλλά έχουν πρόσβαση στις παγκόσμιες μεταβλητές.

Μπορείτε να περάσετε μεταβλητές στο εισαγόμενο πρότυπο με τον ακόλουθο τρόπο:

{include 'template.latte', foo: 'bar', id: 123}

Το όνομα του προτύπου μπορεί να είναι οποιαδήποτε έκφραση της PHP:

{include $someVar}
{include $ajax ? 'ajax.latte' : 'not-ajax.latte'}

Το εισαγόμενο περιεχόμενο μπορεί να τροποποιηθεί με τη χρήση φίλτρων. Το ακόλουθο παράδειγμα αφαιρεί όλα τα στοιχεία HTML και ρυθμίζει την περίπτωση:

<title>{include 'heading.latte' |stripHtml|capitalize}</title>

Η κληρονομικότητα προτύπου δεν εμπλέκεται σε αυτό από προεπιλογή. Ενώ μπορείτε να προσθέσετε ετικέτες μπλοκ σε πρότυπα που περιλαμβάνονται, δεν θα αντικαταστήσουν τα αντίστοιχα μπλοκ στο πρότυπο στο οποίο περιλαμβάνονται. Σκεφτείτε τα includes ως ανεξάρτητα και θωρακισμένα μέρη σελίδων ή ενοτήτων. Αυτή η συμπεριφορά μπορεί να αλλάξει χρησιμοποιώντας τον τροποποιητή with blocks:

{include 'template.latte' with blocks}

Η σχέση μεταξύ του ονόματος αρχείου που καθορίζεται στην ετικέτα και του αρχείου στο δίσκο είναι θέμα του φορτωτή.

{sandbox}

Όταν συμπεριλαμβάνετε ένα πρότυπο που έχει δημιουργηθεί από έναν τελικό χρήστη, θα πρέπει να εξετάσετε το ενδεχόμενο να το κάνετε sandboxing (περισσότερες πληροφορίες στην τεκμηρίωση sandbox):

{sandbox 'untrusted.latte', level: 3, data: $menu}

{block}

Βλέπε επίσης {block name}

Τα μπλοκ χωρίς όνομα χρησιμεύουν στη δυνατότητα εφαρμογής φίλτρων σε ένα τμήμα του προτύπου. Για παράδειγμα, μπορείτε να εφαρμόσετε ένα φίλτρο strip για να αφαιρέσετε τα περιττά κενά:

{block|strip}
<ul>
	<li>Hello World</li>
</ul>
{/block}

Χειρισμός εξαιρέσεων

{try}

Αυτή η ετικέτα καθιστά εξαιρετικά εύκολη την κατασκευή ισχυρών προτύπων.

Εάν προκύψει μια εξαίρεση κατά την απόδοση του μπλοκ {try}, ολόκληρο το μπλοκ απορρίπτεται και η απόδοση θα συνεχιστεί μετά από αυτό:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
{/try}

Τα περιεχόμενα της προαιρετικής ρήτρας {else} αποδίδονται μόνο όταν εμφανιστεί εξαίρεση:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sorry, the tweets could not be loaded.</p>
{/try}

Η ετικέτα μπορεί επίσης να γραφτεί ως n:attribute:

<ul n:try>
	...
</ul>

Είναι επίσης δυνατό να ορίσετε δικό σας χειριστή εξαιρέσεων για π.χ. καταγραφή:

{rollback}

Το μπλοκ {try} μπορεί επίσης να σταματήσει και να παραλειφθεί χειροκίνητα χρησιμοποιώντας το {rollback}. Έτσι, δεν χρειάζεται να ελέγξετε εκ των προτέρων όλα τα δεδομένα εισόδου και μόνο κατά τη διάρκεια της απόδοσης μπορείτε να αποφασίσετε αν έχει νόημα να αποδοθεί το αντικείμενο.

{try}
<ul>
	{foreach $people as $person}
 		{skipIf $person->age < 18}
 		<li>{$person->name}</li>
	{else}
		{rollback}
	{/foreach}
</ul>
{/try}

Μεταβλητές

{var} {default}

Θα δημιουργήσουμε νέες μεταβλητές στο πρότυπο με την ετικέτα {var}:

{var $name = 'John Smith'}
{var $age = 27}

{* Πολλαπλή δήλωση *}
{var $name = 'John Smith', $age = 27}

Η ετικέτα {default} λειτουργεί παρόμοια, με τη διαφορά ότι δημιουργεί μεταβλητές μόνο αν δεν υπάρχουν:

{default $lang = 'cs'}

Μπορείτε επίσης να καθορίσετε τύπους μεταβλητών. Προς το παρόν, είναι πληροφοριακές και η Latte δεν τις ελέγχει.

{var string $name = $article->getTitle()}
{default int $id = 0}

{parameters}

Ακριβώς όπως μια συνάρτηση δηλώνει τις παραμέτρους της, ένα πρότυπο μπορεί να δηλώσει τις μεταβλητές του στην αρχή του:

{parameters
	$a,
	?int $b,
	int|string $c = 10
}

Οι μεταβλητές $a και $b χωρίς προεπιλεγμένη τιμή έχουν αυτόματα την προεπιλεγμένη τιμή null. Οι δηλωμένοι τύποι εξακολουθούν να είναι πληροφοριακοί και το Latte δεν τους ελέγχει.

Εκτός από τις δηλωμένες μεταβλητές δεν περνούν στο πρότυπο. Αυτή είναι μια διαφορά από την ετικέτα {default}.

{capture}

Χρησιμοποιώντας την ετικέτα {capture} μπορείτε να αποτυπώσετε την έξοδο σε μια μεταβλητή:

{capture $var}
<ul>
	<li>Hello World</li>
</ul>
{/capture}

<p>Captured: {$var}</p>

Η ετικέτα μπορεί επίσης να γραφτεί ως n:attribute, όπως κάθε ετικέτα ανά ζεύγη:

<ul n:capture="$var">
	<li>Hello World</li>
</ul>

Η έξοδος HTML αποθηκεύεται στη μεταβλητή $var ως αντικείμενο Latte\Runtime\Html για να αποφευχθεί η ανεπιθύμητη διαφυγή κατά την εκτύπωση.

Άλλοι

{contentType}

Χρησιμοποιήστε την ετικέτα για να καθορίσετε τον τύπο περιεχομένου που αντιπροσωπεύει το πρότυπο. Οι επιλογές είναι οι εξής:

  • html (προεπιλεγμένος τύπος)
  • xml
  • javascript
  • css
  • calendar (iCal)
  • text

Η χρήση του είναι σημαντική, διότι θέτει τη διαφυγή σε συνάρτηση με το περιβάλλον και μόνο τότε μπορεί το Latte να διαφύγει σωστά. Για παράδειγμα, το {contentType xml} μεταβαίνει σε λειτουργία XML, το {contentType text} απενεργοποιεί εντελώς την αποφυγή διαφυγής.

Εάν η παράμετρος είναι ένας τύπος MIME με πλήρεις δυνατότητες, όπως το application/xml, στέλνει επίσης μια επικεφαλίδα HTTP Content-Type στο πρόγραμμα περιήγησης:

{contentType application/xml}
<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>RSS feed</title>
		<item>
			...
		</item>
	</channel>
</rss>

{debugbreak}

Καθορίζει το σημείο στο οποίο θα διακοπεί η εκτέλεση του κώδικα. Χρησιμοποιείται για σκοπούς αποσφαλμάτωσης για να επιθεωρήσει ο προγραμματιστής το περιβάλλον εκτέλεσης και να διασφαλίσει ότι ο κώδικας εκτελείται όπως αναμένεται. Υποστηρίζει το Xdebug. Επιπλέον, μπορείτε να καθορίσετε μια συνθήκη κατά την οποία ο κώδικας θα πρέπει να διακόπτεται.

{debugbreak}                {* διακόπτει το πρόγραμμα *}

{debugbreak $counter == 1}  {* σπάει το πρόγραμμα αν ικανοποιείται η συνθήκη *}

{do}

Εκτελεί τον κώδικα PHP και δεν εκτυπώνει τίποτα. Όπως και με όλες τις άλλες ετικέτες, ο κώδικας PHP είναι μια ενιαία έκφραση, βλέπε περιορισμοί PHP.

{do $num++}

{dump}

Απορρίπτει μια μεταβλητή ή το τρέχον πλαίσιο.

{dump $name} {* Απορρίπτει τη μεταβλητή $name *}

{dump}       {* Απορρίπτει όλες τις καθορισμένες μεταβλητές *}

Απαιτεί το πακέτο Tracy.

{php}

Σας επιτρέπει να εκτελέσετε οποιοδήποτε κώδικα PHP. Η ετικέτα πρέπει να ενεργοποιηθεί χρησιμοποιώντας την επέκταση RawPhpExtension.

{spaceless}

Αφαιρεί τα περιττά κενά διαστήματα. Είναι παρόμοιο με το φίλτρο χωρίς κενά.

{spaceless}
	<ul>
		<li>Hello</li>
	</ul>
{/spaceless}

Έξοδοι:

<ul> <li>Hello</li> </ul>

Η ετικέτα μπορεί επίσης να γραφτεί ως n:attribute:

{syntax}

Οι ετικέτες Latte δεν χρειάζεται να περικλείονται μόνο σε μονές αγκύλες. Μπορείτε να επιλέξετε άλλο διαχωριστικό, ακόμη και κατά την εκτέλεση. Αυτό γίνεται με το {syntax…}, όπου η παράμετρος μπορεί να είναι:

  • double: {{...}}
  • off: απενεργοποιεί εντελώς τις ετικέτες Latte

Χρησιμοποιώντας τον συμβολισμό n:attribute μπορούμε να απενεργοποιήσουμε το Latte μόνο για ένα μπλοκ JavaScript:

<script n:syntax="off">
	var obj = {var: 123}; // this isn't a tag any more
</script>

Το Latte μπορεί να χρησιμοποιηθεί πολύ άνετα μέσα στη JavaScript, απλώς αποφύγετε κατασκευές όπως σε αυτό το παράδειγμα, όπου το γράμμα ακολουθεί αμέσως μετά το {, βλέπε Latte μέσα στη JavaScript ή CSS.

Αν απενεργοποιήσετε το Latte με το {syntax off} (δηλαδή την ετικέτα, όχι το χαρακτηριστικό n:attribute), θα αγνοήσει αυστηρά όλες τις ετικέτες μέχρι το {/syntax}.

{trace}

Εκτοξεύει μια εξαίρεση Latte\RuntimeException, της οποίας το ίχνος στοίβας είναι στο πνεύμα των προτύπων. Έτσι, αντί για κλήση συναρτήσεων και μεθόδων, περιλαμβάνει κλήση μπλοκ και εισαγωγή προτύπων. Αν χρησιμοποιείτε ένα εργαλείο για την ευκρινή εμφάνιση των πεταμένων εξαιρέσεων, όπως το Tracy, θα δείτε καθαρά τη στοίβα κλήσης, συμπεριλαμβανομένων όλων των ορίων που έχουν περάσει.

Βοηθοί ετικετών HTML

n:class

Χάρη στο n:class, είναι πολύ εύκολο να δημιουργήσετε το χαρακτηριστικό HTML class ακριβώς όπως το χρειάζεστε.

Παράδειγμα: Θέλω το ενεργό στοιχείο να έχει την κλάση active:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active">...</a>
{/foreach}

Και επιπλέον θέλω το πρώτο στοιχείο να έχει τις κλάσεις first και main:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main'">...</a>
{/foreach}

Και όλα τα στοιχεία πρέπει να έχουν την κλάση list-item:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main', list-item">...</a>
{/foreach}

Δεν είναι εκπληκτικά απλό;

n:attr

Το χαρακτηριστικό n:attr μπορεί να δημιουργήσει αυθαίρετα χαρακτηριστικά HTML με την ίδια κομψότητα όπως το n:class.

{foreach $data as $item}
	<input type="checkbox" n:attr="value: $item->getValue(), checked: $item->isActive()">
{/foreach}

Ανάλογα με τις επιστρεφόμενες τιμές, εμφανίζει π.χ:

<input type="checkbox">

<input type="checkbox" value="Hello">

<input type="checkbox" value="Hello" checked>

n:tag

Το χαρακτηριστικό n:tag μπορεί να αλλάξει δυναμικά το όνομα ενός στοιχείου HTML.

<h1 n:tag="$heading" class="main">{$title}</h1>

Εάν $heading === null, το <h1> εκτυπώνεται χωρίς αλλαγή. Διαφορετικά, το όνομα του στοιχείου αλλάζει με την τιμή της μεταβλητής, οπότε για το $heading === 'h3' γράφει:

<h3 class="main">...</h3>

Επειδή το Latte είναι ένα ασφαλές σύστημα διαμόρφωσης προτύπων, ελέγχει ότι το όνομα της νέας ετικέτας είναι έγκυρο και δεν περιέχει ανεπιθύμητες ή κακόβουλες τιμές.

n:ifcontent

Αποτρέπει την εκτύπωση ενός κενού στοιχείου HTML, δηλαδή ενός στοιχείου που δεν περιέχει τίποτα άλλο εκτός από κενά.

<div>
	<div class="error" n:ifcontent>{$error}</div>
</div>

Ανάλογα με τις τιμές της μεταβλητής $error αυτό θα εκτυπωθεί:

{* $error = '' *}
<div>
</div>

{* $error = 'Required' *}
<div>
	<div class="error">Required</div>
</div>

Μετάφραση

Για να λειτουργήσουν οι ετικέτες μετάφρασης, πρέπει να ρυθμίσετε το μεταφραστή. Μπορείτε επίσης να χρησιμοποιήσετε το translate φίλτρο για τη μετάφραση.

{_...}

Μεταφράζει τις τιμές σε άλλες γλώσσες.

<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>

Στον μεταφραστή μπορούν επίσης να μεταβιβαστούν και άλλες παράμετροι:

<a href="basket">{_'Basket', domain: order}</a>

{translate}

Překládá části šablony:

<h1>{translate}Order{/translate}</h1>

{translate domain: order}Lorem ipsum ...{/translate}

attribute, για να μεταφραστεί το εσωτερικό του στοιχείου:

<h1 n:translate>Order</h1>