První setkání s AJAXem, nedaří se rozchodit
- Mysteria
- Člen | 797
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í.'> </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
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
@**Mysteria**:
Minimálně tady:
<thead>
<tr>
<th class='active' title='Zobrazuje, zda je či není daný trest aktivní.'> </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
@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)