Nette Documentation Preview

syntax
Tags του Latte
**************
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Tags του Latte

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

Εκτύπωση
{$var}, {...} ή {=...} εκτυπώνει μια μεταβλητή ή έκφραση με διαφυγή
{$var|filter} εκτυπώνει με χρήση φίλτρων
{l} ή {r} εκτυπώνει τον χαρακτήρα { ή }
Συνθήκες
{if}{elseif}{else}{/if} συνθήκη if
{ifset}{elseifset}{/ifset} συνθήκη ifset
{ifchanged}{/ifchanged} έλεγχος αν υπήρξε αλλαγή
{switch} {case} {default} {/switch} συνθήκη 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} δομημένος foreach
$iterator ειδική μεταβλητή μέσα στο foreach
Εισαγωγή άλλων προτύπων
{include 'file.latte'} φορτώνει ένα πρότυπο από άλλο αρχείο
{sandbox 'file.latte'} φορτώνει ένα πρότυπο σε λειτουργία sandbox
Μπλοκ, layouts, κληρονομικότητα προτύπων
{block} ανώνυμο μπλοκ
{block blockname} ορίζει ένα μπλοκ
{define blockname} ορίζει ένα μπλοκ για μεταγενέστερη χρήση
{include blockname} απόδοση μπλοκ
{include blockname from 'file.latte'} αποδίδει ένα μπλοκ από ένα αρχείο
{import 'file.latte'} φορτώνει μπλοκ από ένα πρότυπο
{layout 'file.latte'} / {extends} καθορίζει το αρχείο με το layout
{embed}{/embed} φορτώνει ένα πρότυπο ή μπλοκ και επιτρέπει την αντικατάσταση μπλοκ
{ifset blockname}{/ifset} συνθήκη, εάν υπάρχει μπλοκ
Διαχείριση εξαιρέσεων
{try}{else}{/try} παγίδευση εξαιρέσεων
{rollback} απόρριψη μπλοκ try
Μεταβλητές
{var $foo = value} δημιουργεί μια μεταβλητή
{default $foo = value} δημιουργεί μια μεταβλητή, εάν δεν υπάρχει
{parameters} δηλώνει μεταβλητές, τύπους και προεπιλεγμένες τιμές
{capture}{/capture} συλλαμβάνει ένα μπλοκ σε μια μεταβλητή
Τύποι
{varType} δηλώνει τον τύπο μιας μεταβλητής
{varPrint} προτείνει τύπους μεταβλητών
{templateType} δηλώνει τύπους μεταβλητών σύμφωνα με μια κλάση
{templatePrint} προτείνει μια κλάση με τύπους μεταβλητών
Μεταφράσεις
{_...} εκτυπώνει τη μετάφραση
{translate}{/translate} μεταφράζει το περιεχόμενο
Άλλα
{contentType} αλλάζει το escaping και στέλνει την κεφαλίδα HTTP
{debugbreak} τοποθετεί ένα breakpoint στον κώδικα
{do} εκτελεί κώδικα, αλλά δεν εκτυπώνει τίποτα
{dump} κάνει dump μεταβλητών στο Tracy Bar
{php} εκτελεί οποιονδήποτε κώδικα PHP
{spaceless}{/spaceless} αφαιρεί τα περιττά κενά
{syntax} αλλαγή σύνταξης κατά το χρόνο εκτέλεσης
{trace} εμφανίζει το stack trace
Βοηθοί κωδικοποιητή HTML
n:class δυναμική γραφή του attribute class HTML
n:attr δυναμική γραφή οποιωνδήποτε attributes HTML
n:tag δυναμική γραφή του ονόματος του στοιχείου HTML
n:ifcontent παραλείπει το κενό tag HTML
Διαθέσιμο μόνο στο Nette Framework
n:href σύνδεσμος που χρησιμοποιείται στα στοιχεία HTML <a>
{link} εκτυπώνει έναν σύνδεσμο
{plink} εκτυπώνει έναν σύνδεσμο προς έναν presenter
{control} αποδίδει ένα component
{snippet}{/snippet} απόσπασμα που μπορεί να σταλεί με AJAX
{snippetArea} περιτύλιγμα για αποσπάσματα
{cache}{/cache} κάνει cache ένα μέρος του προτύπου
Διαθέσιμο μόνο με το Nette Forms
{form}{/form} αποδίδει τα tags της φόρμας
{label}{/label} αποδίδει την ετικέτα ενός στοιχείου φόρμας
{input} αποδίδει ένα στοιχείο φόρμας
{inputError} εκτυπώνει το μήνυμα σφάλματος ενός στοιχείου φόρμας
n:name ζωντανεύει ένα στοιχείο φόρμας
{formContainer}{/formContainer} απόδοση ενός container φόρμας

Εκτύπωση

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

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

Όνομα: {$name} {$surname}<br>
Ηλικία: {date('Y') - $birth}<br>

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

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

Παρακαλώ, μην ψάχνετε για νόημα στο προηγούμενο παράδειγμα, αλλά αν βρείτε κάποιο, γράψτε μας :-)

Escaping εξόδου

Ποιο είναι το πιο σημαντικό καθήκον ενός συστήματος προτύπων; Να αποτρέπει τα κενά ασφαλείας. Και ακριβώς αυτό κάνει το Latte πάντα, όταν εκτυπώνετε κάτι. Το κάνει escape αυτόματα:

<p>{='one < two'}</p>   {* εκτυπώνει: '<p>one &lt; two</p>' *}

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

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

{$trustedHtmlString|noescape}

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

Εκτύπωση σε JavaScript

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

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

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

Δημιουργεί:

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

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

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

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

	alert('Hello {$name} !');         // ΣΦΑΛΜΑ!
</script>

Φίλτρα

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

{$string|upper|truncate:30}

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

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

Συνθήκες

{if} {elseif} {else}

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

{if $product->inStock > Stock::Minimum}
	Σε απόθεμα
{elseif $product->isOnWay()}
	Στο δρόμο
{else}
	Μη διαθέσιμο
{/if}

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

<p n:if="$count > 0">Σε απόθεμα {$count} τεμάχια</p>

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

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

{* εκτυπώνει 'Hello' όταν το $clickable είναι ψευδές *}
{* εκτυπώνει '<a href="...">Hello</a>' όταν το $clickable είναι αληθές *}

Θεϊκό.

n:else

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

<strong n:if="$count > 0">Σε απόθεμα {$count} τεμάχια</strong>

<em n:else>μη διαθέσιμο</em>

Το attribute n:else μπορεί επίσης να χρησιμοποιηθεί σε ζεύγος με τα n:ifset, n:foreach, n:try, n:ifcontent και n:ifchanged.

{/if $cond}

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

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

{if}
	<h1>Λίστα γραμμών από τη βάση δεδομένων</h1>

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

Έξυπνο, έτσι δεν είναι;

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

{ifset} {elseifset}

Δείτε επίσης {ifset block}

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

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

{ifchanged}

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

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

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

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

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

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

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

Μέσα στο {ifchanged} μπορεί επίσης να δηλωθεί η ρήτρα {else}.

{switch} {case} {default}

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

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

Είναι δηλαδή το ακριβές ισοδύναμο της δομής match με την οποία έρχεται η PHP 8.0.

{switch $transport}
	{case train}
		Με τρένο
	{case plane}
		Με αεροπλάνο
	{default}
		Διαφορετικά
{/switch}

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

{switch $status}
{case $status::New}<b>νέο στοιχείο</b>
{case $status::Sold, $status::Unknown}<i>μη διαθέσιμο</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>

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

<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>Λυπούμαστε, δεν υπάρχουν χρήστες σε αυτή τη λίστα</em></li>
	{/foreach}
</ul>

$iterator

Μέσα στον βρόχο foreach, το Latte δημιουργεί τη μεταβλητή $iterator, με την οποία μπορούμε να λαμβάνουμε χρήσιμες πληροφορίες για τον τρέχοντα βρόχο:

  • $iterator->first – είναι η πρώτη φορά που διασχίζεται ο βρόχος;
  • $iterator->last – είναι η τελευταία διέλευση;
  • $iterator->counter – πόση είναι η διέλευση μετρώντας από το ένα;
  • $iterator->counter0 – πόση είναι η διέλευση μετρώντας από το μηδέν;
  • $iterator->odd – είναι μονή διέλευση;
  • $iterator->even – είναι ζυγή διέλευση;
  • $iterator->parent – ο iterator που περιβάλλει τον τρέχοντα
  • $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}

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

{first} {last} {sep}

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

Τα tags μπορούν επίσης να χρησιμοποιηθούν κομψά ως n:attribute:

{foreach $rows as $row}
	{first}<h1>Λίστα ονομάτων</h1>{/first}

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

	<hr n:last>
{/foreach}

Το περιεχόμενο του tag {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}

Δείτε επίσης τα φίλτρα batch και group.

{for}

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

{for $i = 0; $i < 10; $i++}
	<span>Στοιχείο {$i}</span>
{/for}

Το tag μπορεί επίσης να χρησιμοποιηθεί ως 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>

Είναι επίσης δυνατή μια παραλλαγή με συνθήκη στο tag τερματισμού, η οποία αντιστοιχεί στον βρόχο do-while στην PHP:

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

{continueIf} {skipIf} {breakIf}

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

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

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

<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Λυπούμαστε, δεν υπάρχουν ενήλικες σε αυτή τη λίστα</em></li>
	{/foreach}
</ul>

{exitIf}

Τερματίζει την απόδοση του προτύπου ή του μπλοκ όταν πληρούται η συνθήκη (το λεγόμενο „early exit“).

{exitIf !$messages}

<h1>Μηνύματα</h1>
<div n:foreach="$messages as $message">
   {$message}
</div>

Εισαγωγή template

{include 'file.latte'}

Δείτε επίσης {include block}

Το tag {include} φορτώνει και αποδίδει το καθορισμένο πρότυπο. Αν μιλούσαμε στη γλώσσα της αγαπημένης μας PHP, είναι κάτι σαν:

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

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

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

{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>

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

{include 'template.latte' with blocks}

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

{sandbox}

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

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

{block}

Δείτε επίσης {block name}

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

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

Διαχείριση εξαιρέσεων

{try}

Χάρη σε αυτό το tag, είναι εξαιρετικά εύκολο να δημιουργείτε ανθεκτικά πρότυπα.

Εάν κατά την απόδοση του μπλοκ {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>Λυπούμαστε, δεν ήταν δυνατή η φόρτωση των tweets.</p>
{/try}

Το tag μπορεί επίσης να χρησιμοποιηθεί ως 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}

Δημιουργούμε νέες μεταβλητές στο template με το tag {var}:

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

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

Το tag {default} λειτουργεί παρόμοια, αλλά δημιουργεί μεταβλητές μόνο εάν δεν υπάρχουν. Εάν η μεταβλητή υπάρχει ήδη και περιέχει την τιμή null, δεν θα αντικατασταθεί:

{default $lang = 'el'}

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

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

{parameters}

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

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

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

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

{capture}

Συλλαμβάνει την έξοδο σε μια μεταβλητή:

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

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

Το tag μπορεί, όπως κάθε ζευγαρωτό tag, να γραφτεί και ως n:attribute:

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

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

Άλλα

{contentType}

Με αυτό το tag καθορίζετε τι τύπο περιεχομένου αντιπροσωπεύει το πρότυπο. Οι επιλογές είναι:

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

Η χρήση του είναι σημαντική, επειδή ορίζει το context-aware escaping και μόνο έτσι μπορεί να κάνει σωστά escape. Για παράδειγμα, το {contentType xml} αλλάζει σε λειτουργία XML, το {contentType text} απενεργοποιεί εντελώς το escaping.

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

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

{debugbreak}

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

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

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

{do}

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

{do $num++}

{dump}

Κάνει dump μια μεταβλητή ή το τρέχον context.

{dump $name} {* Εκτυπώνει τη μεταβλητή $name *}

{dump}       {* Εκτυπώνει όλες τις τρέχουσες ορισμένες μεταβλητές *}

Απαιτεί τη βιβλιοθήκη Tracy.

{php}

Επιτρέπει την εκτέλεση οποιουδήποτε κώδικα PHP. Το tag πρέπει να ενεργοποιηθεί με την επέκταση RawPhpExtension.

{spaceless}

Αφαιρεί το περιττό λευκό διάστημα από την έξοδο. Λειτουργεί παρόμοια με το φίλτρο spaceless.

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

Δημιουργεί

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

Το tag μπορεί επίσης να γραφτεί ως n:attribute.

{syntax}

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

  • double: {{...}}
  • off: απενεργοποιεί εντελώς την επεξεργασία των tags του Latte

Με τη χρήση n:attributes, μπορείτε να απενεργοποιήσετε το Latte για παράδειγμα μόνο για ένα μπλοκ JavaScript:

<script n:syntax="off">
	var obj = {var: 123}; // αυτό δεν είναι πλέον tag
</script>

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

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

{trace}

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

Βοηθοί κωδικοποιητή HTML

n:class

Χάρη στο n:class, μπορείτε πολύ εύκολα να δημιουργήσετε το HTML attribute 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

Το attribute n:attr μπορεί με την ίδια κομψότητα που έχει το n:class να δημιουργεί οποιαδήποτε HTML attributes.

{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

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

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

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

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

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

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>

Μεταφράσεις

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

{_...}

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

<a href="basket">{_'Καλάθι'}</a>
<span>{_$item}</span>

Μπορείτε επίσης να περάσετε επιπλέον παραμέτρους στον μεταφραστή:

<a href="basket">{_'Καλάθι', domain: order}</a>

{translate}

Μεταφράζει τμήματα του προτύπου:

<h1>{translate}Παραγγελία{/translate}</h1>

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

Το tag μπορεί επίσης να γραφτεί ως n:attribute, για μετάφραση του εσωτερικού του στοιχείου:

<h1 n:translate>Παραγγελία</h1>