Životní cyklus – jak cosi udělat

Kcko
Člen | 470
+
0
-

Ahoj, chci se zeptat jen teoreticky …:

V render<Cosi> mám k dispozici data. (V action ne a neřešme, že to tam má být).
Pak v afterRender cosi ukládám a k nim uložíme i data z render<Cosi>.

To je fajn, funguje. Nicméně máme k tomu ke všemu i komponentu, kterou vykreslujeme na stránce a která ukazuje data zpožděná o 1 krok / 1 interakci či jak to říci, protože se vykreslí dřív než než se data z <renderCosi> předají do renderAfter.

Moje otázka zní, lze nějak ovlivnit to kdy se komponenta vykreslí? (I když napadlo mě ted, že bych si mohl v renderAfter na komponentu hrábnout a říct jí něco jako

<?php
$this['mojeKomponenta']->uzSeMuzesVykreslit(TRUE);

?>

A v komponentě si interně ověřit jestli už tenhle pokyn dostala, bude to vůbec fungovat? Nemám ted možnost si to ted vyzkoušet, proto se ptám nahlas. Nebo lze to nějak lépe?

Editoval Kcko (4. 9. 2018 21:16)

Ondřej Kubíček
Člen | 494
+
0
-

a co je „afterRender/renderAfter“ ? to v životní cyklu není, protože předpokládám že to není klasicky render<View>, to už tam máš ten renderCosi

Kcko
Člen | 470
+
0
-

Ondřej Kubíček napsal(a):

a co je „afterRender/renderAfter“ ? to v životní cyklu není, protože předpokládám že to není klasicky render<View>, to už tam máš ten renderCosi

Je ne? https://api.nette.org/…ter.php.html#215

MajklNajt
Člen | 501
+
0
-

ak s nejakými dátami, ktoré následne potrebuješ vykresliť, pracuješ až v afterRender(), je to blbý návrh – už len z názvu AFTER RENDER ti musí byť jasné, že už je stránka vykreslená a teda neovplyvníš to, čo už sa stalo…

Editoval MajklNajt (4. 9. 2018 22:12)

CZechBoY
Člen | 3608
+
0
-

Já bych si ty data ukládal do property. Ty data můžeš shánět třeba metodou needData, která naplní nějakou property pokud ještě nebude naplněná. Tu metodu zase zavoláš buď z renderXXX nebo v createComponentYYY.
No zajímalo by mě nakonec jestli může někdy dojít k tomu, že ty data nepotřebuješ vůbec, protože se tímhle způsobem snažíš ušetřit drahé tahání nějakých dat.

Kcko
Člen | 470
+
0
-

CZechBoY napsal(a):

Já bych si ty data ukládal do property. Ty data můžeš shánět třeba metodou needData, která naplní nějakou property pokud ještě nebude naplněná. Tu metodu zase zavoláš buď z renderXXX nebo v createComponentYYY.
No zajímalo by mě nakonec jestli může někdy dojít k tomu, že ty data nepotřebuješ vůbec, protože se tímhle způsobem snažíš ušetřit drahé tahání nějakých dat.

Věc se má takhle: někdo mě poprosil, abych mu pomohl s jistou funkčnostní; jedná se o zobrazovaní online uživatelů na webu,
uživatel – stránka, kterou si prohlíží (včetně prokliku) + datum a čas.

On má ten web udělaný tak, že má X presenterů a v nich pouze render metody (+ nějaký ten handle atd). Action metody nepoužívá. V render metodách získává data, načítá věci z DB, posílá do šablony atd.

Takže, aby se u tohoto způsobu dal zjistit nějaký jakože unikátní titulek každé stránky (detail produktu, výpis kategorie atd), tak jsem mu v BasePresenteru zavedl protected proměnnou $pageTitle, kterou naplním v každé renderMetodě.

Pak jediné místo kde můžu zaznamenat pohyb uživatele po webu a uložit si i ten titulek stránky, krom doplnění do všech renderMetod je afterRender – fajn, tak jsme to udělali.

Nicméně, jak jsem psal nahoře, já přijdu na web rovnou do nějakého detailu produktu a v tu chvíli se na webu jestě neukáže, že jsem já online a koukám na detail, protože výpis online uživatelů se uskuteční dřív, než dojde ke sběru dat a jeho uložení.

Teď je to jasné na co se ptám? (Kdyby se to udělalo tak, že v action metodě se získá titulek, v beforeRender dojde k uložení a trackingu uživatele, tak to není o ten 1 krok zpozděné).

Editoval Kcko (5. 9. 2018 9:49)

David Matějka
Moderator | 6445
+
+1
-

výpis online uživatelů se uskuteční dřív, než dojde ke sběru dat a jeho uložení.

nikoliv, nazev je sice trochu matouci, ale afterRender se nevola po vykresleni, ale po zavolani render metody a pred vykreslenim. kde nacitas ten seznam online uzivatelu, ktery vypisujes?

Pak jediné místo kde můžu zaznamenat pohyb uživatele po webu a uložit si i ten titulek stránky

proc se nekouknes do $this->request?

Kcko
Člen | 470
+
0
-

David Matějka napsal(a):

výpis online uživatelů se uskuteční dřív, než dojde ke sběru dat a jeho uložení.

nikoliv, nazev je sice trochu matouci, ale afterRender se nevola po vykresleni, ale po zavolani render metody a pred vykreslenim. kde nacitas ten seznam online uzivatelu, ktery vypisujes?

Pak jediné místo kde můžu zaznamenat pohyb uživatele po webu a uložit si i ten titulek stránky

proc se nekouknes do $this->request?

Ahoj Davide,

máš pravdu, podle https://api.nette.org/…ter.php.html#225 to tak je, takže to fungovat bude (já jsem mu ty úpravy jenom commitnul a pak jsem nad tím, už jen přemýšlel, a myslel jsem si, že to tak bude).

Bude to fungovat.

Kdy a kde se mám podívat do $this->request? Nebo co je tím míněno?

Martk
Člen | 661
+
0
-

@Kcko Předpokládám, že tohle je v administraci a opravdu ho zajímá, kde se právě on nachází/nacházel a zda je právě on online? To přece ví a ostatní uživatelé to zobrazí bez problému.

Nějaké řešení na to je, ale všechny co mě napadají jsou prasácké.

Editoval Martk (5. 9. 2018 10:19)

Kcko
Člen | 470
+
0
-

@Martk

Není, je to normálně na webu (je to defakto klon mého modulu z mého webu, který není na Nette viz http://bit.ly/2LZ2qe4)
Ale asi to už nemusíme řešit. Řešení nejčistčího rázů je používat Nette jak se má (Akce na data, Render na předání dat a nastavení šablon) a pokud už je to tak jak to nyní je, tak to taky funguje, akorát jsem se mylně domníval o nesprávné posloupci životního cyklu viz můj předchozí příspěvěk a díky @DavidMatějka

David Matějka
Moderator | 6445
+
0
-

Kdy a kde se mám podívat do $this->request? Nebo co je tím míněno?

kdekoliv, treba ve startup. jde o to, aby si aktualni stranku nezjistoval z nejakeho page title, ale z aplikacniho requestu

Kcko
Člen | 470
+
0
-

David Matějka napsal(a):

Kdy a kde se mám podívat do $this->request? Nebo co je tím míněno?

kdekoliv, treba ve startup. jde o to, aby si aktualni stranku nezjistoval z nejakeho page title, ale z aplikacniho requestu

Aktuální stránkou míním určitou část aplikace, co zrovna dělá.

Takže to může vypadat takto:

  • David Matějka si prohlíží Zápas mezi FC Barcelona a Realem Madrid v soutěži La Liga 2018–2019, 14:45
  • Kcko si prohlíží Článek souhrn 19. kola tipovací soutěže, 14:42

.
.
.

Tyto „nadpisy“ = „titulky“ získáš skutečně až v nějakých action/render metodách většinou z databáze a nemají přesnou masku, takže v $requestu je nenajdu a nedají se zautomatizovat :-)

CZechBoY
Člen | 3608
+
0
-

Už v akci přece víš co zobrazuješ, ne?

Stejně mi přijde zbytečný zobrazovat co zrovna dělám já, to snad vidím, ne? :D

Kcko
Člen | 470
+
0
-

CZechBoY napsal(a):

Už v akci přece víš co zobrazuješ, ne?

Stejně mi přijde zbytečný zobrazovat co zrovna dělám já, to snad vidím, ne? :D

Modul online lidi co dělají na stránce. Viz link v předchozím postu. Mnohdy skládám „titulek“ dynamicky z několika výsledků z DB.

Už není o čem se dál bavit ne? :-) Myslím, že jsem to popsal jasně a dostatečně.