You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: application/cs/presenters.texy
+11Lines changed: 11 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -493,6 +493,17 @@ class MyPresenter extends Nette\Application\UI\Presenter
493
493
Je důležité zdůraznit, že pokud povolíte metodu `OPTIONS`, musíte ji následně také patřičně obsloužit v rámci svého presenteru. Metoda je často používána jako tzv. preflight request, který prohlížeč automaticky odesílá před skutečným požadavkem, když je potřeba zjistit, zda je požadavek povolený z hlediska CORS (Cross-Origin Resource Sharing) politiky. Pokud metodu povolíte, ale neimplementujete správnou odpověď, může to vést k nekonzistencím a potenciálním bezpečnostním problémům.
494
494
495
495
496
+
Označení zastaralých akcí .{data-version:3.2.3}
497
+
-----------------------------------------------
498
+
499
+
Atribut `#[Deprecated]` slouží k označení akcí, signálů nebo celých presenterů, které jsou zastaralé a měly by být v budoucnu odstraněny. Při generování odkazů na takto označené části aplikace Nette vyhodí varování, které vývojáře upozorní.
500
+
501
+
Atribut lze aplikovat jak na celou třídu presenteru, tak na jednotlivé metody `action<Action>()`, `render<View>()` a `handle<Signal>()`.
502
+
503
+
.[note]
504
+
PHP zavedlo atribut `#[Deprecated]` sice až ve verzi 8.4, ale Nette jej podporuje i ve starších verzích.
Pokud chcete, aby se hodnota určité property automaticky předala do šablony jako proměnná, označte ji atributem `#[TemplateVariable]`: .{data-version:3.2.9}
124
+
125
+
```php
126
+
use Nette\Application\Attributes\TemplateVariable;
127
+
128
+
class ArticlePresenter extends Nette\Application\UI\Presenter
129
+
{
130
+
#[TemplateVariable]
131
+
public string $siteName = 'Můj blog'; // musí být public
132
+
}
133
+
```
134
+
123
135
Takto jednoduše můžeme do šablon předat jakékoliv proměnné. Při vývoji robustních aplikací ale bývá užitečnější se omezit. Například tak, že explicitně nadefinujeme výčet proměnných, které šablona očekává, a jejich typů. Díky tomu nám bude moci PHP kontrolovat typy, IDE správně našeptávat a statická analýza odhalovat chyby.
124
136
125
137
A jak takový výčet nadefinujeme? Jednoduše v podobě třídy a její properties. Pojmenujeme ji podobně jako presenter, jen s `Template` na konci:
@@ -205,21 +217,71 @@ Více informací najdete v kapitole [Vytváření odkazů URL|creating-links].
205
217
Vlastní filtry, značky apod.
206
218
----------------------------
207
219
208
-
Šablonovací systém Latte lze rozšířit o vlastní filtry, funkce, značky apod. Lze tak učinit přímo v metodě `render<View>` nebo `beforeRender()`:
220
+
Šablonovací systém Latte lze rozšířit o vlastní filtry, funkce, značky a další prvky. K dispozici jsou tři způsoby, jak to udělat, od nejrychlejších ad-hoc řešení až po architektonický přístup pro celou aplikaci.
221
+
222
+
**Ad-hoc v metodách presenteru**
223
+
224
+
Nejrychlejší způsob je přidat filtr nebo funkci přímo v metodě `render<View>` nebo `beforeRender()`:
Pro složitější logiku můžete konfigurovat přímo objekt `Latte\Engine`:
245
+
246
+
```php
247
+
public function beforeRender(): void
248
+
{
217
249
$latte = $this->template->getLatte();
218
250
$latte->setMigrationWarnings();
219
251
}
220
252
```
221
253
222
-
Latte ve verzi 3 nabízí pokročilejší způsob a to vytvoření si [extension |latte:extending-latte#Latte Extension] pro každý webový projekt. Kusý příklad takové třídy:
254
+
**Pomocí atributů** .{data-version:3.2.9}
255
+
256
+
Elegantní způsob je definovat filtry a funkce jako metody přímo v presenteru nebo komponentě a označit je atributy `#[Latte\Attributes\TemplateFilter]` a `#[Latte\Attributes\TemplateFunction]`:
257
+
258
+
```php
259
+
use Latte\Attributes\TemplateFilter;
260
+
use Latte\Attributes\TemplateFunction;
261
+
262
+
class ArticlePresenter extends Nette\Application\UI\Presenter
263
+
{
264
+
#[TemplateFilter]
265
+
public function money(float $val): string
266
+
{
267
+
return number_format($val, 2, ',', ' ') . ' Kč';
268
+
}
269
+
270
+
#[TemplateFunction]
271
+
public function shortify(string $s, int $len = 10): string
272
+
{
273
+
return mb_substr($s, 0, $len);
274
+
}
275
+
}
276
+
```
277
+
278
+
Latte automaticky rozpozná a zaregistruje metody označené těmito atributy. Název filtru nebo funkce v šabloně odpovídá názvu metody. Všechny metody musí být veřejné (public).
279
+
280
+
Tento způsob je vhodný pro filtry a funkce, které potřebujete jen v konkrétním presenteru nebo komponentě, nikoliv v celé aplikaci.
281
+
282
+
**Globálně pomocí Extension**
283
+
284
+
Pro celou aplikaci je nejvhodnější vytvořit si [extension |latte:extending-latte#Latte Extension]. Jde o třídu, která centralizuje všechna rozšíření Latte pro celý projekt. Kusý příklad:
223
285
224
286
```php
225
287
namespace App\Presentation\Accessory;
@@ -236,33 +298,41 @@ final class LatteExtension extends Latte\Extension
private function filterTimeAgoInWords(DateTimeInterface $time): string
318
+
{
319
+
// ...
320
+
}
321
+
254
322
// ...
255
323
}
256
324
```
257
325
258
-
Zaregistrujeme ji pomocí [konfigurace |configuration#Šablony Latte]:
326
+
Extension zaregistrujeme pomocí [konfigurace |configuration#Šablony Latte]:
259
327
260
328
```neon
261
329
latte:
262
330
extensions:
263
331
- App\Presentation\Accessory\LatteExtension
264
332
```
265
333
334
+
Výhodou extension je, že lze využít dependency injection, mít přístup k modelové vrstvě aplikace a všechna rozšíření mít přehledně na jednom místě. Extension podporuje i další pokročilé funkce jako vlastní značky, providery, filtry pro Latte kompilátor a další.
0 commit comments