Nette Documentation Preview

syntax
Πρότυπα
*******

.[perex]
Η Nette χρησιμοποιεί το σύστημα προτύπων [Latte |latte:]. Το Latte χρησιμοποιείται επειδή είναι το πιο ασφαλές σύστημα προτύπων για την PHP και ταυτόχρονα το πιο διαισθητικό σύστημα. Δεν χρειάζεται να μάθετε πολλά καινούργια, αρκεί να γνωρίζετε PHP και μερικές ετικέτες Latte.

Συνήθως η σελίδα ολοκληρώνεται από το πρότυπο διάταξης + το πρότυπο δράσης. Έτσι μπορεί να μοιάζει ένα πρότυπο διάταξης, προσέξτε τα μπλοκ `{block}` και την ετικέτα `{include}`:

```latte
<!DOCTYPE html>
<html>
<head>
	<title>{block title}My App{/block}</title>
</head>
<body>
	<header>...</header>
	{include content}
	<footer>...</footer>
</body>
</html>
```

Και αυτό μπορεί να είναι το πρότυπο δράσης:

```latte
{block title}Homepage{/block}

{block content}
<h1>Homepage</h1>
...
{/block}
```

Ορίζει το μπλοκ `content`, το οποίο εισάγεται στη θέση του `{include content}` στη διάταξη, και επίσης επαναπροσδιορίζει το μπλοκ `title`, το οποίο αντικαθιστά το `{block title}` στη διάταξη. Προσπαθήστε να φανταστείτε το αποτέλεσμα.


Αναζήτηση προτύπων .[#toc-search-for-templates]
-----------------------------------------------

Η διαδρομή προς τα πρότυπα προκύπτει σύμφωνα με μια απλή λογική. Προσπαθεί να δει αν ένα από αυτά τα αρχεία προτύπων υπάρχει σε σχέση με τον κατάλογο όπου βρίσκεται η κλάση presenter, όπου `<Presenter>` είναι το όνομα του τρέχοντος παρουσιαστή και `<view>` είναι το όνομα της τρέχουσας δράσης:

- `templates/<Presenter>/<view>.latte`
- `templates/<Presenter>.<view>.latte`

Αν το πρότυπο δεν βρεθεί, θα προσπαθήσει να ψάξει στον κατάλογο `templates` ένα επίπεδο πιο πάνω, δηλαδή στο ίδιο επίπεδο με τον κατάλογο με την κλάση παρουσιαστή.

Εάν το πρότυπο δεν βρεθεί ούτε εκεί, η απάντηση είναι ένα [σφάλμα 404 |presenters#Error 404 etc.].

Μπορείτε επίσης να αλλάξετε την προβολή χρησιμοποιώντας το `$this->setView('otherView')`. Ή, αντί για αναζήτηση, καθορίστε απευθείας το όνομα του αρχείου προτύπου χρησιμοποιώντας τη διεύθυνση `$this->template->setFile('/path/to/template.latte')`.

.[note]
Μπορείτε να αλλάξετε τις διαδρομές στις οποίες αναζητούνται τα πρότυπα υπερκαλύπτοντας τη μέθοδο [formatTemplateFiles |api:Nette\Application\UI\Presenter::formatTemplateFiles()], η οποία επιστρέφει έναν πίνακα πιθανών διαδρομών αρχείων.

Η διάταξη αναμένεται στα ακόλουθα αρχεία:

- `templates/<Presenter>/@<layout>.latte`
- `templates/<Presenter>.@<layout>.latte`
- `templates/@<layout>.latte` διάταξη κοινή για πολλούς παρουσιαστές

`<Presenter>` είναι το όνομα του τρέχοντος παρουσιαστή και `<layout>` είναι το όνομα της διάταξης, η οποία είναι εξ ορισμού `'layout'`. Το όνομα μπορεί να αλλάξει με το `$this->setLayout('otherLayout')`, έτσι ώστε να δοκιμάζονται τα αρχεία `@otherLayout.latte`.

Μπορείτε επίσης να καθορίσετε απευθείας το όνομα του αρχείου του προτύπου διάταξης χρησιμοποιώντας το `$this->setLayout('/path/to/template.latte')`. Η χρήση του `$this->setLayout(false)` θα απενεργοποιήσει την αναζήτηση διάταξης.

.[note]
Μπορείτε να αλλάξετε τις διαδρομές στις οποίες αναζητούνται τα πρότυπα με την παράκαμψη της μεθόδου [formatLayoutTemplateFiles |api:Nette\Application\UI\Presenter::formatLayoutTemplateFiles()], η οποία επιστρέφει έναν πίνακα πιθανών διαδρομών αρχείων.


Μεταβλητές στο πρότυπο .[#toc-variables-in-the-template]
--------------------------------------------------------

Οι μεταβλητές περνούν στο πρότυπο γράφοντάς τες στο `$this->template` και στη συνέχεια είναι διαθέσιμες στο πρότυπο ως τοπικές μεταβλητές:

```php
$this->template->article = $this->articles->getById($id);
```

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

Και πώς ορίζουμε μια τέτοια απαρίθμηση; Απλά με τη μορφή μιας κλάσης και των ιδιοτήτων της. Την ονομάζουμε παρόμοια με την presenter, αλλά με `Template` στο τέλος:

```php
/**
 * @property-read ArticleTemplate $template
 */
class ArticlePresenter extends Nette\Application\UI\Presenter
{
}

class ArticleTemplate extends Nette\Bridges\ApplicationLatte\Template
{
	public Model\Article $article;
	public Nette\Security\User $user;

	// και άλλες μεταβλητές
}
```

Το αντικείμενο `$this->template` στον παρουσιαστή θα είναι τώρα μια περίπτωση της κλάσης `ArticleTemplate`. Έτσι, η PHP θα ελέγχει τους δηλωμένους τύπους όταν γράφονται. Και ξεκινώντας από την PHP 8.2 θα προειδοποιεί επίσης για εγγραφή σε μη υπάρχουσα μεταβλητή, στις προηγούμενες εκδόσεις το ίδιο μπορεί να επιτευχθεί με τη χρήση του γνωρίσματος [Nette\SmartObject |utils:smartobject].

Το σχόλιο `@property-read` είναι για το IDE και τη στατική ανάλυση, θα κάνει την αυτόματη συμπλήρωση να λειτουργεί, δείτε "PhpStorm και συμπλήρωση κώδικα για $this->template":https://blog.nette.org/en/phpstorm-and-code-completion-for-this-template.

[* phpstorm-completion.webp *]

Μπορείτε επίσης να αφεθείτε στην πολυτέλεια του ψιθυρίσματος στα πρότυπα, απλά εγκαταστήστε το πρόσθετο Latte στο PhpStorm και καθορίστε το όνομα της κλάσης στην αρχή του προτύπου, δείτε το άρθρο "Latte: πώς να πληκτρολογήσετε το σύστημα":https://blog.nette.org/el/latte-pos-na-chresimopoiesete-to-systema-typon:

```latte
{templateType App\Presenters\ArticleTemplate}
...
```

Έτσι λειτουργούν τα πρότυπα και στα συστατικά, απλά ακολουθήστε τη σύμβαση ονοματοδοσίας και δημιουργήστε μια κλάση προτύπου `FifteenTemplate` για το συστατικό π.χ. `FifteenControl`.

Εάν πρέπει να δημιουργήσετε ένα `$template` ως παράδειγμα μιας άλλης κλάσης, χρησιμοποιήστε τη μέθοδο `createTemplate()`:

```php
public function renderDefault(): void
{
	$template = $this->createTemplate(SpecialTemplate::class);
	$template->foo = 123;
	// ...
	$this->sendTemplate($template);
}
```


Default Variables .[#toc-default-variables]
-------------------------------------------

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

- `$basePath` είναι μια απόλυτη διαδρομή URL στο root dir (για παράδειγμα `/CD-collection`)
- `$baseUrl` είναι μια απόλυτη διεύθυνση URL στο root dir (για παράδειγμα `http://localhost/CD-collection`)
- `$user` είναι ένα αντικείμενο [που αντιπροσωπεύει τον χρήστη |security:authentication]
- `$presenter` είναι ο τρέχων παρουσιαστής
- `$control` είναι το τρέχον συστατικό ή ο παρουσιαστής
- `$flashes` κατάλογος [μηνυμάτων |presenters#flash-messages] που αποστέλλονται από τη μέθοδο `flashMessage()`

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


Δημιουργία συνδέσμων .[#toc-creating-links]
-------------------------------------------

Στο πρότυπο δημιουργούμε συνδέσμους προς άλλους παρουσιαστές & δράσεις ως εξής:

```latte
<a n:href="Product:show">detail</a>
```

Το χαρακτηριστικό `n:href` είναι πολύ βολικό για τις ετικέτες HTML `<a>`. Αν θέλουμε να εκτυπώσουμε τον σύνδεσμο αλλού, για παράδειγμα στο κείμενο, χρησιμοποιούμε το `{link}`:

```latte
URL is: {link Home:default}
```

Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα [Δημιουργία συνδέσμων |Creating Links].


Προσαρμοσμένα φίλτρα, ετικέτες κ.λπ. .[#toc-custom-filters-tags-etc]
--------------------------------------------------------------------

Το σύστημα δημιουργίας προτύπων Latte μπορεί να επεκταθεί με προσαρμοσμένα φίλτρα, συναρτήσεις, ετικέτες κ.λπ. Αυτό μπορεί να γίνει απευθείας στο `render<View>` ή `beforeRender()` μέθοδο:

```php
public function beforeRender(): void
{
	// προσθήκη φίλτρου
	$this->template->addFilter('foo', /* ... */);

	// ή να ρυθμίσετε απευθείας το αντικείμενο Latte\Engine
	$latte = $this->template->getLatte();
	$latte->addFilterLoader(/* ... */);
}
```

Latte έκδοση 3 προσφέρει έναν πιο προηγμένο τρόπο δημιουργώντας μια [επέκταση |latte:creating-extension] για κάθε έργο ιστού. Εδώ είναι ένα πρόχειρο παράδειγμα μιας τέτοιας κλάσης:

```php
namespace App\Templating;

final class LatteExtension extends Latte\Extension
{
	public function __construct(
		private App\Model\Facade $facade,
		private Nette\Security\User $user,
		// ...
	) {
	}

	public function getFilters(): array
	{
		return [
			'timeAgoInWords' => $this->filterTimeAgoInWords(...),
			'money' => $this->filterMoney(...),
			// ...
		];
	}

	public function getFunctions(): array
	{
		return [
			'canEditArticle' =>
				fn($article) => $this->facade->canEditArticle($article, $this->user->getId()),
			// ...
		];
	}

	// ...
}
```

Την καταχωρούμε χρησιμοποιώντας την [configuration#Latte]:

```neon
latte:
	extensions:
		- App\Templating\LatteExtension
```


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

Αν προγραμματίζετε μια πολύγλωσση εφαρμογή, πιθανόν να χρειαστεί να εκδώσετε κάποιο από το κείμενο του προτύπου σε διαφορετικές γλώσσες. Για να το κάνετε αυτό, το Nette Framework ορίζει μια διεπαφή μετάφρασης [api:Nette\Localization\Translator], η οποία διαθέτει μια μόνο μέθοδο `translate()`. Αυτή δέχεται το μήνυμα `$message`, το οποίο είναι συνήθως μια συμβολοσειρά, και οποιεσδήποτε άλλες παραμέτρους. Η αποστολή της είναι να επιστρέψει το μεταφρασμένο αλφαριθμητικό.
Δεν υπάρχει προεπιλεγμένη υλοποίηση στο Nette, μπορείτε να επιλέξετε ανάλογα με τις ανάγκες σας από διάφορες έτοιμες λύσεις που μπορείτε να βρείτε στο [Componette |https://componette.org/search/localization]. Η τεκμηρίωσή τους σας ενημερώνει για το πώς να ρυθμίσετε τον μεταφραστή.

Τα πρότυπα μπορούν να ρυθμιστούν με έναν μεταφραστή, τον οποίο [θα μας έχει περάσει |dependency-injection:passing-dependencies], χρησιμοποιώντας τη μέθοδο `setTranslator()`:

```php
protected function beforeRender(): void
{
	// ...
	$this->template->setTranslator($translator);
}
```

Εναλλακτικά, ο μεταφραστής μπορεί να οριστεί χρησιμοποιώντας τη [διαμόρφωση |configuration#Latte]:

```neon
latte:
	extensions:
		- Latte\Essential\TranslatorExtension
```

Ο μεταφραστής μπορεί στη συνέχεια να χρησιμοποιηθεί, για παράδειγμα, ως φίλτρο `|translate`, με πρόσθετες παραμέτρους που περνούν στη μέθοδο `translate()` (βλ. `foo, bar`):

```latte
<a href="basket">{='Basket'|translate}</a>
<span>{$item|translate}</span>
<span>{$item|translate, foo, bar}</span>
```

Ή ως ετικέτα υπογράμμισης:

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

 `{translate}` (από το Latte 2.11, προηγουμένως χρησιμοποιούνταν η ετικέτα `{_}` ):

```latte
<a href="order">{translate}Order{/translate}</a>
<a href="order">{translate foo, bar}Order{/translate}</a>
```

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

```php
protected function beforeRender(): void
{
	// ...
	$this->template->setTranslator($translator, $lang);
}
```

Με τον όρο στατικό κείμενο εννοούμε, για παράδειγμα, το `{_'hello'}` ή το `{translate}hello{/translate}`. Μη στατικό κείμενο, όπως το `{_$foo}`, θα συνεχίσει να μεταγλωττίζεται εν κινήσει.

Πρότυπα

Η Nette χρησιμοποιεί το σύστημα προτύπων Latte. Το Latte χρησιμοποιείται επειδή είναι το πιο ασφαλές σύστημα προτύπων για την PHP και ταυτόχρονα το πιο διαισθητικό σύστημα. Δεν χρειάζεται να μάθετε πολλά καινούργια, αρκεί να γνωρίζετε PHP και μερικές ετικέτες Latte.

Συνήθως η σελίδα ολοκληρώνεται από το πρότυπο διάταξης + το πρότυπο δράσης. Έτσι μπορεί να μοιάζει ένα πρότυπο διάταξης, προσέξτε τα μπλοκ {block} και την ετικέτα {include}:

<!DOCTYPE html>
<html>
<head>
	<title>{block title}My App{/block}</title>
</head>
<body>
	<header>...</header>
	{include content}
	<footer>...</footer>
</body>
</html>

Και αυτό μπορεί να είναι το πρότυπο δράσης:

{block title}Homepage{/block}

{block content}
<h1>Homepage</h1>
...
{/block}

Ορίζει το μπλοκ content, το οποίο εισάγεται στη θέση του {include content} στη διάταξη, και επίσης επαναπροσδιορίζει το μπλοκ title, το οποίο αντικαθιστά το {block title} στη διάταξη. Προσπαθήστε να φανταστείτε το αποτέλεσμα.

Αναζήτηση προτύπων

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

  • templates/<Presenter>/<view>.latte
  • templates/<Presenter>.<view>.latte

Αν το πρότυπο δεν βρεθεί, θα προσπαθήσει να ψάξει στον κατάλογο templates ένα επίπεδο πιο πάνω, δηλαδή στο ίδιο επίπεδο με τον κατάλογο με την κλάση παρουσιαστή.

Εάν το πρότυπο δεν βρεθεί ούτε εκεί, η απάντηση είναι ένα σφάλμα 404.

Μπορείτε επίσης να αλλάξετε την προβολή χρησιμοποιώντας το $this->setView('otherView'). Ή, αντί για αναζήτηση, καθορίστε απευθείας το όνομα του αρχείου προτύπου χρησιμοποιώντας τη διεύθυνση $this->template->setFile('/path/to/template.latte').

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

Η διάταξη αναμένεται στα ακόλουθα αρχεία:

  • templates/<Presenter>/@<layout>.latte
  • templates/<Presenter>.@<layout>.latte
  • templates/@<layout>.latte διάταξη κοινή για πολλούς παρουσιαστές

<Presenter> είναι το όνομα του τρέχοντος παρουσιαστή και <layout> είναι το όνομα της διάταξης, η οποία είναι εξ ορισμού 'layout'. Το όνομα μπορεί να αλλάξει με το $this->setLayout('otherLayout'), έτσι ώστε να δοκιμάζονται τα αρχεία @otherLayout.latte.

Μπορείτε επίσης να καθορίσετε απευθείας το όνομα του αρχείου του προτύπου διάταξης χρησιμοποιώντας το $this->setLayout('/path/to/template.latte'). Η χρήση του $this->setLayout(false) θα απενεργοποιήσει την αναζήτηση διάταξης.

Μπορείτε να αλλάξετε τις διαδρομές στις οποίες αναζητούνται τα πρότυπα με την παράκαμψη της μεθόδου formatLayoutTemplateFiles, η οποία επιστρέφει έναν πίνακα πιθανών διαδρομών αρχείων.

Μεταβλητές στο πρότυπο

Οι μεταβλητές περνούν στο πρότυπο γράφοντάς τες στο $this->template και στη συνέχεια είναι διαθέσιμες στο πρότυπο ως τοπικές μεταβλητές:

$this->template->article = $this->articles->getById($id);

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

Και πώς ορίζουμε μια τέτοια απαρίθμηση; Απλά με τη μορφή μιας κλάσης και των ιδιοτήτων της. Την ονομάζουμε παρόμοια με την presenter, αλλά με Template στο τέλος:

/**
 * @property-read ArticleTemplate $template
 */
class ArticlePresenter extends Nette\Application\UI\Presenter
{
}

class ArticleTemplate extends Nette\Bridges\ApplicationLatte\Template
{
	public Model\Article $article;
	public Nette\Security\User $user;

	// και άλλες μεταβλητές
}

Το αντικείμενο $this->template στον παρουσιαστή θα είναι τώρα μια περίπτωση της κλάσης ArticleTemplate. Έτσι, η PHP θα ελέγχει τους δηλωμένους τύπους όταν γράφονται. Και ξεκινώντας από την PHP 8.2 θα προειδοποιεί επίσης για εγγραφή σε μη υπάρχουσα μεταβλητή, στις προηγούμενες εκδόσεις το ίδιο μπορεί να επιτευχθεί με τη χρήση του γνωρίσματος Nette\SmartObject.

Το σχόλιο @property-read είναι για το IDE και τη στατική ανάλυση, θα κάνει την αυτόματη συμπλήρωση να λειτουργεί, δείτε PhpStorm και συμπλήρωση κώδικα για $this->template.

Μπορείτε επίσης να αφεθείτε στην πολυτέλεια του ψιθυρίσματος στα πρότυπα, απλά εγκαταστήστε το πρόσθετο Latte στο PhpStorm και καθορίστε το όνομα της κλάσης στην αρχή του προτύπου, δείτε το άρθρο Latte: πώς να πληκτρολογήσετε το σύστημα:

{templateType App\Presenters\ArticleTemplate}
...

Έτσι λειτουργούν τα πρότυπα και στα συστατικά, απλά ακολουθήστε τη σύμβαση ονοματοδοσίας και δημιουργήστε μια κλάση προτύπου FifteenTemplate για το συστατικό π.χ. FifteenControl.

Εάν πρέπει να δημιουργήσετε ένα $template ως παράδειγμα μιας άλλης κλάσης, χρησιμοποιήστε τη μέθοδο createTemplate():

public function renderDefault(): void
{
	$template = $this->createTemplate(SpecialTemplate::class);
	$template->foo = 123;
	// ...
	$this->sendTemplate($template);
}

Default Variables

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

  • $basePath είναι μια απόλυτη διαδρομή URL στο root dir (για παράδειγμα /CD-collection)
  • $baseUrl είναι μια απόλυτη διεύθυνση URL στο root dir (για παράδειγμα http://localhost/CD-collection)
  • $user είναι ένα αντικείμενο που αντιπροσωπεύει τον χρήστη
  • $presenter είναι ο τρέχων παρουσιαστής
  • $control είναι το τρέχον συστατικό ή ο παρουσιαστής
  • $flashes κατάλογος μηνυμάτων που αποστέλλονται από τη μέθοδο flashMessage()

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

Στο πρότυπο δημιουργούμε συνδέσμους προς άλλους παρουσιαστές & δράσεις ως εξής:

<a n:href="Product:show">detail</a>

Το χαρακτηριστικό n:href είναι πολύ βολικό για τις ετικέτες HTML <a>. Αν θέλουμε να εκτυπώσουμε τον σύνδεσμο αλλού, για παράδειγμα στο κείμενο, χρησιμοποιούμε το {link}:

URL is: {link Home:default}

Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Δημιουργία συνδέσμων.

Προσαρμοσμένα φίλτρα, ετικέτες κ.λπ.

Το σύστημα δημιουργίας προτύπων Latte μπορεί να επεκταθεί με προσαρμοσμένα φίλτρα, συναρτήσεις, ετικέτες κ.λπ. Αυτό μπορεί να γίνει απευθείας στο render<View> ή beforeRender() μέθοδο:

public function beforeRender(): void
{
	// προσθήκη φίλτρου
	$this->template->addFilter('foo', /* ... */);

	// ή να ρυθμίσετε απευθείας το αντικείμενο Latte\Engine
	$latte = $this->template->getLatte();
	$latte->addFilterLoader(/* ... */);
}

Latte έκδοση 3 προσφέρει έναν πιο προηγμένο τρόπο δημιουργώντας μια επέκταση για κάθε έργο ιστού. Εδώ είναι ένα πρόχειρο παράδειγμα μιας τέτοιας κλάσης:

namespace App\Templating;

final class LatteExtension extends Latte\Extension
{
	public function __construct(
		private App\Model\Facade $facade,
		private Nette\Security\User $user,
		// ...
	) {
	}

	public function getFilters(): array
	{
		return [
			'timeAgoInWords' => $this->filterTimeAgoInWords(...),
			'money' => $this->filterMoney(...),
			// ...
		];
	}

	public function getFunctions(): array
	{
		return [
			'canEditArticle' =>
				fn($article) => $this->facade->canEditArticle($article, $this->user->getId()),
			// ...
		];
	}

	// ...
}

Την καταχωρούμε χρησιμοποιώντας την configuration:

latte:
	extensions:
		- App\Templating\LatteExtension

Μετάφραση

Αν προγραμματίζετε μια πολύγλωσση εφαρμογή, πιθανόν να χρειαστεί να εκδώσετε κάποιο από το κείμενο του προτύπου σε διαφορετικές γλώσσες. Για να το κάνετε αυτό, το Nette Framework ορίζει μια διεπαφή μετάφρασης Nette\Localization\Translator, η οποία διαθέτει μια μόνο μέθοδο translate(). Αυτή δέχεται το μήνυμα $message, το οποίο είναι συνήθως μια συμβολοσειρά, και οποιεσδήποτε άλλες παραμέτρους. Η αποστολή της είναι να επιστρέψει το μεταφρασμένο αλφαριθμητικό. Δεν υπάρχει προεπιλεγμένη υλοποίηση στο Nette, μπορείτε να επιλέξετε ανάλογα με τις ανάγκες σας από διάφορες έτοιμες λύσεις που μπορείτε να βρείτε στο Componette. Η τεκμηρίωσή τους σας ενημερώνει για το πώς να ρυθμίσετε τον μεταφραστή.

Τα πρότυπα μπορούν να ρυθμιστούν με έναν μεταφραστή, τον οποίο θα μας έχει περάσει, χρησιμοποιώντας τη μέθοδο setTranslator():

protected function beforeRender(): void
{
	// ...
	$this->template->setTranslator($translator);
}

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

latte:
	extensions:
		- Latte\Essential\TranslatorExtension

Ο μεταφραστής μπορεί στη συνέχεια να χρησιμοποιηθεί, για παράδειγμα, ως φίλτρο |translate, με πρόσθετες παραμέτρους που περνούν στη μέθοδο translate() (βλ. foo, bar):

<a href="basket">{='Basket'|translate}</a>
<span>{$item|translate}</span>
<span>{$item|translate, foo, bar}</span>

Ή ως ετικέτα υπογράμμισης:

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

{translate} (από το Latte 2.11, προηγουμένως χρησιμοποιούνταν η ετικέτα {_} ):

<a href="order">{translate}Order{/translate}</a>
<a href="order">{translate foo, bar}Order{/translate}</a>

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

protected function beforeRender(): void
{
	// ...
	$this->template->setTranslator($translator, $lang);
}

Με τον όρο στατικό κείμενο εννοούμε, για παράδειγμα, το {_'hello'} ή το {translate}hello{/translate}. Μη στατικό κείμενο, όπως το {_$foo}, θα συνεχίσει να μεταγλωττίζεται εν κινήσει.