Skip to content

Commit b9ae2cf

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

File tree

3 files changed

+92
-19
lines changed

3 files changed

+92
-19
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: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,22 @@ 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-
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.
124139

125140
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:
126141

@@ -205,21 +220,71 @@ 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 metodě `render<View>` nebo `beforeRender()`:
209228

210229
```php
211230
public function beforeRender(): void
212231
{
213232
// přidání filtru
214-
$this->template->addFilter('foo', /* ... */);
233+
$this->template->addFilter('money', fn($val) => number_format($val, 2, ',', ' ') . ' Kč');
215234

216-
// nebo konfigurujeme přímo objekt Latte\Engine
235+
// přidání funkce
236+
$this->template->addFunction('shortify', fn(string $s, int $len = 10) => mb_substr($s, 0, $len));
237+
}
238+
```
239+
240+
V šabloně pak:
241+
242+
```latte
243+
<p>Cena: {$price|money}</p>
244+
<p>{shortify($description)}</p>
245+
```
246+
247+
Pro složitější logiku můžete konfigurovat přímo objekt `Latte\Engine`:
248+
249+
```php
250+
public function beforeRender(): void
251+
{
217252
$latte = $this->template->getLatte();
218253
$latte->setMigrationWarnings();
219254
}
220255
```
221256

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

224289
```php
225290
namespace App\Presentation\Accessory;
@@ -236,33 +301,41 @@ final class LatteExtension extends Latte\Extension
236301
public function getFilters(): array
237302
{
238303
return [
304+
'money' => fn($val) => number_format($val, 2, ',', ' ') . ' Kč',
239305
'timeAgoInWords' => $this->filterTimeAgoInWords(...),
240-
'money' => $this->filterMoney(...),
241306
// ...
242307
];
243308
}
244309

245310
public function getFunctions(): array
246311
{
247312
return [
313+
'stars' => fn($rating) => str_repeat('⭐', $rating),
248314
'canEditArticle' =>
249315
fn($article) => $this->facade->canEditArticle($article, $this->user->getId()),
250316
// ...
251317
];
252318
}
253319

320+
private function filterTimeAgoInWords(DateTimeInterface $time): string
321+
{
322+
// ...
323+
}
324+
254325
// ...
255326
}
256327
```
257328

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

260331
```neon
261332
latte:
262333
extensions:
263334
- App\Presentation\Accessory\LatteExtension
264335
```
265336

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ší.
338+
266339

267340
Překládání
268341
----------

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)