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.
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.
123
+
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
+
135
+
Typově bezpečné proměnné
136
+
------------------------
137
+
138
+
Při vývoji robustních aplikací je užitečné explicitně nadefinovat, jaké proměnné šablona očekává a jakého jsou typu. Získáte tak typovou kontrolu v PHP, chytré našeptávání v IDE a schopnost statické analýzy odhalovat chyby.
124
139
125
140
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:
126
141
@@ -205,21 +220,71 @@ Více informací najdete v kapitole [Vytváření odkazů URL|creating-links].
205
220
Vlastní filtry, značky apod.
206
221
----------------------------
207
222
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()`:
223
+
Š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.
224
+
225
+
**Ad-hoc v metodách presenteru**
226
+
227
+
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`:
248
+
249
+
```php
250
+
public function beforeRender(): void
251
+
{
217
252
$latte = $this->template->getLatte();
218
253
$latte->setMigrationWarnings();
219
254
}
220
255
```
221
256
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:
257
+
**Pomocí atributů** .{data-version:3.2.9}
258
+
259
+
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]`:
260
+
261
+
```php
262
+
use Latte\Attributes\TemplateFilter;
263
+
use Latte\Attributes\TemplateFunction;
264
+
265
+
class ArticlePresenter extends Nette\Application\UI\Presenter
266
+
{
267
+
#[TemplateFilter]
268
+
public function money(float $val): string
269
+
{
270
+
return number_format($val, 2, ',', ' ') . ' Kč';
271
+
}
272
+
273
+
#[TemplateFunction]
274
+
public function shortify(string $s, int $len = 10): string
275
+
{
276
+
return mb_substr($s, 0, $len);
277
+
}
278
+
}
279
+
```
280
+
281
+
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).
282
+
283
+
Tento způsob je vhodný pro filtry a funkce, které potřebujete jen v konkrétním presenteru nebo komponentě, nikoliv v celé aplikaci.
284
+
285
+
**Globálně pomocí Extension**
286
+
287
+
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
288
224
289
```php
225
290
namespace App\Presentation\Accessory;
@@ -236,33 +301,41 @@ final class LatteExtension extends Latte\Extension
private function filterTimeAgoInWords(DateTimeInterface $time): string
321
+
{
322
+
// ...
323
+
}
324
+
254
325
// ...
255
326
}
256
327
```
257
328
258
-
Zaregistrujeme ji pomocí [konfigurace |configuration#Šablony Latte]:
329
+
Extension zaregistrujeme pomocí [konfigurace |configuration#Šablony Latte]:
259
330
260
331
```neon
261
332
latte:
262
333
extensions:
263
334
- App\Presentation\Accessory\LatteExtension
264
335
```
265
336
337
+
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