Skip to content

Commit d447383

Browse files
committed
nette/application 3.2.9
1 parent fb1dd4e commit d447383

File tree

3 files changed

+88
-18
lines changed

3 files changed

+88
-18
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: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,18 @@ Proměnné do šablony předáváme tak, že je zapíšeme do `$this->template`
120120
$this->template->article = $this->articles->getById($id);
121121
```
122122

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+
123135
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.
124136

125137
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].
205217
Vlastní filtry, značky apod.
206218
----------------------------
207219

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

210226
```php
211227
public function beforeRender(): void
212228
{
213229
// přidání filtru
214-
$this->template->addFilter('foo', /* ... */);
230+
$this->template->addFilter('money', fn($val) => number_format($val, 2, ',', ' ') . ' Kč');
231+
232+
// přidání funkce
233+
$this->template->addFunction('shortify', fn(string $s, int $len = 10) => mb_substr($s, 0, $len));
234+
}
235+
```
236+
237+
V šabloně pak:
238+
239+
```latte
240+
<p>Cena: {$price|money}</p>
241+
<p>{shortify($description)}</p>
242+
```
215243

216-
// nebo konfigurujeme přímo objekt Latte\Engine
244+
Pro složitější logiku můžete konfigurovat přímo objekt `Latte\Engine`:
245+
246+
```php
247+
public function beforeRender(): void
248+
{
217249
$latte = $this->template->getLatte();
218250
$latte->setMigrationWarnings();
219251
}
220252
```
221253

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

224286
```php
225287
namespace App\Presentation\Accessory;
@@ -236,33 +298,41 @@ final class LatteExtension extends Latte\Extension
236298
public function getFilters(): array
237299
{
238300
return [
301+
'money' => fn($val) => number_format($val, 2, ',', ' ') . ' Kč',
239302
'timeAgoInWords' => $this->filterTimeAgoInWords(...),
240-
'money' => $this->filterMoney(...),
241303
// ...
242304
];
243305
}
244306

245307
public function getFunctions(): array
246308
{
247309
return [
310+
'stars' => fn($rating) => str_repeat('⭐', $rating),
248311
'canEditArticle' =>
249312
fn($article) => $this->facade->canEditArticle($article, $this->user->getId()),
250313
// ...
251314
];
252315
}
253316

317+
private function filterTimeAgoInWords(DateTimeInterface $time): string
318+
{
319+
// ...
320+
}
321+
254322
// ...
255323
}
256324
```
257325

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

260328
```neon
261329
latte:
262330
extensions:
263331
- App\Presentation\Accessory\LatteExtension
264332
```
265333

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ší.
335+
266336

267337
Překládání
268338
----------

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)