Jak poskládat pohled z více nezávislých presenterů?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Šaman
Člen | 2664
+
0
-

Ahoj. Mám aplikaci, která se během času trochu přerostla. Ta aplikace má homepage, kde je souhrn téměř všeho. Je na ní spousta panelů a na každém panelu je skryto několik formulářů (zobrazí se ajaxem na požádání, ale vytvořené jsou vždy). Rozdělit na více samostatných stránek si zákazník nepřeje, vyhovuje mu mít všechnu základní agendu na jednom místě. Ale ta homepage už je pomalá a je potřeba ji zrychlit.

Otázka tedy zní – je možné nějak zařídit, aby se ajaxem překreslený panel (popup, cokoliv) načetl z úplně jiného pohledu presenteru? V tuhle chvíli se mi při každém překreslení spustí celý ten moloch s desítky formulářů a nakonec se většina zahodí a překreslí jen malá část. Mám to rozdělené do mnoha samostatných komponent, ale neumím je spouštět samostatně.

Idea je taková, že formuláře, panely a taby budou rozdělené do samostatných pohledů. Ty budou jednoduché, přehledné a snadno testovatelné.
A pak bude hlavní homepage pohled, který bude mít za úkol seskládat celou homepage z těch částí a při ajaxovém požadavku na překreslení některého snippetu si vyrenderuje opravdu jen ten jeden, nebo více pohledů, kterých se to týká.

Má takové řešení už nějaký precedens? Nebo je to z nějakého důvodu neprůchodné? RFC, pls.

(P.S. Při řešení není úplně nutné omezovat se na pohledy presenterů – úplně by mi stačilo ajaxově vytvořit a přerenderovat jednu komponentu. Ale nechci kvůli změně v jedné komponentě muset vytvořit a přepočítat dalších deset. A rád bych použil nette ajax – s JS si nerozumím natolik, abych si psal komplet vlastní řešení.)

Editoval Šaman (6. 7. 2017 13:23)

David Matějka
Moderator | 6445
+
0
-

To, ze se prekresluje jen jedna komponenta je bezne chovani – ze se ti tedy ted prekresluji vsechny znamena, ze tam mas nekde chybu, ktera zpusobuje, ze se ti vsechny inicializuji a prekresli. Kde mas umistene ty snippety? jak volas redrawControl?

Šaman
Člen | 2664
+
0
-

Ony se nepřekreslí. Ale na serveru se mi přece vytvoří celá stránka a pak se odešle jen jeden snippet k překreslení, nebo ne?

(Jen pro jistotu – jedu ještě na Nette 2.3 kvůli kompatibilitě s PHP. Tam se ještě ajax ladí trochu těžkopádně, ale ověřím si ve firebugu, jestli se mi spustí konstruktor i nepoužívaných komponent.)

David Matějka
Moderator | 6445
+
0
-

kdyz mas invalidovanou jen jednu komponentu, tak se vola jen ta

vice o snippetech v moji prednasce :)

Šaman
Člen | 2664
+
0
-

Tak ověřeno – konstruktor proběhne i u těch nepoužívaných. Render jen, když je potřeba. A případné formuláře v těch komponentách také jen, jsou li potřeba.
Budu si muset nějak změřit jestli to zdržují ty konstruktory, nebo je problém jinde.

Díky za odkaz :)

newPOPE
Člen | 648
+
0
-

Pokial konstruktory obmedzis len na zaklady init komponenty (nasetovat properties) tak potom by to az tak brzdit nemalo.

David Matějka
Moderator | 6445
+
+1
-

ale ani konstruktory by se volat nemely – pokud tedy komponenty vytvaris pres createComponent metody. ty se volaji az kdyz je komponenta nekde „rucne“ zavolana

CZechBoY
Člen | 3608
+
0
-

Komponenta by se mela vytvorit az pri zavolani factory->create().
Zkus Blackfire a uvidis :-)

ps. pouzivas lazy createComponent nebo addComponent?

Editoval CZechBoY (6. 7. 2017 14:44)

Šaman
Člen | 2664
+
0
-

Což o to, proč se komponenty vytvářejí, to jsem zjistil rychle. V action metodě jim nastavuji ID osoby, které se ta stránka týká. Nechtěl jsem, aby si ji komponenty samy tahaly z requestu a proč to není v createComponent už teď nevím, ale z nějakého důvodu jsem to z tama kdysi přesouval do setteru.

Nicméně jsem zjistil, že v tom problém není. Od konstruktoru až na konec render metody presenteru uběhne asi 0.2s, což je v pohodě. Teď se snažím testovat vykreslení, ale tam je to samy snippet a tak se měření času dost komplikuje.

@DavidMatějka: Přednáška super, aspoň vím, proč se mi nespouští ladicí kód v šabloně mimo snippety :)

Editoval Šaman (6. 7. 2017 15:10)

CZechBoY
Člen | 3608
+
0
-

No za render metodou uz ale nic neni. Nezabiji ti to nejaka shutdown funkce?

Ten Blackfire si zkousel?