První setkání s AJAXem, nedaří se rozchodit

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

Zdravím, v rámci učení se s Nette mám napsanou aplikaci, která tahá data z DB a umožňuje je přihlášeným uživatelům měnit a tak dále. Nyní bych rád zejména výpis dat udělal přes AJAX (kvůli procházení jednotlivých stránek a řazení), ale nějak se mi to nedaří.

Takže mám view.latte, kde je vyroben výpis tabulky z DB + stránkování.

<table n:snippet='punishments'>
	<thead>
		<tr>
			<th class='active' title='Zobrazuje, zda je či není daný trest aktivní.'>&nbsp;</th>
			<th><a n:href='Punishments:view type, $order, $page, $search'>Typ trestu</a></th>
			<th><a n:href='Punishments:view name, $order, $page, $search'>Přezdívka hráče</a></th>
			<th><a n:href='Punishments:view reason, $order, $page, $search'>Důvod trestu</a></th>
			<th><a n:href='Punishments:view admin, $order, $page, $search'>Přezdívka admina</a></th>
			<th><a n:href='Punishments:view time, $order, $page, $search'>Datum udělení trestu</a></th>
		</tr>
	</thead>
	<tbody n:if='$punishments' n:inner-foreach='$punishments as $punishment'>
		<tr id='{$punishment[id]}' n:class='$iterator->counter % 2 ? even : odd'>
			<td n:if='$punishment[active]' class='active'><img src='{$basePath}/images/success.png' alt='Aktivní trest' /></td>
			<td n:if='!$punishment[active]' class='active'><img src='{$basePath}/images/error.png' alt='Neaktivní trest' /></td>
			<td class='type'>{$punishment[type]}</td>
			<td class='name'>{$punishment[name]}</td>
			<td class='reason'>{$punishment[reason]}</td>
			<td class='admin'>{$punishment[admin]}</td>
			<td class='startTime'>{$punishment[startTime]}</td>
		</tr>
	</tbody>
</table>
<div class='pages' n:inner-for='$i = 1; $i <= $pagesCount; $i++'>
	<a n:if='$i === 1' class='ajax' n:href='Punishments:view $sortPage, $orderPage, $i, $search'>První strana</a>
	{if $i >= $page - $showPageLimit && $i <= $page + $showPageLimit}
	<a n:if='$i === $page' class='active ajax' n:href='Punishments:view $sortPage, $orderPage, $i, $search'>{$i}</a>
	<a n:if='$i !== $page' class='ajax' n:href='Punishments:view $sortPage, $orderPage, $i, $search'>{$i}</a>
	{/if}
	<a n:if='$i === $pagesCount' class='ajax' n:href='Punishments:view $sortPage, $orderPage, $i, $search'>Poslední strana</a>
</div>

Mám tam použito makro n:snippet a u odkazů na jednotlivé stránky mám použitu třídu ajax, protože z návodu jsem si vybral tento script na AJAX pod Nette: https://componette.org/search/?…

Do main.js (můj hlavní soubor s JS) jsem vložil hned na začátek $.nette.init(); takže podle toho, jak jsem to pochopil by se nyní veškeré odkazy z třídou ajax měly posílat pomocí AJAXu, správně?

No a teď narážím na problém, přes který jsem se nedostal, dál je v návodu provedení invalidace, ale k tomu jsem se nedostal neboť

public function actionView($sort = 'time', $order = 'asc', $page = 1, $search = '') {
	dump($this->isAjax());
}

v PunishmentsPresenter mi vždy vypíše FALSE, z čehož jsem usoudil, že asi někde bude chyba. :)

Budu rád za jakoukoliv radu, co dělám špatně, nebo kde by mohl být problém.
Díky, Mysteria.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nu, to se ti takto nevypíše asi nikdy :). Pokud si chceš ověřit, že se ti odkazy odesílají ajaxově, proveď v tom actionView třeba toto:

if ($this->isAjax()) {
	$this->payload->test = TRUE;
	$this->sendPayload();
}

A pak může na panelu Konzole v nějakých prohlížečových web-developer-tools nebo prostě Firebugu sledovat, jestli se po kliknutí na odkaz vytvoří požadavek, v jehož body bude následně pole test s hodnotou TRUE.

Ještě lépe se dá debugovat s Firebugem a doplňkem pro něj zvaným FireLogger. Nette přímo pro něj nabízí metodu Nette\Diagnostics\Debugger::fireLog();.

Etch
Člen | 403
+
0
-

@**Mysteria**:

Minimálně tady:

<thead>
    <tr>
        <th class='active' title='Zobrazuje, zda je či není daný trest aktivní.'>&nbsp;</th>
        <th><a n:href='Punishments:view type, $order, $page, $search'>Typ trestu</a></th>
        <th><a n:href='Punishments:view name, $order, $page, $search'>Přezdívka hráče</a></th>
        <th><a n:href='Punishments:view reason, $order, $page, $search'>Důvod trestu</a></th>
        <th><a n:href='Punishments:view admin, $order, $page, $search'>Přezdívka admina</a></th>
        <th><a n:href='Punishments:view time, $order, $page, $search'>Datum udělení trestu</a></th>
    </tr>
</thead>

třídu „ajax“ nastavenou nemáš. Tedy minimálně při klikání na odkazy v hlavičce tabulky to rozhodně provede neajaxovej požadavek.

Mysteria
Člen | 797
+
0
-

@Etch: Jasný, tam to zatím nemám, zatím jsem to dal jenom ke stránkování a zkouším to tam. :)

@vojtech.dobes: Tak pokud nemám class ajax, tak to odešle 1 GET požadavek, pokud tam je class ajax, tak to ještě k tomu odešle 1 POST požadavek. To vypadá, že by to mohlo být správně, mám pravdu? Jdu zkusit pokračovat v návodu, zatím díky.

EDIT:
Tak jsem ještě mrknul na ten Firelogger a když dám do actionView

Nette\Diagnostics\Debugger::fireLog('neAJAX');
if ($this->isAjax()) {
	Nette\Diagnostics\Debugger::fireLog('AJAX');
    $this->payload->test = true;
    $this->sendPayload();
    $this->invalidateControl('punishments');
}

tak mi to v konzoli vypíše vždy jenom neAJAX i když kliknu na stránkovací odkaz, který by měl být přes AJAX.

Editoval Mysteria (14. 7. 2013 15:16)