View/Action bez šablony
- maarlin
- Člen | 207
Po delší době jsem zase narazil na pár nejasností ohledně Nette:
Běžně se při vývoji setkávám s různými „akcemi“, které zaručeně
nikdy nebudou potřebovat šablonu – jako příklad za všechny: mazání
nějakých elementů (komentářů, článků) – prostě to většinou
proběhne tak, že článek se buď smaže, nastaví se flashMessage a
přesměruje se na seznam, nebo se nesmaže kvůli chybě, která se opět
nastaví do flashMessage a opět se přesměruje na seznam.
Pravděpodobně špatně chápu nějakou část Nette, ale věřím, že
existuje způsob, jak tu akci (deleteArticle, deleteComment) nadefinovat
v presenteru, aby nevyžadovala svoji šablonu.
Nevím, zda to souvisí ještě s předchozí záležitostí, ale mám ještě jeden případ, kdy nechci používat šablony – konkrétně nějaký updating různých věcí. Updating je přístupný přes nějaký presenter (dejme tomu UpdatePresenter) a tento presenter má pak konkrétní views, resp. actions, které zastupují jednotlivé věci, které se updatují (třeba u eshopu informace o zboží, ceny zboží, slevy… – všechno má různou prioritu a každá z těch věcí se updatuje různě často, proto jsou zvlášť). Tyto update views/actions ale asi taky nikdy nebudou potřebovat šablonu, resp. vzhledem k tomu, že se pouští cronem, neměly by vypisovat nic (v případě, že je vše OK), v případě debugovacího režimu můžou něco vypisovat, ale většinou to řeším přes echo uvnitř samotné definice view/action a používám prázdnou šablonu.
Jak ten updating a podobné věci řešíte vy?
- Honza Marek
- Člen | 1664
Pokud použiješ přesměrování, není šablona potřeba.
Dále lze také vykonávání presenteru korektně ukončit metodou
$this->terminate()
. Potom není také potřeba šablona.
Místo echování je lepší předat metodě terminate objekt třídy RenderResponse
$this->terminate(new RenderResponse("výstup"));
Presenter je potom lépe testovatelný pomocí unit testů.
- Ondřej Mirtes
- Člen | 1536
Tomu, co potřebuješ, se říká signál – v Presenteru se tyto metody prefixují slovem handle:
public function handleDelete($id) {
}
A v šabloně se na ně odkážeš jejich názvem + vykřičník:
{link delete! $id}
A fungují přesně tak, jak píšeš – jen u každého signálu, který
mění stav serveru (tzn. update, delete apod.), nezapomeň provést
redirect – $this->redirect('this');
.
Signály se dají použít i třeba pro předání informace, jakým směrem chceš seřadit sloupec v tabulce – (např. v metodě handleOrder změníš proměnnou $this->order, se kterou pak pracuješ v renderování) – v takovém případě se stav serveru nemění a redirect žádaný není :)
- Ondřej Brejla
- Člen | 746
Doporučuji podívat se na signály…
public function handleDelete(...) {...}
EDIT: Hmmm…tak jo no…opakování matka moudrosti :-D
Editoval Ondřej Brejla (19. 1. 2010 20:33)
- maarlin
- Člen | 207
Ondřej Mirtes napsal(a):
Tomu, co potřebuješ, se říká signál – v Presenteru se tyto metody prefixují slovem handle:
public function handleDelete($id) { }
A v šabloně se na ně odkážeš jejich názvem + vykřičník:
{link delete! $id}
A fungují přesně tak, jak píšeš – jen u každého signálu, který mění stav serveru (tzn. update, delete apod.), nezapomeň provést redirect –
$this->redirect('this');
.Signály se dají použít i třeba pro předání informace, jakým směrem chceš seřadit sloupec v tabulce – (např. v metodě handleOrder změníš proměnnou $this->order, se kterou pak pracuješ v renderování) – v takovém případě se stav serveru nemění a redirect žádaný není :)
Ondro, díky za kompletní a vyčerpávající odpověď. :-)