AJAXový výpis
- JajazXbm
- Člen | 29
Zdravím,
vytvářím jednoduchou aplikaci v nette, která by měla pracovat AJAXově a
vůbec nevím jak na to.
Mám db tabulku kategorie(id, nazev, orderby) kde podle sloupce
orderby je prováděno řazení výpisu. Vytvářím aplikaci, která
by umožňovala měnit hodnoty v sloupci orderby. Šablona při
defaultní akci vypadá takto:
<script src="js/jquery.js" type="text/javascript"></script>
<script src="js/jquery.nette.js" type="text/javascript"></script>
{snippet}
<table>
{foreach $kategorie as $item}
<tr>
<td>{$item['nazev']}<td>
<a href="{plink UserKategorie:nahoru, $item['id']}" class="ajax">nahoru</a>
{/if}
<td>
<a href="{plink UserKategorie:dolu, $item['id']}" class="ajax">dolu</a>
{/if}
{/foreach}
</table>
{/snippet}
V presenteru mám definovanou akci nahoru takto:
public function actionNahoru($id)
{
$this->template->kategorie=$this->kategorie->nahoru($id);//provede v databázi posun nahoru. Vrátí výpis znovu seřazený.
if(!$this->isAjax()){
$this->redirect('UserKategorie:Default');
}
else{
$this->forward('UserKategorie:Default');
}
}//public function actionNahoru($id)
Teď k problému. Aplikace funguje. Tedy akce se provede, v databázi je
pořadí správně změněno, ale na stránce se výpis nezmění, zůstane tak
jak byl původně. Pokud obnovím stránku v prohlížeči tak se výpis
zobrazí správně seřazený.
Potřeboval bych udělat, aby se po stisknutí odkazu nahoru výpis seřadil
znovu. Jak na to, ale nevím.
- Honza Marek
- Člen | 1664
Lepší bude, když to uděláš jako signál a ne jako speciální action. Signál bych přiblížil jako funkci, která se vykoná navíc oproti normálnímu zpracování action, tedy nebudeš muset nic forwardovat, aby ses dostal na action default.
- Ondřej Mirtes
- Člen | 1536
Ano, něco o problematice máš tady:
https://doc.nette.org/…n/presenters#…
https://doc.nette.org/…ication/ajax
A nezapomeň na zavináčovou magii, tzn. obohatit všechna místa, kde tu šablonu „includuješ“, zavináči, např.:
@{? $content->render() }
BTW: Ta tvoje šablona je nějaká divná:
- odkazy na skripty bys měl mít v <head> a cestu k nim obohacenou o
{$baseUri}
({$baseUri}js/...
) - nechápu v ní ta uzavření neotevřených ifů
- JajazXbm
- Člen | 29
Ta šablona se nikde neincluduje. Jenom se zobrazí při defaultní akci.
Uzavření neotevřených ifů tam nepatří, to sem zapomněl odmazat.
Skripty v <head>? K tomu nevidím důvod. To buch musel změnit
@layout.phtml a ty skripty potřebuju pouze na této jediné stránce a
jinde ne. Proto jsem je do head nedal. $baseUri
tam
přidat můžu.
- JajazXbm
- Člen | 29
Tak jsem si přečetl ten odkazovaný článek a změnil jsem odkazy v šabloně na:
<a href="{link dolu, $item['id']}" class="ajax">
a metodu v presenteru na:
public function handleNahoru($id)
{
$this->template->kategorie=$this->kategorie->nahoru($id);
if(!$this->isAjax()){
$this->redirect('UserKategorie:Default');
}
}//public function actionNahoru($id)
Nicméně vygenerovaný odkaz vypadá takto:
error: Extra parameter for 'UserKategorie:nahoru'.
- Ondřej Mirtes
- Člen | 1536
Pokud voláš signály v šabloně presenteru, patří ještě za jeho název vykřičník :)
Editoval LastHunter (25. 6. 2009 13:28)
- JajazXbm
- Člen | 29
Takže znovu:
odkaz v šabloně:
<a href="{link nahoru! $item['id']}" class="ajax">
Presenter:
public function handleNahoru($id)
{
$this->template->kategorie=$this->kategorie->nahoru($id);
$this->invalidateControl('vypis');
$this->template->setFile('UserKategorie.default.phtml');
if(!$this->isAjax()){
$this->redirect('UserKategorie:Default');
}
}//public function handleNahoru($id)
Změna v databázi proběhne, ale stránka zůstává stejná. Tedy pořadí výpisu se nezmění.
- Honza Marek
- Člen | 1664
Ode dneška prý budou nové a lepší šablony – bez zavináčů a tak, tak to pak můžeš zkusit s nima.