Ajax vrací html stánku namísto json dat

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

Zdravim, snažim se o svůj prvni ajax požadavek. Dosáhl jsem toho že při kliku na odkaz se data neodešlou klasicky ale přes ajax. V prezenteru se vykoná daná operace, ale pokud na konci action zavolam redirect tak aplikace funguje dobře, vrátí data v json formátu, ale ihned potom se přesměruje, což samozřejmě nechci. No a pokud tam ten redirect nedám, tak se vrátí Internal server error. A pokud tam dám setView tak se v odezvě vrátí klasická html stránka místo json dat. Nevíte někdo kde může být chyba?

Patrik Votoček
Člen | 2221
+
0
-

bez kódu těžko hádat. nicméně pokud tam nemáš žádný snippet tak se ti posílá celá stránka (HTML).

joseff
Člen | 233
+
0
-

Jo já myslel že jsem ten kód popsal dostatečně. Tak ho ještě přikládám, tento kod tedy pri ajaxovam pozadavku vrati Internal server error. Vice v mem prvnim prispevku.

šablona default.phtml:

<a href="{link pokus}" class="ajax">testuj</a>
{snippet prekresli}
$cokoliv
{/snippet}

V prezenteru:

public function actionDefault()
{
   $this->template>cokoliv = 'nic';
}
public function actionPokus()
{
   $this->template->cokoliv = 'hura';
}
Šaman
Člen | 2635
+
0
-

default.latte

// tohle by nemělo být potřeba, ale bez toho mi ajaxové požadavky načítá normálně s reloadem
<script type="text/javascript">
  $("a.ajax").live("click", function (event) {
    event.preventDefault();
    $.get(this.href);
  });
</script>

<a href="{link pokus!}" class="ajax">testuj</a>
{snippet pokus}
  {$pokus}
{/snippet}

Presenter.php

private $pokus = "default";

public function renderDefault()
{
  $this->template->pokus = $this->pokus;
}

public function handlePokus()
{
  $this->pokus = "Ajax!";

  if ($this->isAjax())
  {
    $this->invalidateControl('pokus');
  }
}

Odzkoušeno s poslední verzí Nette bez prefixů a se skriptem jquery.nette zkopírovaným z exámplu Fifteen.

Editoval Šaman (13. 3. 2011 15:57)

bojovyletoun
Člen | 667
+
0
-

Chyba je, že odkaz vede na akci místo na signál. Myslím, že akce se k tomuto účelu nepoužívají (šlo by to vůbec)? Přinejmenším máš definovanou šablonu pokus.latte? Takže actionPokus přejmenuj na handlePokus v odkazu bude pokus!

m43x
Člen | 1
+
0
-

zdravim,

Imho:

Action/render:
v podstate rozdiel je iba v tom ze pri volani action/render cez ajax potrebujes mat zadefinovanu *.latte (co je uplne zbytocne v tomto pripade, navyse bez template to hodi 500 co je spravne).

Handle:
vyhoda handle je v tom ze template „nemusi byt zadefinovany“ teda iba invalidujes snippet.

v kazdom pripade ajax je mozne volat aj na action.

Editoval m43x (14. 3. 2011 9:31)

joseff
Člen | 233
+
0
-

Děkuji moc za cenné rady, už mi to šlape, udělal jsem to tedy přes handle, což mi přijde jednodušší. Ještě jedno velké díky.

montun
Člen | 2
+
0
-

Mě ajax nefungoval, když jsem měl vloženo za $application->run(); echo a výpis logů. Používám vlastní systém logování proměnných, který během vykonávání aplikace naplní statickou proměnou a tu pak vykreslí na konci stránky. To jestli je to vykreslení dobře umístěné v aplikaci bych neřešil, ale pro všechny nováčky toto může být dobrý návod, jak přijít na to proč nefunguje JSON jak má.