Linkování na akci

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

Ahoj,

mám v aplikaci zprávy, u každé zprávy mám odkaz na smazání. Odkaz linkuji jako:

{link Zpravy:delete, $zprava->id}

V ZpravyPresenter.php mám actionDelete(). Odkaz však nefunguje, když nad něj najedu myší, píše stavový řádek error: No route for Zpravy:delete(id=x).

Musím vytvářet routy také pro akce? Nebo mám odkaz vytvořen nějak špatně?

Díky

redhead
Člen | 1313
+
0
-

Myslím že na tyhle věci se lépe hodí signály než actiony (i když nevím jestli to konkrétně řeší tvůj problém). Podívej se na ně.

{plink Zpravy:delete! $zprava->id}
public function handleDelete($id)
{
	//smazaní z databáze
}

Editoval redhead (6. 9. 2009 21:16)

weckho
Člen | 94
+
0
-

Díky, po úpravě funguje:

{plink Delete! $zprava->id}

Tento tvar nefunguje:

{plink Zpravy:delete! $zprava->id}

Píše to (ve stavovém řádku): error: Unknow signal ‚ZpravyPresenter:Zpravy:delete!‘. Nevím proč. Mohl by mi ještě někdo objasnit, k čemu jsou vhodné akce a k čemu signály? Mám v tom zmatek.

Díky

Editoval weckho (6. 9. 2009 21:48)

DocX
Člen | 154
+
0
-

viz https://doc.nette.org/…n/presenters

Signál „spouští“ událost na presenteru a může být vyvolán pouze z aktuálního presenteru (například stisknutí tlačítka apod.). Signál nelze volat na jiný presenter! Je základním prvkem AJAXu v Nette.

Akce je v podstatě něco jako podstránka presenteru, neboli sekce nějakého logického celku. Například presenter MůjÚčet bude mít akce Zobraz, Edituj. Každá akce pak může mít různé view, například podle typu uživatele.

Pak akce může být buď „zobrazovcí“ (nechá spustit render) nebo může být pouze „akční“ (něco provede a přesměruje jinam). Akční akce by ale měly být tvořeny signály.

Takto to alespoň chápu já :) Připomínky vítám :)

Editoval DocX (6. 9. 2009 22:34)

Ondřej Mirtes
Člen | 1536
+
0
-

Já bych ještě doplnil, že signálů jsou dva druhy:

  • ty, které mění stav aplikace a je tudíž po nich třeba provést přesměrování (nejčastěji $this->redirect('this'))
    • např. hlasování v anketě, přihlášení uživatele, odeslání komentáře
    • proč přesměrování (303 See Other): jednak aby třeba vyhledávače nezaregistrovaly link přímo na tu akci (což by vedlo třeba k nechtěnému hlasování v anketě a dalším i zkázonosnějším situacím) a v případě formulářů, aby nedocházelo k opětovnému odeslání pomocí F5 (více na wikipedii – Post/Redirect/Get)
  • ty, které nějak ovlivňují dané view a přesměrování je u nich nepotřebné, ba přímo nežádoucí. Např. řazení sloupce v tabulce, stránkování… V tom případě v adrese zůstává tvar např. (/kategorie/procesory/?paginator-page=15&do=paginator-page) a když uživatel někomu pošle odkaz, načte se mu rovnou na 15té stránce. Do této kategorie patří i případy, kdy se vyplatí formulář odesílat GET metodou (vyhledávání, právě přechod na stránku pomocí zapsání jejího čísla apod.)