AJAXový výpis

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

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

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.

JajazXbm
Člen | 29
+
0
-

Jako signál? To znamená, že místo plink budu v té šabloně volat link?

Ondřej Mirtes
Člen | 1536
+
0
-

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

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

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 &#039;UserKategorie:nahoru&#039;.
Ondřej Mirtes
Člen | 1536
+
0
-

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)

Tomik
Nette Evangelist | 485
+
0
-

<a href="{link dolu! $item['id']}" class="ajax">

Edit: Ha! LastHunter byl rychlejší!

Editoval Tomik (25. 6. 2009 13:35)

JajazXbm
Člen | 29
+
0
-

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í.

JajazXbm
Člen | 29
+
0
-

Zavináč do layoutu jsem přidal, ale žádná změna. Myslím si, že mi někde něco uniká, ale vůbec nevím co.

Honza Marek
Člen | 1664
+
0
-

Ode dneška prý budou nové a lepší šablony – bez zavináčů a tak, tak to pak můžeš zkusit s nima.

JajazXbm
Člen | 29
+
0
-

Už mi to funguje. Udělal jsem chybu v $this->template->setFile(‚UserKategorie.default.phtml‘); a pak samozřejmě v tom zavináči. Neuvědomil jsem si, dokud mě na to neupozornil romansklenar, že tu šablonu includuju i v layoutu.
Takže díky všem za pomoc.