Presentery v ajaxové aplikaci s jQueryUI Dialogy
- radas
- Člen | 225
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?
- Etch
- Člen | 403
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
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
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
@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á.