Sortování tabulky pomocí ajaxu
- lukendo
- Člen | 96
Zdravím. mám tabulku kterou chci nechat uživatele zobrazit dle jeho
požadavků (setřízenou dle určitého sloupce) a chci to řešit ajaxově.
Tudíž mám v latte snippet (musí být i na to tbody
?? pokud
ano, tak proč):
{snippet reportsTable}
<tbody>
{foreach $reports as $report} ... {/foreach}
</tbody>
{/snippet}
public function handleSortByDate()
{
$this->template->reports = $this->reportModel->getTable()->order('created');
$this->redrawControl('reportsTable');
}
Dělal jsem to podle dokumentace a chápu že by to takhle mělo asi stačit (+ možná ten snippet v tbody) nicméně hází mi to chybu že chybí ten template sortByDate. Děkuji za radu.
- Jan Mikeš
- Člen | 771
S nejvyšší pravděpodobností budeš muset obalit celý tag
<table>
do snippetu.
Template na sort by date, jak generuješ odkaz? Měl by vypadat takto:
<a n:href="sortByDate!"> <!-- Vykříčník je důležitý, neodkazuješ na view ale na signál -->
Pokud si hraješ s ajaxem, doporučuji postup kdy veškerou funkčnost odladíš nejdříve bez ajaxu a ajax přidáš až úplně nakonec.
Editoval Lexi (8. 9. 2016 20:52)
- lukendo
- Člen | 96
Teď jsem si všiml, že v laděnce ve queries není ten dotaz pro ten signál. Nette 2.4 nette.ajax.js 2.0.0 volám tu init funkci (to stačí že?)
public function renderDefault()
{
$this->template->reports = $this->reportModel->getTable();
}
public function handleSortByDate()
{
$this->template->reports = $this->reportModel->getTable()->order('title');
$this->redrawControl('reportsTable');
}
{snippet reportsTable}
<table class="ui fixed single line celled table" id="reportsTable">
<thead>
<tr>
<th>Datum vložení <a n:href="sortByDate!">setřidit</a></th>
</tr>
</thead>
<tbody>
{foreach $reports as $report}
<tr onclick="document.location = 'detail/{$report->id}';" onmouseover="" style="cursor: pointer;">
<td>{$report->created|date:'j.n.Y'}</td>
</tr>
{/foreach}
</tbody>
</table>
{/snippet}
- Jan Mikeš
- Člen | 771
Jasně už to vidím :-) renderDefault()
se volá v životním
cyklu presenteru později než handle metody signálů: https://doc.nette.org/…n/presenters#…
Takže to co se děje tobě, je, že si v šabloně naplníš proměnnou
$reports
z handle metody, ale následně ti jí
renderDefault()
přepíše. Řešení je více, nejrychlejší a
nejjednodušší je plnit původní data dříve, tedy přepsat
renderDefault()
na actionDefault()
Dalším řešením může být upravit render metodu takto:
public function renderDefault()
{
if (!isset($this->template->reports)) {
$this->template->reports = $this->reportModel->getTable();
}
}
Editoval Lexi (8. 9. 2016 22:02)