View/Action bez šablony

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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ěď. :-)