DataGrid a ajax

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

Chci napsat pokračování quick startu – napojení DataGridu na ajax. Můžete stahovat zde.

Ještě než to půjde ale do dokumentace, chtěl bych vyřešit jeden zajímavý problémek (nejspíše moji chybu), který jsem objevil. Když se poprvé vykreslí grid z tabulky, stránka 1, mám query string například takový

?table=OrderDetails&presenter=Table

po prvním kliknutí na Next >> na 2. stránku se provede první ajaxový požadavek na adresu

?tc-page=2&table=OrderDetails&do=tc-page&presenter=Table&-r=0.45383417013537886

další odeslání požadavku na 3. stránku už odešle

?tc-page=3&table=OrderDetails&do=tc-page&presenter=Table&tc-page=2&-r=0.8029049226318621

kde se 2× vyskytuje tc-page a ten blíže konci přepíše ten správný na začátku, takže se znovu zobrazí 2. stránka a odsuď už není cesty jinam protože se situace pořád opakuje.

Úplně stejně funguje řazení záznamů na gridu, ale zde je pořadí parametrů správné (nalevo je původní požadavek, napravo nový).

Jde nějak toto chování potlačit? Nechápu totiž proč u vykreslování gridu to probíhá v pořádku ale u stránkování ne.

Šablona paginatoru je klasická z DG4 akorát s přidaným onclick.

<a href="{link page, $paginator->page + 1}" {if $useAjax} onclick="{$control->ajaxLink(NULL)}"{/if}>Next »</a>

Celé chování si můžete vyzkoušet stáhnutím archívu nahoře.

krajaac
Člen | 45
+
0
-

Hlásím stejný problém. Šotek se projevuje i u mě.

krajaac
Člen | 45
+
0
-

Ještě doplnění:

Odkazy tj. href=„odkaz“ se generujou správně, ale požadavek POST se už vygeneruje špatně (odkazy v paginatoru, při zobrazení 2. stránky):

  • odkaz: http://.../document_root/?tc-page=3&table=Customers&do=tc-page&presenter=Table
  • POST v konzoli firegubu: http://.../document_root/?tc-page=3&table=Customers&do=tc-page&presenter=Table&tc-page=2&-r=0.5848...

Editoval krajaac (7. 1. 2009 11:00)

Ondrej
Člen | 110
+
0
-

problem vznika v nette.js, kde se stav objektu znovu prida do url.

<script>
		if (typeof(this.state) === 'object') {
			// zde se prida na konec url aktualni stav strany
			// zakomentovanim priklad funguje
			action += this.buildQuery(this.state, '', '');
		}
</script>
romansklenar
Člen | 655
+
0
-

Díky! Hledat chybu mimo Nette mě nenapadlo :(

Jod
Člen | 701
+
0
-

Vidíš, ja som si spravil pred pár mesiacmi tiež ajaxový grid, ale nikdy som tam nemal toľko záznamov, že by to bolo na viac strán :D

Mas3r
Člen | 116
+
0
-

Já jsem udělal komponentu Catalog do Eshopu a takový problém nenastal.

sairon
Člen | 32
+
0
-

Řešením je tedy odstranění toho úseku kódu, který uvádí Ondrej? Bez něj totiž funguje i Fifteen, proto by mě zajímalo, za jakým účelem tam tahle část kódu je. Teď se mi nějak nedaří zapojit mozek, abych zkoumal souvislosti :)

krissott
Člen | 48
+
0
-

Mám menší dotaz ohledně datagridu.

Odkaz na dalsi stranku vypada takto:

<a href=„{link page, $paginator->page + 1}“ {if $useAjax} onclick=„{$control->ajaxLink(NULL)}“{/if}>Next»</a>

Jak je mozne ze i kdyz handler page je prazdny tak to i tak funguje.
Resp. jak je mozne ze v $this->page je uz spravna hodnota.Kde se ta hodnota prepisuje? Nevidim to.

public function handlePage($page)
{

}

Jod
Člen | 701
+
0
-

Asi je premenná persistentná

krissott
Člen | 48
+
0
-

Promenna je persistentni, ale jakto ze tam je vzdy po kliknuti inkrementovana hodnota?

To ji tenhle odkaz zvetsi o jedno?
link page, $paginator->page + 1

David Grudl
Nette Core | 8218
+
0
-

Přesně tak. Je to odkaz na metodu handlePage($page) a jako parametr $page se předá argument $page + 1.

krissott
Člen | 48
+
0
-

Ja vim ze to je odkaz na metodu handlePage($page), ale ta metoda je ve zdrojaku naprosto prazdna (nebo muze byt prazdna) a i tak to fungiruje. A ja se ptam proc. Nevidim to :(

romansklenar
Člen | 655
+
0
-

Je předán persistentním parametrem a nastavení přímo paginatoru v bindDataTable():

public function bindDataTable(DibiConnection $db, $table)
{
	$this->db = $db;
	...

	$this->paginator->page = $this->page;
}

Editoval romansklenar (13. 1. 2009 14:48)

David Grudl
Nette Core | 8218
+
0
-

Je to tím, že je tu jeden balík parametrů. To znamená, že paramter $page oné metody je tentýž page, jako persistentní $this->page. Proto když zavolám {link page $value + 1}, využívám této vlastnosti (a máš recht že dost magicky) a nastavím hodnotu do persistetního parametru. Srozumitelnější by možná bylo {link this, 'page' => $value + 1}

krissott
Člen | 48
+
0
-

JJ „už“ chápu. Dikes Davide ;)

romansklenar
Člen | 655
+
0
-

Aktuální verze ajaxového Datagridu k současné revizi Nette (r207) opět zde. Aby ten tutoriál ale taky něco nového přines, po inspiraci si zaslouží ještě nějakou feature, třeba ajaxové skrývání sloupců nebo ajaxové filtrační pole s nápovědou jako to má facebook ke každému sloupci, uvidíme ;)

Každopádně pomoc nějakého javascriptéra vítána.

BTW: netrouf by si někdo přepsat nette.js do jQuery?

David Grudl
Nette Core | 8218
+
0
-

na adrese https://files.nette.org/tutorial.datagrid.part1.zip až 5 jsem je taky krapet upgradnul.

romansklenar
Člen | 655
+
0
-

Koukám, že jsi o zase o něco popředu :) V DataGrid.php je na řádku 53 zapomenutý jeden fireLog.

Honza Marek
Člen | 1664
+
0
-

romansklenar napsal(a):
BTW: netrouf by si někdo přepsat nette.js do jQuery?

Trochu jsem si něco troufnul.

phx
Člen | 651
+
0
-

Bylo by fajn kdyby to bylo i online na webu. Dost by to asi nadchlo lidi co vidi nette poprve. Zvlaste kdyz by videli ze tam toho kodu je naproste minimum:)

David Grudl
Nette Core | 8218
+
0
-
mates
Člen | 36
+
0
-

Hraju si dal s komponentou DATAGRIDu a chci zavest sloupec s CHECKBOXy pro moznost oznaceni radku nad kterymi nasledne bude mozne provadet hromadne operace. Zvazuji kterou cestu zvolit.

  1. CHECKBOXy se budou v komponente pridavat do NFormu. V ID INPUTu pak bude muset byt i ID z DB, tak abych pri odchytnuti signalu byl schopen rozpoznat ktere ID z DB jsou zaskrtnute a mohl nad nimi provest pozadovanou operaci.
  2. CHECKBOXy nebudou soucasti NFormu. Budou se renderovat v sablone jako samostatne INPUTy a pred pozadovanym submitem se pomoci JS funkce posbiraji ID zaskrtnutych inputu a predaji se do HIDDEN NFormu. Po zachyceni signalu budu mit k dispozici seznam ID nad kterymi provedu pozadovanou operaci.

Co vam prijde lepsi, vyhodnejsi?

phx
Člen | 651
+
0
-

1. nebo 3.

Osobne bych nedelal reseni zavisle POUZE na JS.

3. Checkboxy nebudou soucasti NFormu. Budou se renderovat v sablone jako samostatne INPUTy. Cely DataGrig bude ve formulari, ktery se take bude renderova v sablone, s tlacitkem „Akce pro zaskrtnute zaznamy“. V PHP ziskam po staru pole ID z Requestu.

mates
Člen | 36
+
0
-

phx napsal(a):

1. nebo 3.

Osobne bych nedelal reseni zavisle POUZE na JS.

Ok a je jeste neco jineho proti reseni ad.2. Jelikoz pokud se bavime o ajaxu, jQuery a vychytavkach zde popisovanych, bez JS se neobejdu. Samozrejme cim mene JS tim asi lepe.

phx
Člen | 651
+
0
-

Jasny, to chapu, ale pokdu je rec o DataGridu z QuickTutorialu, ktery dokaze plne behat bez JS tak by byla skoda o tuto nezavislos prijit.

mates
Člen | 36
+
0
-

Tak pokud jde o jechoduchost tak je asi nejlepsi 3. a jeste takovym zpusobem o kterem jsem nevedel ze funguje. Kdyz bude form vypadat takto:

<form action="test.php?action=datagrid" method="post">
  <input type="checkbox" name="c1[10]">
  <input type="checkbox" name="c1[11]">
  <input type="checkbox" name="c1[12]">
  <input type="checkbox" name="c1[13]">
  <input type="submit" name="odeslat">
</form>

bude vypis z postu pri zatrzeni prvniho a tretiho checkboxu

debug::dump($_POST);

vypadat takto:

array(2) {
  "c1" => array(1) {
    10 => string(2) "on"
    12 => string(2) "on"
  }
  "odeslat" => string(13) "Odeslat dotaz"
}

coz je pro mne super novinka, a do quick gridu by to bylo asi uplne idealni

Jod
Člen | 701
+
0
-

Ja to mám nejak tak, ale GridControl mám portovaný na CakePhp :D

Jakub Šulák
Člen | 222
+
0
-

Jen se zeptám, jak daleko jsi s přípravou té stránky dokumentace? Už se na ni těším, ajax přes nette ještě nepoužívám a jsem líný to luštit po fórech…:-)

romansklenar
Člen | 655
+
0
-

Na to jsem úplně zapomněl… ale těch změn není moc (proto se všude píše, že z aplikace uděláš ajaxovou změnou pár řádků kódu), hoď si diff na předchozí a současnou verzi z tutoriálu a uvidíš. Navíc mě nenapadá co tam psát, protože vše již bylo řečeno jinde, takže asi nedám dokupy víc jak dva, tři odstavce bez toho aniž bych to opakoval.

vitty
Člen | 1
+
0
-

zdravim,

u posledni verze DataGridu s AJAXem zlobi spoluprace komponent tabulky a razeni.
bez AJAXu funguje vse jak ma ale s AJAXem, kdyz si nastavim nejake razeni a prejdu na dalsi stranku, tak se mi razeni vynuluje.
pokud provedu nejake razeni bez js a pak ho zapnu a prejdu na dalsi stranku, tak razeni zustane jak ma. po dalsi zmene razeni a prechodu na dalsi stranku se mi razeni vrati zpet na puvodni.

mohl by na to nekdo mrknout? opravil bych to sam ale jsem zatim ve fazi uceni. ;-)

norbe
Backer | 405
+
0
-

Měl jsem stejný problém, více zde: https://forum.nette.org/…atagrid-ajax