Signál versus akce a pokus o nezměnu view
- Hafran
- Člen | 121
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)
- Hafran
- Člen | 121
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
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.
- radas
- Člen | 224
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())
{
}
- Tomáš Votruba
- Moderator | 1114
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)