Skip to content

Commit 8dd7aec

Browse files
committed
nette/application 3.2.9
1 parent fb1dd4e commit 8dd7aec

File tree

3 files changed

+108
-36
lines changed

3 files changed

+108
-36
lines changed

application/cs/presenters.texy

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,17 @@ class MyPresenter extends Nette\Application\UI\Presenter
493493
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.
494494

495495

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.
505+
506+
496507
Další četba
497508
===========
498509

application/cs/templates.texy

Lines changed: 96 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,43 @@ Soubory, kde se dohledávají šablony layoutu, lze změnit překrytím metody [
114114
Proměnné v šabloně
115115
------------------
116116

117-
Proměnné do šablony předáváme tak, že je zapíšeme do `$this->template` a potom je máme k dispozici v šabloně jako lokální proměnné:
117+
Proměnné do šablony předáváme zápisem do `$this->template`. V šabloně jsou pak dostupné jako lokální proměnné:
118118

119119
```php
120120
$this->template->article = $this->articles->getById($id);
121121
```
122122

123-
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.
124154

125155
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:
126156

@@ -169,21 +199,6 @@ public function renderDefault(): void
169199
```
170200

171201

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-
187202
Vytváření odkazů
188203
----------------
189204

@@ -205,21 +220,70 @@ Více informací najdete v kapitole [Vytváření odkazů URL|creating-links].
205220
Vlastní filtry, značky apod.
206221
----------------------------
207222

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>()`:
209228

210229
```php
211-
public function beforeRender(): void
230+
protected function beforeRender(): void
212231
{
213232
// přidání filtru
214-
$this->template->addFilter('foo', /* ... */);
233+
$this->template->addFilter('money', fn($val) => round($val) . ' Kč');
234+
235+
// přidání funkce
236+
$this->template->addFunction('isWeekend', fn($date) => $date->format('N') >= 6);
237+
}
238+
```
239+
240+
V šabloně pak:
241+
242+
```latte
243+
<p>Cena: {$price|money}</p>
215244

216-
// nebo konfigurujeme přímo objekt Latte\Engine
245+
{if isWeekend($now)} ... {/if}
246+
```
247+
248+
Pro složitější logiku můžete konfigurovat přímo objekt `Latte\Engine`:
249+
250+
```php
251+
protected function beforeRender(): void
252+
{
217253
$latte = $this->template->getLatte();
218254
$latte->setMigrationWarnings();
219255
}
220256
```
221257

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:
223287

224288
```php
225289
namespace App\Presentation\Accessory;
@@ -236,33 +300,41 @@ final class LatteExtension extends Latte\Extension
236300
public function getFilters(): array
237301
{
238302
return [
303+
'money' => fn($val) => number_format($val, 2, ',', ' ') . ' Kč',
239304
'timeAgoInWords' => $this->filterTimeAgoInWords(...),
240-
'money' => $this->filterMoney(...),
241305
// ...
242306
];
243307
}
244308

245309
public function getFunctions(): array
246310
{
247311
return [
312+
'stars' => fn($rating) => str_repeat('⭐', $rating),
248313
'canEditArticle' =>
249314
fn($article) => $this->facade->canEditArticle($article, $this->user->getId()),
250315
// ...
251316
];
252317
}
253318

319+
private function filterTimeAgoInWords(DateTimeInterface $time): string
320+
{
321+
// ...
322+
}
323+
254324
// ...
255325
}
256326
```
257327

258-
Zaregistrujeme ji pomocí [konfigurace |configuration#Šablony Latte]:
328+
Extension zaregistrujeme pomocí [konfigurace |configuration#Šablony Latte]:
259329

260330
```neon
261331
latte:
262332
extensions:
263333
- App\Presentation\Accessory\LatteExtension
264334
```
265335

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ší.
337+
266338

267339
Překládání
268340
----------

nette/cs/vulnerability-protection.texy

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,7 @@ Nette Framework **automaticky chrání formuláře a signály v presenterech** p
4848
$form->allowCrossOrigin();
4949
```
5050

51-
nebo v případě signálu přidejte anotaci `@crossOrigin`:
52-
53-
```php
54-
/**
55-
* @crossOrigin
56-
*/
57-
public function handleXyz()
58-
{
59-
}
60-
```
61-
62-
V Nette Application 3.2 můžete použít také atributy:
51+
nebo v případě signálu přidejte atribut:
6352

6453
```php
6554
use Nette\Application\Attributes\Requires;

0 commit comments

Comments
 (0)