Skip to content

Commit e6b7002

Browse files
committed
persistent parameters: updated info
1 parent 68c1f4b commit e6b7002

18 files changed

+119
-35
lines changed

application/cs/components.texy

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,30 +233,55 @@ $this->redirect(/* ... */); // a přesměrujeme
233233
Persistentní parametry
234234
======================
235235

236-
Často se stává, že je v komponentách potřeba držet nějaký parametr pro uživatele po celou dobu, kdy se s komponentou pracuje. Může to být například číslo stránky ve stránkování. Takový parametr označíme jako persistentní pomocí anotace `@persistent`.
236+
Hodnota persistentních parametrů se automaticky přenáší v každém odkaze. Takže jejich hodnota bude stejná i po kliknutí na odkaz, včetně odkazu vytvořeného v jiné komponentě. Můžeme v nich tak snadno přenášet třeba aktuální jazyk nebo číslo stránky. Stačí je jako persistentní označit tímto způsobem:
237237

238238
```php
239+
use Nette\Application\Attributes\Persistent;
240+
239241
class PollControl extends Control
240242
{
241-
/** @persistent */
243+
#[Persistent]
242244
public int $page = 1;
243245
}
244246
```
245247

246-
Tento parametr bude automaticky přenášen v každém odkazu jako GET parametr, a to až do chvíle, kdy uživatel stránku s touto komponentou opustí.
248+
Tento parametr se bude automaticky přenášet v každém odkazu jako GET parametr (tedy pokud jeho hodnota bude jiná než výchozi), a to až do chvíle, kdy uživatel stránku s touto komponentou opustí.
247249

248-
.[caution]
249-
Nikdy slepě nevěřte persistentním parametrům, protože mohou být snadno podvrženy (přepsáním v URL adrese stránky). Ověřte si například, zda je číslo stránky v platném rozsahu.
250+
Pamatujte, že persistentní property musí být deklarovaná jako public.
250251

251-
V PHP 8 můžete pro označení persistentních parametrů použít také atributy:
252+
.[note]
253+
Dříve se místo atributu `#[Persistent]` používala anotace `/** @persistent */`
252254

253-
```php
254-
use Nette\Application\Attributes\Persistent;
255+
Při vytváření odkazu lze persistentní parametr uvést a změnit jeho hodnotu:
256+
257+
```latte
258+
<a n:href="this page: $page + 1">next</a>
259+
```
260+
261+
Nebo jej lze odstranit tím, že ho vynulujeme (tj. vyresetujeme na výchozí hodnotu):
255262

263+
```latte
264+
<a n:href="this page: null">reset</a>
265+
```
266+
267+
Hodnoty do persistentních properties zapisuje metoda `loadState()`. Ta také kontroluje, zda odpovídá datový typ uvedený u property, jinak odpoví chybou 404 a stránka se nezobrazí.
268+
269+
Nikdy slepě nevěřte persistentním parametrům, protože mohou být snadno podvrženy (přepsáním v URL adrese stránky). Ověřte si například, zda je jazyk `$lang` mezi podporovanými. Vhodnou cestou je přepsat metodu `loadState()`:
270+
271+
```php
256272
class PollControl extends Control
257273
{
258274
#[Persistent]
259275
public int $page = 1;
276+
277+
public function loadState(array $params): void
278+
{
279+
parent::loadState($params); // zde se nastaví $this->page
280+
// následuje vlastní kontrola hodnoty
281+
if ($this->page < 1) {
282+
$this->error();
283+
}
284+
}
260285
}
261286
```
262287

application/cs/presenters.texy

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -244,37 +244,64 @@ Persistentní parametry se v odkazech **přenášejí automaticky**. To znamená
244244
Pokud má vaše aplikace více jazykových mutací, tak aktuální jazyk je parameter, který musí být neustále součástí URL. A bylo by neskutečně únavné ho v každém odkazu uvádět. To není s Nette potřeba. Prostě si parametr `lang` označíme jako persistentní tímto způsobem:
245245

246246
```php
247+
use Nette\Application\Attributes\Persistent;
248+
247249
class ProductPresenter extends Nette\Application\UI\Presenter
248250
{
249-
/** @persistent */
251+
#[Persistent]
250252
public string $lang;
251253
}
252254
```
253255

254-
Pokud aktuální hodnota parametru `lang` bude `'en'`, tak URL vytvořené pomocí `link()` nebo `n:href` v šabloně bude obsahovat `lang=en`. Paráda!
256+
Pokud hodnota `$this->lang` bude `'en'`, tak odkazy vytvořené pomocí `link()` nebo `n:href` budou také obsahovat parameter `lang=en`. Paráda!
255257

256-
Při vytváření odkazu nicméně lze persistentní parametr uvést a tím změnit jeho hodnotu:
258+
Pamatujte, že persistentní property musí být deklarovaná jako public. Můžete uvést i výchozí hodnotu (která se pak nebude v URL uvádět).
259+
260+
.[note]
261+
Dříve se místo atributu `#[Persistent]` používala anotace `/** @persistent */`
262+
263+
Při vytváření odkazu lze persistentní parametr uvést a změnit jeho hodnotu:
257264

258265
```latte
259266
<a n:href="Product:show $id, lang: cs">detail v češtině</a>
260267
```
261268

262-
Nebo jej lze naopak odstranit tím, že ho vynulujeme:
269+
Nebo jej lze odstranit tím, že ho vynulujeme:
263270

264271
```latte
265272
<a n:href="Product:show $id, lang: null">klikni</a>
266273
```
267274

268-
Persistentní proměnná musí být deklarovaná jako public. Můžeme uvést i výchozí hodnotu. Bude-li mít parametr hodnotu stejnou jako výchozí, nebude v URL obsažen.
269-
270-
Persistence zohledňuje hierarchii tříd presenterů, tedy parametr definovaný v určitém presenteru nebo traitě je poté automaticky přenášen do každého presenteru z něj dědícího nebo užívajícího stejnou traitu.
275+
Hodnoty do persistentních properties zapisuje metoda `loadState()`. Ta také kontroluje, zda odpovídá datový typ uvedený u property, jinak odpoví chybou 404 a stránka se nezobrazí.
271276

272-
V PHP 8 můžete pro označení persistentních parametrů použít také atributy:
277+
Nikdy slepě nevěřte persistentním parametrům, protože mohou být snadno podvrženy (přepsáním v URL adrese stránky). Ověřte si například, zda je jazyk `$lang` mezi podporovanými. Vhodnou cestou je přepsat metodu `loadState()`:
273278

274279
```php
275-
use Nette\Application\Attributes\Persistent;
276-
277280
class ProductPresenter extends Nette\Application\UI\Presenter
281+
{
282+
#[Persistent]
283+
public string $lang;
284+
285+
public function loadState(array $params): void
286+
{
287+
parent::loadState($params); // zde se nastaví $this->lang
288+
// následuje vlastní kontrola hodnoty
289+
if (!in_array($this->lang, ['en', 'cs'])) {
290+
$this->error();
291+
}
292+
}
293+
}
294+
```
295+
296+
Aby se persistentní parametry přenášely mezi více presentery, je potřeba je definovat buď:
297+
298+
- na společném předkovi, od kterého všechny dědí
299+
- v traitě, kterou všechny používají
300+
301+
Příklad traity s persistentním parametrem:
302+
303+
```php
304+
trait LangAware
278305
{
279306
#[Persistent]
280307
public string $lang;
@@ -302,7 +329,7 @@ S tím, co jsme si dosud v této kapitole ukázali, si nejspíš úplně vystač
302329
Požadavek a parametry
303330
---------------------
304331

305-
Požadavek, který vyřizuje presenter, je objekt [api:Nette\Application\Request] a vrací ho metoda presenteru `getRequest()`. Jeho součástí je pole parametrů a každý z nich patří buď některé z komponent, nebo přímo presenteru (což je vlastně také komponenta, byť speciální). Nette tedy parametry přerozdělí a předá mezi jednotlivé komponenty (a presenter) zavoláním metody `loadState(array $params)`, což dále popisujeme v kapitole [Komponenty|components]. Získat parametry lze metodu `getParameters(): array`, jednotlivě pomocí `getParameter($name)`. Hodnoty parametrů jsou řetězce či pole řetězců, jde v podstatě o surové data získané přímo z URL.
332+
Požadavek, který vyřizuje presenter, je objekt [api:Nette\Application\Request] a vrací ho metoda presenteru `getRequest()`. Jeho součástí je pole parametrů a každý z nich patří buď některé z komponent, nebo přímo presenteru (což je vlastně také komponenta, byť speciální). Nette tedy parametry přerozdělí a předá mezi jednotlivé komponenty (a presenter) zavoláním metody `loadState(array $params)` (viz také [Persistentní parametry]). Získat parametry lze metodu `getParameters(): array`, jednotlivě pomocí `getParameter($name)`. Hodnoty parametrů jsou řetězce či pole řetězců, jde v podstatě o surové data získané přímo z URL.
306333

307334

308335
Uložení a obnovení požadavku

best-practices/bg/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ class AdminPresenter extends Nette\Application\UI\Presenter
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/cs/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Presenter `SignPresenter` bude krom formuláře pro přihlášení obsahovat i p
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/de/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Der Präsentator `SignPresenter` enthält einen persistenten Parameter `$backlin
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/el/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ class AdminPresenter extends Nette\Application\UI\Presenter
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/en/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ The `SignPresenter` presenter will contain a persistent `$backlink` parameter to
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/es/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ El presentador `SignPresenter` contendrá un parámetro persistente `$backlink`
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/fr/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Le présentateur `SignPresenter` contiendra un paramètre persistant `$backlink`
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/hu/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ A `SignPresenter` prezenter a bejelentkezési űrlapon kívül tartalmazni fog e
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/it/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Il presentatore `SignPresenter` conterrà un parametro persistente `$backlink` i
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/pl/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Prezenter `SignPresenter` będzie zawierał, oprócz formularza logowania, trwa
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/pt/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ O apresentador `SignPresenter` conterá um parâmetro persistente `$backlink` no
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/ro/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Prezentatorul `SignPresenter` va conține un parametru persistent `$backlink` î
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/ru/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ class AdminPresenter extends Nette\Application\UI\Presenter
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/sl/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ Predstavnik `SignPresenter` bo poleg obrazca za prijavo vseboval tudi trajni par
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/tr/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ class AdminPresenter extends Nette\Application\UI\Presenter
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

best-practices/uk/restore-request.texy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ class AdminPresenter extends Nette\Application\UI\Presenter
3131

3232

3333
```php
34+
use Nette\Application\Attributes\Persistent;
35+
3436
class SignPresenter extends Nette\Application\UI\Presenter
3537
{
36-
/** @persistent */
38+
#[Persistent]
3739
public string $backlink = '';
3840

3941
protected function createComponentSignInForm()

0 commit comments

Comments
 (0)