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'; // nesmí být private
132
+
}
133
+
```
134
+
135
+
Výchozí proměnné
136
+
----------------
137
+
138
+
Presentery a komponenty předávají do šablon několik užitečných proměnných automaticky:
139
+
140
+
- `$basePath` je absolutní URL cesta ke kořenovému adresáři (např. `/eshop`)
141
+
- `$baseUrl` je absolutní URL ke kořenovému adresáři (např. `http://localhost/eshop`)
142
+
- `$user` je objekt [reprezentující uživatele |security:authentication]
143
+
- `$presenter` je aktuální presenter
144
+
- `$control` je aktuální komponenta nebo presenter
145
+
- `$flashes` pole [zpráv |presenters#Flash zprávy] zaslaných funkcí `flashMessage()`
146
+
147
+
Pokud používáte vlastní třídu šablony, tyto proměnné se předají, pokud pro ně vytvoříte property.
148
+
149
+
150
+
Typově bezpečné proměnné
151
+
------------------------
152
+
153
+
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
154
125
155
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
156
@@ -169,21 +199,6 @@ public function renderDefault(): void
169
199
```
170
200
171
201
172
-
Výchozí proměnné
173
-
----------------
174
-
175
-
Presentery a komponenty předávají do šablon několik užitečných proměnných automaticky:
176
-
177
-
- `$basePath` je absolutní URL cesta ke kořenovému adresáři (např. `/eshop`)
178
-
- `$baseUrl` je absolutní URL ke kořenovému adresáři (např. `http://localhost/eshop`)
179
-
- `$user` je objekt [reprezentující uživatele |security:authentication]
180
-
- `$presenter` je aktuální presenter
181
-
- `$control` je aktuální komponenta nebo presenter
182
-
- `$flashes` pole [zpráv |presenters#Flash zprávy] zaslaných funkcí `flashMessage()`
183
-
184
-
Pokud používáte vlastní třídu šablony, tyto proměnné se předají, pokud pro ně vytvoříte property.
185
-
186
-
187
202
Vytváření odkazů
188
203
----------------
189
204
@@ -205,21 +220,70 @@ 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 kódu presenteru či komponenty. V presenteru je k tomu vhodná metoda `beforeRender()` nebo `render<View>()`:
Pro složitější logiku můžete konfigurovat přímo objekt `Latte\Engine`:
249
+
250
+
```php
251
+
protected function beforeRender(): void
252
+
{
217
253
$latte = $this->template->getLatte();
218
254
$latte->setMigrationWarnings();
219
255
}
220
256
```
221
257
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:
258
+
**Pomocí atributů** .{data-version:3.2.9}
259
+
260
+
Elegantní způsob je definovat filtry a funkce jako metody přímo v presenteru nebo komponentě a označit je atributy:
261
+
262
+
```php
263
+
use Latte\Attributes\TemplateFilter;
264
+
use Latte\Attributes\TemplateFunction;
265
+
266
+
class ArticlePresenter extends Nette\Application\UI\Presenter
267
+
{
268
+
#[TemplateFilter]
269
+
public function money(float $val): string
270
+
{
271
+
return round($val) . ' Kč';
272
+
}
273
+
274
+
#[TemplateFunction]
275
+
public function isWeekend(DateTimeInterface $date): bool
276
+
{
277
+
return $date->format('N') >= 6
278
+
}
279
+
}
280
+
```
281
+
282
+
Latte automaticky rozpozná a zaregistruje metody označené těmito atributy. Název filtru nebo funkce v šabloně odpovídá názvu metody. Tyto metody nesmí být privátní.
283
+
284
+
**Globálně pomocí Extension**
285
+
286
+
Předchozí způsoby jsou vhodné pro filtry a funkce, které potřebujete jen v konkrétním presenteru nebo komponentě, nikoliv v celé aplikaci. 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
287
224
288
```php
225
289
namespace App\Presentation\Accessory;
@@ -236,33 +300,41 @@ final class LatteExtension extends Latte\Extension
private function filterTimeAgoInWords(DateTimeInterface $time): string
320
+
{
321
+
// ...
322
+
}
323
+
254
324
// ...
255
325
}
256
326
```
257
327
258
-
Zaregistrujeme ji pomocí [konfigurace |configuration#Šablony Latte]:
328
+
Extension zaregistrujeme pomocí [konfigurace |configuration#Šablony Latte]:
259
329
260
330
```neon
261
331
latte:
262
332
extensions:
263
333
- App\Presentation\Accessory\LatteExtension
264
334
```
265
335
336
+
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 umožnuje definovat i vlastní značky, providery, průchody pro Latte kompilátor a další.
0 commit comments