DataGrid a ajax
- romansklenar
- Člen | 655
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
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)
- krissott
- Člen | 48
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)
{
}
- David Grudl
- Nette Core | 8218
Přesně tak. Je to odkaz na metodu handlePage($page)
a jako
parametr $page
se předá argument $page + 1
.
- romansklenar
- Člen | 655
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
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}
- romansklenar
- Člen | 655
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
na adrese https://files.nette.org/tutorial.datagrid.part1.zip
až 5 jsem je taky krapet upgradnul.
- romansklenar
- Člen | 655
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
romansklenar napsal(a):
BTW: netrouf by si někdo přepsatnette.js
do jQuery?
Trochu jsem si něco troufnul.
- mates
- Člen | 36
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.
- 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.
- 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
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
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
- Jakub Šulák
- Člen | 222
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
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
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. ;-)