Signál versus akce a pokus o nezměnu view

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

Zdar,
mám AJAXový požadavek na odkazu, který smaže vybraný příspěvek z databáze a invaliduje snippet s příspěvky. Presenter má víc view i víc akcí. Když jde o Akci a zpracovává ho funkce ActionDelete(), tak vše proběhne jak má, ale presenter hledá template, která neexistuje, (Není důvod ji mít), takže jsem nastavil setView() na view odkud se požadavek posílá a všechno funguje v pořádku.

Pak jsem ale zde na fóru četl že pro Ajaxové požadavky je vhodnější použít signál. Přepsal jsem tedy metodu na HandleDelete() ale presenter se stále snaží najít šablonu toho jména a navíc už se nenechá oblbnout setView ani setLayout. Zkoušel jsem poslat všechny možné odpovědi, abych zastavil renderování, ale presenter se stále pokouší najít šablonu a vykreslit ji a není mi jasné proč? Díky za rady

Editoval Hafran (12. 1. 2012 13:59)

22
Člen | 1478
+
0
-

delete se řeší signalem, nikoliv view.. nejlepší je poslat kód a před tím ještě smazat cache.. takovýto několika odstavcový popis problému pak není zpravidla nutný.

Editoval 22 (12. 1. 2012 14:04)

Hafran
Člen | 121
+
0
-

OK dík, s tím signálem jsem si to myslel. Jen by mě zajímalo jak udělat aby mi ten signál nehledal šablonu a nechal mě tam kde se volá a jen invalidoval snippet.

<?php
public function handleTestDeleteWeb() {
		$id = $this->getParam("id");
		if ($this->isAjax()) {
			$res = $this->model->deleteWeb($id);
			if ($res) {
				$this->flashMessage("Smazání proběhlo v pořádku", "success");
			}
			$this->invalidateControl('weby');
			$this->invalidateControl('flashes');
		}

	}
?>

v šabloně mám odkaz:

<td><a n:href="Page:testDeleteWeb id=>$item->id" class="ajax">Smaž</a></td>

Po kliknutí mi to vyhodí do firelogu: Nette\Application\BadRequestException: Page not found. Missing template ‚…/inzerce/app/AdminModule/templates/Page/testDeleteWeb.latte‘. #404

hAssassin
Člen | 293
+
0
-

no mas tam dve chyby, za prvi v latte nemas odkaz na signal ale na akci pridej ! za nazev signalu:

<td><a n:href="testDeleteWeb! id=>$item->id" class="ajax">Smaž</a></td>

a za druhy bych doporucil presmerovat v handleTestDeleteWeb() zpatky na vypis:

$this->redirect("this"); // tusim ze se to tak zapisovalo

cimz se zabrani pokusu o znovu smazani polozky pokud nekdo da obnovit stranky v prohlizeci.

Hafran
Člen | 121
+
0
-

Super díky moc. Hloupá chyba ode mě. ;)

radas
Člen | 224
+
0
-

hAssassin napsal(a):

a za druhy bych doporucil presmerovat v handleTestDeleteWeb() zpatky na vypis:

$this->redirect("this"); // tusim ze se to tak zapisovalo

cimz se zabrani pokusu o znovu smazani polozky pokud nekdo da obnovit stranky v prohlizeci.

Myslím, že to není potřeba, když je kód obalený podmínkou

if ($this->isAjax())
{
}
Ascaria
Člen | 187
+
0
-

Klasické zakončení z tutoriálu:

<?php
if(!$this->isAjax())
    {
    $this->redirect('this');
    }
?>
Tomáš Votruba
Moderator | 1114
+
0
-

Ještě bych doplnil:

public function handleTestDeleteWeb($id) // id je předáno parametrem, netřeba getParam
{
	if ($this->model->deleteWeb($id)) { // smazat je potřeba tak jako tak
		$this->flashMessage("Smazání proběhlo v pořádku", "success");
	}
	// dobré by bylo informovat i o neúspěšném pokusu

	if ($this->isAjax()) { // ajaxem to bude hezčí
		$this->invalidateControl('weby');
		$this->invalidateControl('flashes');
	}
	else { // ale dozví se to i bez něj
		$this->redirect("this");
	}
}

Editoval Schmutzka (23. 3. 2012 10:46)

radas
Člen | 224
+
0
-

Ano, jak píše Schmutzka, ideálně bych to viděl obalit metodu z modelu blokem try a pak v catch chybu zalogovat a pro uživatele nastavit flash zprávičku o chybě.