Skip to content

Commit 0dfc000

Browse files
committed
persistent parameters: improved info
1 parent 91335b3 commit 0dfc000

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1688
-667
lines changed

application/bg/components.texy

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -233,31 +233,34 @@ $this->redirect(/* ... */); // пренасочване
233233
Постоянни параметри .[#toc-persistent-parameters]
234234
=================================================
235235

236-
Често е необходимо да се запази даден параметър в компонент за целия период на експлоатация на компонента. Това може да бъде например номер на страница в странирането. Този параметър трябва да бъде отбелязан като постоянен с помощта на анотацията `@persistent`.
236+
Постоянните параметри се използват за поддържане на състоянието на компонентите между различните заявки. Тяхната стойност остава същата дори след щракване върху връзката. За разлика от данните за сесията, те се прехвърлят в URL адреса. И се прехвърлят автоматично, включително връзките, създадени в други компоненти на същата страница.
237+
238+
Например, имате компонент за страниране на съдържание. На една страница може да има няколко такива компонента. И искате всички компоненти да останат на текущата си страница, когато щракнете върху връзката. Затова правим номера на страницата (`page`) постоянен параметър.
239+
240+
Създаването на постоянен параметър е изключително лесно в Nette. Просто създайте публично свойство и го маркирайте с атрибута: (преди се използваше `/** @persistent */` )
237241

238242
```php
239-
class PollControl extends Control
243+
use Nette\Application\Attributes\Persistent;
244+
245+
class PaginatingControl extends Control
240246
{
241-
/** @persistent */
242-
public int $page = 1;
247+
#[Persistent]
248+
public int $page = 1; // трябва да бъдат публични
243249
}
244250
```
245251

246-
Този параметър ще се предава автоматично във всяка връзка като параметър `GET`, докато потребителят напусне страницата с този компонент.
252+
Препоръчваме ви да включите типа данни (например `int`) към свойството, като можете да включите и стойност по подразбиране. Стойностите на параметрите могат да бъдат [валидирани |#Validation of Persistent Parameters].
247253

248-
.[caution]
249-
Никога не се доверявайте сляпо на постоянни параметри, тъй като те могат лесно да бъдат подправени (чрез презаписване на URL адреса). Проверете например дали номерът на страницата е в правилния интервал.
254+
Можете да променяте стойността на постоянен параметър, когато създавате връзка:
250255

251-
В PHP 8 можете също така да използвате атрибути, за да маркирате постоянни параметри:
256+
```latte
257+
<a n:href="this page: $page + 1">next</a>
258+
```
252259

253-
```php
254-
use Nette\Application\Attributes\Persistent;
260+
Или може да бъде *ресетнат*, т.е. да бъде премахнат от URL адреса. След това той ще приеме стойността си по подразбиране:
255261

256-
class PollControl extends Control
257-
{
258-
#[Persistent]
259-
public int $page = 1;
260-
}
262+
```latte
263+
<a n:href="this page: null">reset</a>
261264
```
262265

263266

@@ -378,7 +381,7 @@ interface PollControlFactory
378381

379382
1) може да се показва в шаблон
380383
2) той знае каква част от себе си да покаже по време на [заявката AJAX |ajax#invalidation] (фрагменти)
381-
3) може да съхранява състоянието си в URL (параметри за устойчивост).
384+
3) има възможност да съхранява състоянието си в URL (постоянни параметри).
382385
4) има възможност да реагира на действията (сигналите) на потребителя.
383386
5) създава йерархична структура (където коренът е главният).
384387

@@ -403,6 +406,33 @@ Nette\ComponentModel\Component { IComponent }
403406
[* lifecycle-component.svg *] *** * Жизнен цикъл на компонента* .<>
404407

405408

409+
Утвърждаване на постоянни параметри .[#toc-validation-of-persistent-parameters]
410+
-------------------------------------------------------------------------------
411+
412+
Стойностите на [постоянните параметри, |#persistent parameters] получени от URL адреси, се записват в свойствата чрез метода `loadState()`. Той също така проверява дали типът данни, зададен за свойството, съвпада, в противен случай ще отговори с грешка 404 и страницата няма да бъде показана.
413+
414+
Никога не се доверявайте сляпо на постоянните параметри, защото те лесно могат да бъдат пренаписани от потребителя в URL адреса. Например, така проверяваме дали номерът на страницата `$this->page` е по-голям от 0. Добър начин да направите това е да презапишете метода `loadState()`, споменат по-горе:
415+
416+
```php
417+
class PaginatingControl extends Control
418+
{
419+
#[Persistent]
420+
public int $page = 1;
421+
422+
public function loadState(array $params): void
423+
{
424+
parent::loadState($params); // тук се задава $this->page
425+
// следва проверката на потребителската стойност:
426+
if ($this->page < 1) {
427+
$this->error();
428+
}
429+
}
430+
}
431+
```
432+
433+
Противоположният процес, т.е. събирането на стойности от постоянни пропъртита, се обработва от метода `saveState()`.
434+
435+
406436
Сигнали в дълбочина .[#toc-signals-in-depth]
407437
--------------------------------------------
408438

application/bg/presenters.texy

Lines changed: 57 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -239,46 +239,54 @@ public function actionData(): void
239239
Постоянни параметри .[#toc-persistent-parameters]
240240
=================================================
241241

242-
Постоянните параметри се **предават автоматично** във връзките. Това означава, че не е необходимо да ги посочваме изрично във всеки `link()` или `n:href` в шаблона, но те все пак ще бъдат предадени.
242+
Постоянните параметри се използват за поддържане на състоянието между различните заявки. Стойността им остава същата дори след щракване върху връзката. За разлика от данните за сесията, те се предават в URL адреса. Това става напълно автоматично, така че не е необходимо да ги посочвате изрично в `link()` или `n:href`.
243243

244-
Ако приложението ви има няколко езикови версии, текущият език е параметър, който винаги трябва да бъде част от URL адреса. И би било изключително досадно да го споменаваме във всяка връзка. При Nette това не е необходимо. Затова просто отбелязваме параметъра `lang` като постоянен:
244+
Пример за използване? Имате многоезично приложение. Действителният език е параметър, който трябва да бъде част от URL адреса по всяко време. Но би било изключително досадно да го включвате във всяка връзка. Затова го правите постоянен параметър с име `lang` и той ще се пренася сам. Страхотно!
245+
246+
Създаването на постоянен параметър е изключително лесно в Nette. Просто създайте публично свойство и го маркирайте с атрибута: (преди се използваше `/** @persistent */` )
245247

246248
```php
249+
use Nette\Application\Attributes\Persistent;
250+
247251
class ProductPresenter extends Nette\Application\UI\Presenter
248252
{
249-
/** @persistent */
250-
public string $lang;
253+
#[Persistent]
254+
public string $lang; // трябва да бъдат публични
251255
}
252256
```
253257

254-
Ако текущата стойност на параметъра `lang` е `'en'`, тогава URL адресът, създаден с `link()` или `n:href` в шаблона, ще съдържа `lang=en`. Перфектно!
255-
256-
Можем обаче да добавим и параметъра `lang` и по този начин да променим стойността му:
257-
258-
```latte
259-
<a n:href="Product:show $id, lang: en">подробности на английском</a>
260-
```
261-
262-
Или пък можем да го изтрием, като му зададем стойност null:
263-
264-
```latte
265-
<a n:href="Product:show $id, lang: null">нажмите здесь</a>
266-
```
258+
Ако `$this->lang` има стойност като `'en'`, то връзките, създадени с помощта на `link()` или `n:href`, ще съдържат и параметъра `lang=en`. И когато върху връзката се щракне, тя отново ще бъде `$this->lang = 'en'`.
267259

268-
Една постоянна променлива трябва да бъде декларирана като публична. Можем да зададем и стойност по подразбиране. Ако параметърът има същата стойност като тази по подразбиране, той няма да бъде включен в URL адреса.
260+
За свойствата препоръчваме да включите типа данни (например `string`), а също така можете да включите стойност по подразбиране. Стойностите на параметрите могат да бъдат [валидирани |#Validation of Persistent Parameters].
269261

270-
Постоянството отразява йерархията на класовете на презентаторите, така че параметър, дефиниран в конкретен презентатор или черта, се предава автоматично на всеки презентатор, който наследява от него или използва същата черта.
262+
Постоянните параметри се предават между всички действия на даден презентатор по подразбиране. За да ги предадете между няколко водещи, трябва да ги дефинирате или:
271263

272-
В PHP 8 можете също така да използвате атрибути, за да маркирате постоянни параметри:
264+
- в общ предшественик, от който презентаторите наследяват
265+
- в чертата, която презентаторите използват:
273266

274267
```php
275-
use Nette\Application\Attributes\Persistent;
276-
277-
class ProductPresenter extends Nette\Application\UI\Presenter
268+
trait LangAware
278269
{
279270
#[Persistent]
280271
public string $lang;
281272
}
273+
274+
class ProductPresenter extends Nette\Application\UI\Presenter
275+
{
276+
use LangAware;
277+
}
278+
```
279+
280+
Можете да променяте стойността на постоянен параметър, когато създавате връзка:
281+
282+
```latte
283+
<a n:href="Product:show $id, lang: cs">detail in Czech</a>
284+
```
285+
286+
Или може да бъде *ресетнат*, т.е. да бъде премахнат от URL адреса. След това той ще приеме стойността си по подразбиране:
287+
288+
```latte
289+
<a n:href="Product:show $id, lang: null">click</a>
282290
```
283291

284292

@@ -302,7 +310,32 @@ class ProductPresenter extends Nette\Application\UI\Presenter
302310
Изисквания и параметри .[#toc-requirement-and-parameters]
303311
---------------------------------------------------------
304312

305-
Заявката, която се обработва от водещия, е обект [api:Nette\Application\Request] и се връща от метода на водещия `getRequest()`. Той включва масив от параметри, всеки от които принадлежи или на някой компонент, или директно на водещия (който всъщност също е компонент, макар и специален). По този начин Nette преразпределя параметрите и ги прехвърля между отделните компоненти (и водещия) чрез извикване на метода `loadState(array $params)`, който е описан по-подробно в главата [Компоненти |components]. Параметрите могат да се извличат чрез метода `getParameters(): array`, а поотделно - чрез `getParameter($name)`. Стойностите на параметрите са низове или масиви от низове, предимно необработени данни, получени директно от URL.
313+
Заявката, която се обработва от водещия, е обектът [api:Nette\Application\Request] и се връща от метода на водещия `getRequest()`. Тя включва масив от параметри и всеки от тях принадлежи или на някой от компонентите, или директно на водещия (който всъщност също е компонент, макар и специален). Затова Nette преразпределя параметрите и преминава между отделните компоненти (и водещия), като извиква метода `loadState(array $params)`. Параметрите могат да бъдат получени чрез метода `getParameters(): array`, а поотделно чрез `getParameter($name)`. Стойностите на параметрите са низове или масиви от низове, те по същество са необработени данни, получени директно от URL адреса.
314+
315+
316+
Утвърждаване на постоянни параметри .[#toc-validation-of-persistent-parameters]
317+
-------------------------------------------------------------------------------
318+
319+
Стойностите на [постоянните параметри, |#persistent parameters] получени от URL адреси, се записват в свойствата чрез метода `loadState()`. Той също така проверява дали типът данни, посочен в свойството, съвпада, в противен случай ще отговори с грешка 404 и страницата няма да бъде показана.
320+
321+
Никога не се доверявайте сляпо на постоянните параметри, тъй като те лесно могат да бъдат пренаписани от потребителя в URL адреса. Например, така проверяваме дали `$this->lang` е сред поддържаните езици. Добър начин да направите това е да пренастроите метода `loadState()`, споменат по-горе:
322+
323+
```php
324+
class ProductPresenter extends Nette\Application\UI\Presenter
325+
{
326+
#[Persistent]
327+
public string $lang;
328+
329+
public function loadState(array $params): void
330+
{
331+
parent::loadState($params); // тук се задава $this->lang
332+
// следва проверката на потребителската стойност:
333+
if (!in_array($this->lang, ['en', 'cs'])) {
334+
$this->error();
335+
}
336+
}
337+
}
338+
```
306339

307340

308341
Запазване и възстановяване на заявка .[#toc-save-and-restore-the-request]

0 commit comments

Comments
 (0)