Presentery v ajaxové aplikaci s jQueryUI Dialogy

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

Mám aplikaci, která používá jQueryUI Dialogy a AJAX (ajaxové odesílání formulářů i zajaxovatění odkazů). Můj problém vidím v tom, že presenter narostl do obludných rozměrů (desítky metod handle…(), přes 3000 řádků kódu). Je mi jasné, že signály nelze volat na jiných presenterch.

Jak to řešíte vy?

Ot@s
Backer | 476
+
0
-

Snažím se presenter rozdrobit do komponent, pokud to jde. Věšinou se tam důvod/logika najde.
OT: mám podobný problém, ale s modely :-)

Etch
Člen | 403
+
0
-

Osobně mám formuláře ve vlastních třídách a v presenterech mám jen továrničky. Ve spojení s jQuery Dialogy mám jinou nesnáz, ale ta dost souvisí s tím jak ty formuláře používám.

Příklad:

Presenter articles má dvě view a to „Default“ a „AddArticle“. „Default“ prostě vypisuje všechny články a „AddArticle“ obsahuje jen formulář, který se natahuje do jQuery UI dialogu pomocí ajaxu. Problém je, že pokud odeslání formuláře z Dialogu proběhne v pořádku, tak už nejsem schopen překreslit články na „Articles:default“ a musím tam používat redirect. Teď už tady do toho kódu koukám asi 3 hodiny a už jsem se nějak pomalu vzdal myšlenky, že by se mi takovéto překreslování nějak povedlo rozchodit. :D

Etch
Člen | 403
+
0
-

Jinak nakonec ten refresh toho snippetu řeším pomocí dost šílené konstrukce v onSuccess:

		ob_start();
		$this['articles']->render();
		$articles = ob_get_clean();
		$this->payload->snippets['snippet--articles'] = $articles;
		$this->invalidateControl('articles');

Bohužel jsem nepřišel na to, jak to udělat nějak lépe.

iguana007
Člen | 970
+
0
-

Radas: taky jsem něco takového před časem řešil a rozdělil jsem si aplikaci do Presenterů – u mě se jednalo konkrétně o administraci CMS (požadavek byl full AJAX UI) a nikde přeci není napsáno, že se vše AJAXové musí dělat vyloženě přes handle, proto já to řeším přes action/render a mám tak aplikaci rozdělenou právě např. na: ArticlePresenter, UserPresenter, MediaPresenter a můžu si tak klidně volat odkaz v template Article:editArticle, kde mám např. proklik do uživatelova profilu v User:showProfile a funguje to bez problémů již několik let.
UI navíc bylo navržené takovým způsobem, že jsem se rovnou vykašlal na kompatibilitu pro non JS klienty, protože to by ani udělat nešlo (bez iFrames).

Etch: projdi si příklad AJAX aplikace na Githubu, to co děláš je špatně: https://github.com/…ster/Fifteen

Etch
Člen | 403
+
0
-

@iguana007:

Můžeš mi nějak naznačit, co přesně bych tam měl hledat?? Ve fifteen se ajax řeší pomocí signálů, které jsou volány v rámci jedné komponenty a view. To co dělám já je něco jiného. Mám jedno view „Articles“ a druhé view „addArticle“, které se natahuje do jQuery dialogu a je v něm formulář, který ajaxově odesílá data. Pokud je formulář nevalidní, tak do dialogu vypíše chyby. Pokud je validní, tak uloží data a zavře se. Ve výsledku mám tedy otevřené dvě view zároveň a já potřebuji view „Articles“ přinutit, aby po zavření Dialogu překreslilo svůj snippet. Toho lze dosáhnout buď redirectem a nebo explicitním naplněním dat daného snippetu v payloadu. Žádný jiný způsob mě bohužel nenapadá.