Sortování tabulky pomocí ajaxu

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

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

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

Lexi napsal(a):

Ano, skutečně přidávám ajax až nakonec. Snippet obaluje celou tabulku, odkaz taky správně zapsaný, chybu v latte to nevyhazuje, ale signál se nevykoná.

Jan Mikeš
Člen | 771
+
0
-

V logu je něco? Co console a response po ajax požadavku v ní? Odešle se request? Jde request na správnou adresu? Pokud zkopíruješ URL ajax requestu a dáš ho ručně do URL funguje? Pošli sem případně přesné znění chyby co hlásí Tracy.

lukendo
Člen | 96
+
0
-

Tracy mi právě nevyhodí nic, tudíž nevím kde a jak hledat chybu, jinak ten signál se vykoná, dumpuju si tam proměnou, takže to vázne někde na tom vykreslování nejspíš

Jan Mikeš
Člen | 771
+
0
-

Zkus prosím poslat více kódu. Odkaz, celou tabulku, pokud je více kódu v presenteru (ostatní metody které by mohly ovlivnit chování). Verzi nette, verzi nette.ajax.js. Cokoliv co by mohlo pomoci odhalit chybu.

lukendo
Člen | 96
+
0
-

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

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)

lukendo
Člen | 96
+
0
-

děkuji, pomohlo to :)