Σύνταξη

Η σύνταξη του Latte προέκυψε από τις πρακτικές απαιτήσεις των web designers. Αναζητήσαμε την πιο φιλική σύνταξη, με την οποία μπορείτε να γράψετε κομψά ακόμα και κατασκευές που διαφορετικά αποτελούν πραγματικό γρίφο. Ταυτόχρονα, όλες οι εκφράσεις γράφονται ακριβώς όπως στην PHP, οπότε δεν χρειάζεται να μάθετε μια νέα γλώσσα. Απλά αξιοποιείτε ό,τι ήδη γνωρίζετε.

Παρακάτω παρουσιάζεται ένα ελάχιστο πρότυπο που απεικονίζει μερικά βασικά στοιχεία: tags, n:attributes, σχόλια και φίλτρα.

{* αυτό είναι ένα σχόλιο *}
<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.

Το Latte καταλαβαίνει PHP

Μέσα στα tags μπορείτε να χρησιμοποιείτε εκφράσεις PHP που γνωρίζετε καλά:

  • μεταβλητές
  • strings (συμπεριλαμβανομένων HEREDOC και NOWDOC), πίνακες, αριθμούς, κ.λπ.
  • τελεστές
  • κλήσεις συναρτήσεων και μεθόδων (οι οποίες μπορούν να περιοριστούν με sandbox)
  • match
  • ανώνυμες συναρτήσεις
  • callbacks
  • σχόλια πολλαπλών γραμμών /* ... */
  • κ.λπ…

Επιπλέον, το Latte συμπληρώνει τη σύνταξη της PHP με μερικές ευχάριστες επεκτάσεις.

n:attributes

Όλα τα ζευγαρωτά tags, για παράδειγμα {if} … {/if}, που λειτουργούν πάνω σε ένα στοιχείο HTML, μπορούν να ξαναγραφτούν με τη μορφή n:attributes. Με αυτόν τον τρόπο θα μπορούσε να γραφτεί για παράδειγμα και το {foreach} στο εισαγωγικό παράδειγμα:

<ul n:if=$items>
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

Η λειτουργικότητα τότε σχετίζεται με το στοιχείο HTML στο οποίο τοποθετείται:

{var $items = ['I', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

εκτυπώνει:

<p>I</p>
<p>♥</p>
<p>Latte</p>

Χρησιμοποιώντας το πρόθεμα inner-, μπορούμε να τροποποιήσουμε τη συμπεριφορά έτσι ώστε να σχετίζεται μόνο με το εσωτερικό μέρος του στοιχείου:

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

Εκτυπώνεται:

<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Ή χρησιμοποιώντας το πρόθεμα tag-, εφαρμόζουμε τη λειτουργικότητα μόνο στα ίδια τα HTML tags:

<p><a href={$url} n:tag-if="$url">Title</a></p>

Το οποίο εκτυπώνει ανάλογα με τη μεταβλητή $url:

{* όταν το $url είναι κενό *}
<p>Title</p>

{* όταν το $url περιέχει 'https://nette.org' *}
<p><a href="https://nette.org">Title</a></p>

Ωστόσο, τα n:attributes δεν είναι απλώς μια συντομογραφία για ζευγαρωτά tags. Υπάρχουν και καθαρά n:attributes, όπως για παράδειγμα το n:href ή ο πολύ χρήσιμος βοηθός του κωδικοποιητή n:class.

Φίλτρα

Δείτε την επισκόπηση των τυπικών φίλτρων.

Τα φίλτρα γράφονται μετά από μια κάθετη γραμμή (μπορεί να υπάρχει κενό πριν από αυτήν):

<h1>{$heading|upper}</h1>

Τα φίλτρα μπορούν να συνδεθούν αλυσιδωτά και στη συνέχεια εφαρμόζονται με σειρά από αριστερά προς τα δεξιά:

<h1>{$heading|lower|capitalize}</h1>

Οι παράμετροι εισάγονται μετά το όνομα του φίλτρου, χωρισμένες με άνω και κάτω τελείες ή κόμματα:

<h1>{$heading|truncate:20,''}</h1>

Τα φίλτρα μπορούν επίσης να εφαρμοστούν σε μια έκφραση:

{var $name = ($title|upper) . ($subtitle|lower)}

Σε ένα μπλοκ:

<h1>{block |lower}{$heading}{/block}</h1>

Ή απευθείας στην τιμή (σε συνδυασμό με το tag {=expr}):

<h1>{='  Hello world  '|trim}<h1>

Δυναμικά HTML tags

Το Latte υποστηρίζει δυναμικά HTML tags, τα οποία είναι χρήσιμα όταν χρειάζεστε ευελιξία στα ονόματα των tags:

<h{$level}>Heading</h{$level}>

Ο παραπάνω κώδικας μπορεί για παράδειγμα να δημιουργήσει <h1>Heading</h1> ή <h2>Heading</h2> ανάλογα με την τιμή της μεταβλητής $level. Τα δυναμικά HTML tags στο Latte πρέπει πάντα να είναι ζευγαρωτά. Η εναλλακτική τους είναι το n:tag.

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

Σχόλια

Τα σχόλια γράφονται με αυτόν τον τρόπο και δεν περιλαμβάνονται στην έξοδο:

{* αυτό είναι ένα σχόλιο στο Latte *}

Μέσα στα tags λειτουργούν τα σχόλια PHP:

{include 'file.info', /* value: 123 */}

Συντακτικό Ζαχαρούχο

Strings χωρίς εισαγωγικά

Για απλά strings, μπορείτε να παραλείψετε τα εισαγωγικά:

όπως στην 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, συνιστούμε να γράφετε τις καθολικές σταθερές με μια κάθετο στην αρχή για διάκριση:

{if \PROJECT_ID === 1} ... {/if}

Αυτή η γραφή είναι απολύτως έγκυρη στην ίδια την PHP, η κάθετος δηλώνει ότι η σταθερά βρίσκεται στο καθολικό namespace.

Συντομογραφημένος τριαδικός τελεστής

Εάν η τρίτη τιμή του τριαδικού τελεστή είναι κενή, μπορεί να παραλειφθεί:

όπως στην PHP:  {$stock ? 'Σε απόθεμα' : ''}

συντομογραφία:    {$stock ? 'Σε απόθεμα'}

Σύγχρονη γραφή κλειδιών σε πίνακα

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

όπως στην PHP:  {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

μοντέρνα:     {var $arr = [one: 'item 1', two: 'item 2']}

Φίλτρα

Τα φίλτρα μπορούν να χρησιμοποιηθούν για οποιεσδήποτε εκφράσεις, αρκεί να περικλείσετε το σύνολο σε παρενθέσεις:

{var $content = ($text|truncate: 30|upper)}

Τελεστής in

Ο τελεστής in μπορεί να αντικαταστήσει τη συνάρτηση in_array(). Η σύγκριση είναι πάντα αυστηρή:

{* παρόμοιο με 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. Δηλαδή, δεν μπορούν να χρησιμοποιηθούν εντολές που τερματίζονται με ερωτηματικό. Δεν μπορούν να δηλωθούν κλάσεις ή να χρησιμοποιηθούν δομές ελέγχου, π.χ. if, foreach, switch, return, try, throw και άλλες, αντί των οποίων το Latte προσφέρει τα δικά του tags. Επίσης, δεν μπορούν να χρησιμοποιηθούν attributes, backticks ή ορισμένες μαγικές σταθερές. Δεν μπορούν να χρησιμοποιηθούν ούτε τα unset, echo, include, require, exit, eval, επειδή δεν πρόκειται για συναρτήσεις, αλλά για ειδικές γλωσσικές κατασκευές της PHP, και επομένως δεν είναι εκφράσεις. Τα σχόλια υποστηρίζονται μόνο ως σχόλια πολλαπλών γραμμών /* ... */.

Ωστόσο, αυτοί οι περιορισμοί μπορούν να παρακαμφθούν ενεργοποιώντας την επέκταση RawPhpExtension, χάρη στην οποία μπορεί στη συνέχεια να χρησιμοποιηθεί στο tag {php ...} οποιοσδήποτε κώδικας PHP με ευθύνη του συγγραφέα του προτύπου.

έκδοση: 3.0