You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Често е необходимо да се запази даден параметър в компонент за целия период на експлоатация на компонента. Това може да бъде например номер на страница в странирането. Този параметър трябва да бъде отбелязан като постоянен с помощта на анотацията `@persistent`.
236
+
Постоянните параметри се използват за поддържане на състоянието на компонентите между различните заявки. Тяхната стойност остава същата дори след щракване върху връзката. За разлика от данните за сесията, те се прехвърлят в URL адреса. И се прехвърлят автоматично, включително връзките, създадени в други компоненти на същата страница.
237
+
238
+
Например, имате компонент за страниране на съдържание. На една страница може да има няколко такива компонента. И искате всички компоненти да останат на текущата си страница, когато щракнете върху връзката. Затова правим номера на страницата (`page`) постоянен параметър.
239
+
240
+
Създаването на постоянен параметър е изключително лесно в Nette. Просто създайте публично свойство и го маркирайте с атрибута: (преди се използваше `/** @persistent */` )
237
241
238
242
```php
239
-
class PollControl extends Control
243
+
use Nette\Application\Attributes\Persistent;
244
+
245
+
class PaginatingControl extends Control
240
246
{
241
-
/** @persistent */
242
-
public int $page = 1;
247
+
#[Persistent]
248
+
public int $page = 1; // трябва да бъдат публични
243
249
}
244
250
```
245
251
246
-
Този параметър ще се предава автоматично във всяка връзка като параметър `GET`, докато потребителят напусне страницата с този компонент.
252
+
Препоръчваме ви да включите типа данни (например `int`) към свойството, като можете да включите и стойност по подразбиране. Стойностите на параметрите могат да бъдат [валидирани |#Validation of Persistent Parameters].
247
253
248
-
.[caution]
249
-
Никога не се доверявайте сляпо на постоянни параметри, тъй като те могат лесно да бъдат подправени (чрез презаписване на URL адреса). Проверете например дали номерът на страницата е в правилния интервал.
254
+
Можете да променяте стойността на постоянен параметър, когато създавате връзка:
250
255
251
-
В PHP 8 можете също така да използвате атрибути, за да маркирате постоянни параметри:
256
+
```latte
257
+
<a n:href="this page: $page + 1">next</a>
258
+
```
252
259
253
-
```php
254
-
use Nette\Application\Attributes\Persistent;
260
+
Или може да бъде *ресетнат*, т.е. да бъде премахнат от URL адреса. След това той ще приеме стойността си по подразбиране:
255
261
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>
261
264
```
262
265
263
266
@@ -378,7 +381,7 @@ interface PollControlFactory
378
381
379
382
1) може да се показва в шаблон
380
383
2) той знае каква част от себе си да покаже по време на [заявката AJAX |ajax#invalidation] (фрагменти)
381
-
3) може да съхранява състоянието си в URL (параметри за устойчивост).
384
+
3) има възможност да съхранява състоянието си в URL (постоянни параметри).
382
385
4) има възможност да реагира на действията (сигналите) на потребителя.
383
386
5) създава йерархична структура (където коренът е главният).
Стойностите на [постоянните параметри, |#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()`.
Copy file name to clipboardExpand all lines: application/bg/presenters.texy
+57-24Lines changed: 57 additions & 24 deletions
Original file line number
Diff line number
Diff line change
@@ -239,46 +239,54 @@ public function actionData(): void
239
239
Постоянни параметри .[#toc-persistent-parameters]
240
240
=================================================
241
241
242
-
Постоянните параметри се **предават автоматично** във връзките. Това означава, че не е необходимо да ги посочваме изрично във всеки `link()` или `n:href` в шаблона, но те все пак ще бъдат предадени.
242
+
Постоянните параметри се използват за поддържане на състоянието между различните заявки. Стойността им остава същата дори след щракване върху връзката. За разлика от данните за сесията, те се предават в URL адреса. Това става напълно автоматично, така че не е необходимо да ги посочвате изрично в `link()` или `n:href`.
243
243
244
-
Ако приложението ви има няколко езикови версии, текущият език е параметър, който винаги трябва да бъде част от URL адреса. И би било изключително досадно да го споменаваме във всяка връзка. При Nette това не е необходимо. Затова просто отбелязваме параметъра `lang` като постоянен:
244
+
Пример за използване? Имате многоезично приложение. Действителният език е параметър, който трябва да бъде част от URL адреса по всяко време. Но би било изключително досадно да го включвате във всяка връзка. Затова го правите постоянен параметър с име `lang` и той ще се пренася сам. Страхотно!
245
+
246
+
Създаването на постоянен параметър е изключително лесно в Nette. Просто създайте публично свойство и го маркирайте с атрибута: (преди се използваше `/** @persistent */` )
245
247
246
248
```php
249
+
use Nette\Application\Attributes\Persistent;
250
+
247
251
class ProductPresenter extends Nette\Application\UI\Presenter
248
252
{
249
-
/** @persistent */
250
-
public string $lang;
253
+
#[Persistent]
254
+
public string $lang; // трябва да бъдат публични
251
255
}
252
256
```
253
257
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:
Ако `$this->lang` има стойност като `'en'`, то връзките, създадени с помощта на `link()` или `n:href`, ще съдържат и параметъра `lang=en`. И когато върху връзката се щракне, тя отново ще бъде `$this->lang = 'en'`.
267
259
268
-
Една постоянна променлива трябва да бъде декларирана като публична. Можем да зададем и стойност по подразбиране. Ако параметърът има същата стойност като тази по подразбиране, той няма да бъде включен в URL адреса.
260
+
За свойствата препоръчваме да включите типа данни (например `string`), а също така можете да включите стойност по подразбиране. Стойностите на параметрите могат да бъдат [валидирани |#Validation of Persistent Parameters].
269
261
270
-
Постоянството отразява йерархията на класовете на презентаторите, така че параметър, дефиниран в конкретен презентатор или черта, се предава автоматично на всеки презентатор, който наследява от него или използва същата черта.
262
+
Постоянните параметри се предават между всички действия на даден презентатор по подразбиране. За да ги предадете между няколко водещи, трябва да ги дефинирате или:
271
263
272
-
В PHP 8 можете също така да използвате атрибути, за да маркирате постоянни параметри:
264
+
- в общ предшественик, от който презентаторите наследяват
265
+
- в чертата, която презентаторите използват:
273
266
274
267
```php
275
-
use Nette\Application\Attributes\Persistent;
276
-
277
-
class ProductPresenter extends Nette\Application\UI\Presenter
268
+
trait LangAware
278
269
{
279
270
#[Persistent]
280
271
public string $lang;
281
272
}
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 адреса. След това той ще приеме стойността си по подразбиране:
Заявката, която се обработва от водещия, е обект [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]
Стойностите на [постоянните параметри, |#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
+
```
306
339
307
340
308
341
Запазване и възстановяване на заявка .[#toc-save-and-restore-the-request]
0 commit comments