Nový Nette DataGrid pro Bootstrap s možností vypsat strom
- svobodai
- Člen | 136
Jan Dlouhý napsal(a):
Omlouvám se za opakování dotazu, pomohlo to, díky moc.
Řešil jsem docela dlouho, proč se mi snippet nepřekresluje, tak kdyby to nefungovalo ještě někomu, tak tady je můj problém a řešení:
Grid používám v modulu Admin a v ID snippetu je znak : (ID vypadá takto: snippet-nazevKomponenty-Modul:PresenternazevKomponenty) což je pro jQuery ID selector nepřípustné – v metodě updateSnippet tedy selectorem $(‚#‘ + id) nic nenajde. Stačí teda přepsat na $(document.getElementById(id)).
Tak to mně nenapadlo, taky jsem s tím měl problém. Díky.
- mesour
- Nette Blogger | 236
Pro verzi 1.4.3 je možné do composeru dát:
"mesour/datagrid": "1.4.*"
Od 1.4 – 1.4.3 se zatím nezměnilo API a nezměním ho až do 1.4.x. Od 1.5 ho taky nechci měnit, ale bude lepší tam mít jen 1.4.* a ne ~1.4.0
Bude to tak i s dalšími verzemi, až bude 1.5.0, tak se do 1.5.x nebude měnit API, tím pádem bude možné zase použít 1.5.*, jen se bude přidávat funkcionalita nebo deprecated.
Editoval mesour (22. 10. 2014 13:17)
- mesour
- Nette Blogger | 236
svobodai napsal(a):
Ještě dotaz k pageru v gridu mám
$grid->enablePager();
přesto se mi zobrazuje Advanced pager
Záleží na tom, kolik tam máš stránek. Defaultně se od více než 15 stránek zobrazí advanced. Pokud to chceš žměnit, tak první parametr $grid->enablePager(15); je počet stránek při kterých se ještě zobrazí normální.
- mesour
- Nette Blogger | 236
svobodai napsal(a):
mesour napsal(a):
svobodai napsal(a):
Dají se v pageru pojmenovat názvy u tlačítek v češtině.
Lokalizace a další změny (nebo spíš přidání funkcí) budou v další verzi 1.4.4 ;-)
Takže jedině upravit přímo v latte.
No verzi 1.4.4 chci udělat ještě dnes, takže záleží, jak moc to spěchá.
- svobodai
- Člen | 136
Jak mohu napojit spinner na tlačítka filtrovacího formuláře, tj. když kliknu aby se mi zobrazilo nějaké rotační ikona. Tu ikonu mám. přes jQeury se mi vytváří div na který je to kolečko navázaný pro mé akce mám nastaveno zobrazení a skrývání, ale nevím jak to napojit na js akce k tlačítkům.
- tom
- Člen | 171
svobodai napsal(a):
Jak mohu napojit spinner na tlačítka filtrovacího formuláře, tj. když kliknu aby se mi zobrazilo nějaké rotační ikona. Tu ikonu mám. přes jQeury se mi vytváří div na který je to kolečko navázaný pro mé akce mám nastaveno zobrazení a skrývání, ale nevím jak to napojit na js akce k tlačítkům.
Zkusil bych zjistit class těch tlačítek a nastavil ajax tak, aby se na ně chytal. Default je myslím class=„ajax“ ale jestli maji ty tlacitka jiny class tak bych si upravil ten svuj ajax.
- mesour
- Nette Blogger | 236
svobodai napsal(a):
Jak mohu napojit spinner na tlačítka filtrovacího formuláře, tj. když kliknu aby se mi zobrazilo nějaké rotační ikona. Tu ikonu mám. přes jQeury se mi vytváří div na který je to kolečko navázaný pro mé akce mám nastaveno zobrazení a skrývání, ale nevím jak to napojit na js akce k tlačítkům.
Co takhle nastavit zobrazení spinneru na ajaxStart a skrytí na ajaxStop nebo ajaxComplete. Pak by se ti zobrazoval u úplně všech ajaxů a nemusel by jsi nic řešit ;-)
- svobodai
- Člen | 136
mesour napsal(a):
svobodai napsal(a):
Jak mohu napojit spinner na tlačítka filtrovacího formuláře, tj. když kliknu aby se mi zobrazilo nějaké rotační ikona. Tu ikonu mám. přes jQeury se mi vytváří div na který je to kolečko navázaný pro mé akce mám nastaveno zobrazení a skrývání, ale nevím jak to napojit na js akce k tlačítkům.
Co takhle nastavit zobrazení spinneru na ajaxStart a skrytí na ajaxStop nebo ajaxComplete. Pak by se ti zobrazoval u úplně všech ajaxů a nemusel by jsi nic řešit ;-)
Jo tohle byla super rada. Už se mi to točí.
- mesour
- Nette Blogger | 236
svobodai napsal(a):
mesour napsal(a):
svobodai napsal(a):
Jak mohu napojit spinner na tlačítka filtrovacího formuláře, tj. když kliknu aby se mi zobrazilo nějaké rotační ikona. Tu ikonu mám. přes jQeury se mi vytváří div na který je to kolečko navázaný pro mé akce mám nastaveno zobrazení a skrývání, ale nevím jak to napojit na js akce k tlačítkům.
Co takhle nastavit zobrazení spinneru na ajaxStart a skrytí na ajaxStop nebo ajaxComplete. Pak by se ti zobrazoval u úplně všech ajaxů a nemusel by jsi nic řešit ;-)
Jo tohle byla super rada. Už se mi to točí.
Skvělé, jen nezapomenout skrýt spinner i při ajaxError ;-)
- mesour
- Nette Blogger | 236
Přidána nová verze 1.4.4.
Tady je lokalizace od Jazbyho: http://grid.mesour.com/localize/
A taky je nově možné nastavit main parent value: http://grid.mesour.com/tree/
Všechny změny zde: http://grid.mesour.com/versions/#…
- svobodai
- Člen | 136
mesour napsal(a):
Přidána nová verze 1.4.4.
Tady je lokalizace od Jazbyho: http://grid.mesour.com/localize/
A taky je nově možné nastavit main parent value: http://grid.mesour.com/tree/
Všechny změny zde: http://grid.mesour.com/versions/#…
Ten překlad vypadá dobře. Jen jsi zapomněl na tlačítko Go! a placeholder v inputu pro zadání stránky Page v Advanced pageru pro přechod na zadanou stránku.
Editoval svobodai (23. 10. 2014 8:54)
- jazby
- Člen | 44
svobodai napsal(a):
mesour napsal(a):
Přidána nová verze 1.4.4.
Tady je lokalizace od Jazbyho: http://grid.mesour.com/localize/
A taky je nově možné nastavit main parent value: http://grid.mesour.com/tree/
Všechny změny zde: http://grid.mesour.com/versions/#…
Ten překlad vypadá dobře. Jen jsi zapomněl na tlačítko Go! a placeholder v inputu pro zadání stránky Page v Advanced pageru pro přechod na zadanou stránku.
Chybějící lokalizace je přidána.
Změny:
- grid má nově nastavenou class dle aktuálního jazyka (locale-en|cs|..)
- nastaveni lokalizace je možno volat bez .php (případně se doplní samo – zpětná kompatibilita funguje)
Změny jsou ve větvi „dev-master“ (nedělali jsme novou verzi)
- mesour
- Nette Blogger | 236
svobodai napsal(a):
Mám 2 otázky.
- Export do CSV se mi neajaxuje. A akce mi vyhodí warning Cannot modify header information – headers already sent by (output started at D:\xampp\htdocs\intergram\vendor\mesour\datagrid\DataGrid\Extensions\Export.php:131)
- Dá se Button použít i mimo grid?
- Export není ajaxový. Pokud vyhodí takovouto chybu, tak tam máš zřejmě nějakou exception. Když pošleš, co se tam vypisuje, tak se můžu mrknout, čím by to mohlo být.
- Ano button je možné použít i mimo grid, jak je vidět tady: http://grid.mesour.com/…ents/button/. Je nutné mu poslat instanci presenteru a to buď v constructoru nebo přes setPresenter.
- svobodai
- Člen | 136
Tak k tomu exportu
je tam kód
echo file_get_contents($file_name);
unlink($file_name);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . (is_null($this->file_name) ? $this->parent->getGridName() : $this->file_name) . '.csv"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
asi by správně mělo být
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . (is_null($this->file_name) ? $this->parent->getGridName() : $this->file_name) . '.csv"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo file_get_contents($file_name);
unlink($file_name);
protože echo si vytvoří hlavičku a header potom vyhodí hlášku. Když to echo dám až za to vytvoření hlavičky tak to proběhne korektně.
Nemohl by u nastavení exportu být jeden parametr jako oddělovač, funkce fputcsv to umožňuje přijmout.
- jazby
- Člen | 44
svobodai napsal(a):
Tak k tomu exportu
je tam kód
…
protože echo si vytvoří hlavičku a header potom vyhodí hlášku. Když to echo dám až za to vytvoření hlavičky tak to proběhne korektně.
Změnil jsem export aby využíval FileResponse namísto hardcode header
Nemohl by u nastavení exportu být jeden parametr jako oddělovač, funkce fputcsv to umožňuje přijmout.
Možnost přidána.
$grid->enableExport(__DIR__ . '/../../temp/cache', null, array(), ";");
Změny jsou v „dev-master“
- tom
- Člen | 171
Ahoj,
pokud používám komponentu v rámci modulu, tak vzniká chyba, protože
název pomocného souboru v temp/cache obsahuje znak : … Udělal jsem si
u sebe rychlý fix v souboru Export.php
$this->file_path = $this->cache_dir . „/“ . \Nette\Utils\Strings::webalize($this->parent->getGridName()) . time() . „.csv“;
Mrknete na to?
Dík Tom
- mesour
- Nette Blogger | 236
tom napsal(a):
Ahoj,
pokud používám komponentu v rámci modulu, tak vzniká chyba, protože název pomocného souboru v temp/cache obsahuje znak : … Udělal jsem si u sebe rychlý fix v souboru Export.php$this->file_path = $this->cache_dir . „/“ . \Nette\Utils\Strings::webalize($this->parent->getGridName()) . time() . „.csv“;
Mrknete na to?
Dík Tom
Ahoj, je to upravené v dev-master.
- mesour
- Nette Blogger | 236
FJP napsal(a):
Ahoj,
zeptal bych se, jak zapsat ID sloupce, když mám provázané tabulky. Mám tabulky termíny, zákazníci a vazební tabulku termíny_zákazníci (termín_id, zákazník_id, …) … a chtěl bych vypsat všechny zákazníky s ID daného termínu.Díky.
(Snad jsem to nepřehlédl v dokumentaci).
Jestli to správně chápu, tak by se na to dal použít GROUP_CONCAT(…) AS xxx, pak by ID sloupce bylo xxx.
Nebo bych využil sloupec Text s callbackem a v callbacku by byl dotaz do DB, který by vrátil všechny uživatele, ty by se pak prošly a vytvořil by se z nich string. Tahle druhá možnost by umožnila i mít každého uživatele jako odkaz ;-)
- mesour
- Nette Blogger | 236
tom napsal(a):
Můžu poprosit o ukázku kódu použití Permissions pro Button? Díky
Ahoj, normálně jako pro všechno ostatní, stačí nastavit callback, který bude vracet FALSE nebo Nette URL, která přijde v parametru. Vnitřní logiku si samozřejmě změň: http://grid.mesour.com/setting/#…
Editoval mesour (29. 10. 2014 13:03)
- bezsebesam
- Člen | 8
Ahoj,
předně bych chtěl poděkovat za výborný grid a hlavně za rychlost, jakou
se posouvá dopředu. Při zkoušení jsem narazil na pár bodů – dotazů
nebo možná i námětů na rozšíření (doufám, že jsem jen nepřehlédl
v dokumentaci).
- Je možné gridu nastavit vlastní translator? Ten bych pak chtěl využít třeba pro překlad názvů sloupců, abych nemusel psát:
<?php
$grid->column(new Column\Text(array(
Column\Text::ID => 'surname',
Column\Text::TEXT => $this->getTranslator()->translate('surname'),
)));
?>
ale jen:
<?php
$grid->column(new Column\Text(array(
Column\Text::ID => 'surname',
Column\Text::TEXT => 'surname',
)));
?>
„surname“ by se pak samo přeložilo translatorem, který by se gridu předal třeba takto:
<?php
$grid->setTranslator($myTranslator);
?>
- Jako zdroj dat požívám Database\Table. Mám tabulky „book“ a „author“. Chtěl bych vypsat seznam knížek včetně jména autora. Jak jednoduše nadefinuju sloupec se jménem autora? Šlo by tam zadat něco jako „author.name“ a vazba na tabulku „author“ by se provedla sama?
- Vím, že v <th> je class podle ID sloupce a pomocí toho můžu v CSS nastavit šířku. Ale pokud mám v jedné aplikaci více gridů, v každém je třeba sloupec „name“ a pokaždé chci jinou šířku, tak už je trochu nepraktické. Nešlo by přecejenom zadávat šířku sloupců už při jejich definici v gridu? Ideálně nějak poměrově, např. prvnímu a druhému sloupci nastavím šířku na číslo 1 a třetímu na číslo 3. Pak první a druhý sloupec bude mít šířku 20% (1/5) a třetí 60% (3/5).
- Když zapnu filtrování, zobrazí se nad gridem formulář s filtry, což zbytečně zabírá místo. Nešly by tyto filtry integrovat do záhlaví tabulky, podobně jako je to v Kendo UI nebo Sencha ExtJS?
Viz: http://demos.telerik.com/…/column-menu nebo http://dev.sencha.com/…kitchensink/#…
Šlo by ještě přidat tlačítko „Zrušit filtr“?
Díky za odpověď.
- jazby
- Člen | 44
bezsebesam napsal(a):
Ahoj,
předně bych chtěl poděkovat za výborný grid a hlavně za rychlost, jakou se posouvá dopředu. Při zkoušení jsem narazil na pár bodů – dotazů nebo možná i námětů na rozšíření (doufám, že jsem jen nepřehlédl v dokumentaci).
- Je možné gridu nastavit vlastní translator? Ten bych pak chtěl využít třeba pro překlad
Ahoj,
díky za námět, zapracovávám. Zítra by to mohlo být hotové, je na tom
docela dost práce (už jsme na tom strávil skoro půlku dne). Bude to přesně
jak píšeš, tedy
$grid->setTranslator(\Nette\Localization\ITranslator $translator);
a dál by to mělo přeložit vše.
Metoda ->setLocale zůstane pouze pro interní překlady gridu.
Vyhovuje?
- FJP
- Člen | 124
Ahoj,
mám proměnnou $this->termId. Když jí předávám jako parametr v Button
pro smazání daného řádku, tak ok. Ale když její volání požaduju
v callbacku u sloupce:
Column\Text::CALLBACK => function($row) {
return $this->registrationInfo($this->termId, $row['id'])->amountofregistered;
}
dostávám Fatal Error: Using $this when not in object context. Nevíte, čím to může být? Pokud někoho napadá, že registrationInfo je statická funkce, tak není :).
(Na localhostu to funguje, na produkci ne).
Editoval FJP (31. 10. 2014 11:52)
- jazby
- Člen | 44
Do Gridu právě přibyla nová funkcionalita Custom translator
Volání
$grid->setTranslator($myTranslator);
Očekáván interface \Nette\Localization\ITranslator.
Přeloženy budou následně veškeré textové názvy sloupců, buttonů, title u statusů, akce u selection atp. Snad bude k prospěchu.
Změna je v „dev-master“.
Editoval jazby (31. 10. 2014 12:24)
- FJP
- Člen | 124
jazby napsal(a):
@FJP
A máš na obou (localhost i server) PHP >= 5.4 ?
$this v anonymních funkcích je až od 5.4(Schválně jsem to ted zkoušel v gridu zavolat stejně a normálně mi to funguje.
Díky, bude to tím. Je v php 5.3 (produkce) nějaké řešení, jak tam natáhnout proměnnou (i tu funkci registrationInfo – funkce slouží k dotazu na db)?
- jazby
- Člen | 44
FJP napsal(a):
jazby napsal(a):
@FJP
A máš na obou (localhost i server) PHP >= 5.4 ?
$this v anonymních funkcích je až od 5.4(Schválně jsem to ted zkoušel v gridu zavolat stejně a normálně mi to funguje.
Díky, bude to tím. Je v php 5.3 (produkce) nějaké řešení, jak tam natáhnout proměnnou (i tu funkci registrationInfo – funkce slouží k dotazu na db)?
Zkusím z hlavy
$that = $this;
Column\Text::CALLBACK => function($row) use ($that) {
return $that->registrationInfo($that->termId, $row['id'])->amountofregistered;
}
Netestoval jsem …
- FJP
- Člen | 124
jazby napsal(a):
FJP napsal(a):
jazby napsal(a):
@FJP
A máš na obou (localhost i server) PHP >= 5.4 ?
$this v anonymních funkcích je až od 5.4(Schválně jsem to ted zkoušel v gridu zavolat stejně a normálně mi to funguje.
Díky, bude to tím. Je v php 5.3 (produkce) nějaké řešení, jak tam natáhnout proměnnou (i tu funkci registrationInfo – funkce slouží k dotazu na db)?
Zkusím z hlavy
$that = $this; Column\Text::CALLBACK => function($row) use ($that) { return $that->registrationInfo($that->termId, $row['id'])->amountofregistered; }
Netestoval jsem …
Zkoušel jsem:
$that = $this; // bez tohoto řádku to nešlo ani na 5.4
$grid->column(new Column\Text(array(
Column\Text::ID => 'region',
Column\Text::TEXT => 'Region',
Column\Text::ORDERING => FALSE,
Column\Text::CALLBACK => function($row) use ($that) {
return $that->registrationInfo($that->termId, $row['id'])->amountofregistered;
}
)));
Na php 5.4 jde, na 5.3.3 ne
- jazby
- Člen | 44
@FJP
FJP napsal(a):
Na php 5.4 jde, na 5.3.3 ne
Pro 5.4
Column\Text::CALLBACK => function($row) {
return $this->registrationInfo($this->termId, $row['id'])->amountofregistered;
}
Pro 5.3
$that = $this;
Column\Text::CALLBACK => function($row) use ($that) {
return $that->registrationInfo($that->termId, $row['id'])->amountofregistered;
}
Schválně jsem to pod 5.3 otestoval a funguje.
Jakou přesně dostáváš na 5.3 chybu ?
EDIT
Zapoměl jsem dodat, že v 5.3 přiřazním $that = $this měníš
viditelnost, takže pokud máš $this->termId jako private nebo protected,
nepůjde přečíst.
Změnou je bud $that->termId nstavit jako public, nebo takto:
Verze 2 pro 5.3
$that = $this;
$termId = $this->termId;
Column\Text::CALLBACK => function($row) use ($that, $termId) {
return $that->registrationInfo($termId, $row['id'])->amountofregistered;
}
Editoval jazby (31. 10. 2014 14:37)
- svobodai
- Člen | 136
Nevím kde je problém, ale když si tam dám dumpy tak se nedostanu za NetteDbDataSource
$selection = $this->getSelectData();
$source = new NetteDbDataSource($selection);
dump($source);
V getSelectData je získání prvního přiblížení dat je tam jen základní omezení, další se uplatňují podle filtru a v případě, že není tak se omezí jen na aktuální rok.
Při tom zpracování NetteDbDataSource dojde k chybě, že dojdou prostředky serveru a to na něm jsem sám. a na ten dump za ní už se nedostanu.
- jazby
- Člen | 44
svobodai napsal(a):
Při tom zpracování NetteDbDataSource dojde k chybě, že dojdou prostředky serveru a to na něm jsem sám. a na ten dump za ní už se nedostanu.
Koukal jsem na to a je to tím že NetteDbDatasource není na takovéhle množství dat stavěný. O výkonnostním limitu víme a bude to třeba přepsat. Teď jedině tam posílat méně dat, nebo přidat pamět pro PHP …
Editoval jazby (1. 11. 2014 11:30)
- mesour
- Nette Blogger | 236
jazby napsal(a):
svobodai napsal(a):
Při tom zpracování NetteDbDataSource dojde k chybě, že dojdou prostředky serveru a to na něm jsem sám. a na ten dump za ní už se nedostanu.Koukal jsem na to a je to tím že NetteDbDatasource není na takovéhle množství dat stavěný. O výkonnostním limitu víme a bude to třeba přepsat. Teď jedině tam posílat méně dat, nebo přidat pamět pro PHP …
Ano zkoušel jsem to na tabulce s 40k řádky a script zebere 114MB paměti. Jak psal Jazby víme o tom a DataSourcy budeme optimalizovat. Mělo by se na to dostat během tohoto víkendu.
- svobodai
- Člen | 136
@jazby @mesour tak to jste mne nepotěšily, bohužel prvotní
select limituje data velmi omezeně Na max. 200 000 záznamů pak se uplatní
ještě další filtry jako rok apod., případně další podle filtru, ale
u některých podmínek je výsledný select právě okolo těch
20 000 záznamů. Vzhledem k tomu, že tabulka má v současné chvíli
5,5 mil. záznamů je to dobré.
Nevím, možná se při tom přepisu zamyslete jestli by ten callback nebyl
lepší. Do té callback funkce by se mohli uplatňovat filtry a řazení a
každý už by si v tom callbacku ošetřil dotaz jak potřebuje, nemuseli by
jste vymýšlet drivery pro jednotlivé typy dat.
Jinak je to výborný datagrid vyzkoušel jsem už 3 jiné, ale tenhle mi
vyhovuje z důvodu filtrace přes externí formulář.
- mesour
- Nette Blogger | 236
svobodai napsal(a):
Nevím kde je problém, ale když si tam dám dumpy tak se nedostanu za NetteDbDataSource
$selection = $this->getSelectData(); $source = new NetteDbDataSource($selection); dump($source);
Problém byl v constructoru NetteDbDataSource s metodou $selection->count(), vysvětlené níže.
Jinak $source bych nedumpoval, obsahuje v property $selection. To znamená nedumpovat $selection nebo to selže na paměti. Viz vysvětlení dole s ActiveRow.
svobodai napsal(a):
@jazby @mesour tak to jste mne nepotěšily, bohužel prvotní select limituje data velmi omezeně Na max. 200 000 záznamů pak se uplatní ještě další filtry jako rok apod., případně další podle filtru, ale u některých podmínek je výsledný select právě okolo těch 20 000 záznamů. Vzhledem k tomu, že tabulka má v současné chvíli 5,5 mil. záznamů je to dobré.
Jinak je to výborný datagrid vyzkoušel jsem už 3 jiné, ale tenhle mi vyhovuje z důvodu filtrace přes externí formulář.
Hlavní problém je v Nette Table Selection a to že si ukládá každý řádek jako instanci ActiveRow, tím pádem bych raději preferoval Dibi při tolika záznamech.
V constructoru NetteDbDataSource bylo $selection->count() a to bylo hrozně náročné na paměť, takže jsem to změnil na ->count(‚*‘) a to už jede s řádově menší náročností. Trochu jsem ještě poupravil střeva toho source, takže už by to mělo být OK. Zkoušel jsem to na tabulce s 2.7 mil. záznamy.
Pro info pro tabulky s tolika daty zatím nedoporučuji používat default filtr. Ten bude mít v budoucnu omezení a pokud bude více než určitý počet unikátních záznamů, tak se nebudou zobrazovat checkboxy.
Editoval mesour (2. 11. 2014 14:20)
- mesour
- Nette Blogger | 236
svobodai napsal(a):
Nevím, možná se při tom přepisu zamyslete jestli by ten callback nebyl lepší. Do té callback funkce by se mohli uplatňovat filtry a řazení a každý už by si v tom callbacku ošetřil dotaz jak potřebuje, nemuseli by jste vymýšlet drivery pro jednotlivé typy dat.
Přesně nechápu co myslíš tím callbeckem, můžeš mi to nějak přiblížit? Také netuším o jakých driverech je řeč.
- svobodai
- Člen | 136
mesour napsal(a):
svobodai napsal(a):
Nevím, možná se při tom přepisu zamyslete jestli by ten callback nebyl lepší. Do té callback funkce by se mohli uplatňovat filtry a řazení a každý už by si v tom callbacku ošetřil dotaz jak potřebuje, nemuseli by jste vymýšlet drivery pro jednotlivé typy dat.
Přesně nechápu co myslíš tím callbeckem, můžeš mi to nějak přiblížit? Také netuším o jakých driverech je řeč.
Callbackem, myslím toto
$grid->setDatasourceCallback(function($filter_values, $order) {
// get the data
return $data;
});
Kde získávání dat můžeš řešit v té anonýymní funkci, nebo místo ní voláš funkci, kterou máš definovanou v presenteru.
$grid->setDatasourceCallback($this->getDataSource);
public function getDataSource($filter, $order, Paginator $paginator = NULL)
{
$selection = $this->prepareDataSource($filter, $order);
if ($paginator) {
$selection->limit($paginator->getItemsPerPage(), $paginator->getOffset());
}
return $selection;
}
V té funkci si to jen uložíš do proměnné typované ¨
/** @var callback */
a při získávání dat k té funkci akorát přiřadíš argumenty a zavoláš ji. Akorát se musí zajistit setování počtu záznamů v paginatoru.
use Nette\Utils\Callback;
$this->data = Callback::invokeArgs($this->dataSourceCallback, array(
$this->filterDataSource,
array($this->orderColumn, strtoupper($this->orderType)),
$this->paginator,
));
Názvy class jsem nadhodil jen pro orintaci.
Drivery jsem myslel ty funkce pro ty jednotlivé datasourcy, asi jsem to špatně pojmenoval.
Editoval svobodai (2. 11. 2014 17:27)
- svobodai
- Člen | 136
mesour napsal(a):
svobodai napsal(a):
Nevím kde je problém, ale když si tam dám dumpy tak se nedostanu za NetteDbDataSource
$selection = $this->getSelectData(); $source = new NetteDbDataSource($selection); dump($source);
Problém byl v constructoru NetteDbDataSource s metodou $selection->count(), vysvětlené níže.
Jinak $source bych nedumpoval, obsahuje v property $selection. To znamená nedumpovat $selection nebo to selže na paměti. Viz vysvětlení dole s ActiveRow.
svobodai napsal(a):
@jazby @mesour tak to jste mne nepotěšily, bohužel prvotní select limituje data velmi omezeně Na max. 200 000 záznamů pak se uplatní ještě další filtry jako rok apod., případně další podle filtru, ale u některých podmínek je výsledný select právě okolo těch 20 000 záznamů. Vzhledem k tomu, že tabulka má v současné chvíli 5,5 mil. záznamů je to dobré.
Jinak je to výborný datagrid vyzkoušel jsem už 3 jiné, ale tenhle mi vyhovuje z důvodu filtrace přes externí formulář.Hlavní problém je v Nette Table Selection a to že si ukládá každý řádek jako instanci ActiveRow, tím pádem bych raději preferoval Dibi při tolika záznamech.
V constructoru NetteDbDataSource bylo $selection->count() a to bylo hrozně náročné na paměť, takže jsem to změnil na ->count(‚*‘) a to už jede s řádově menší náročností. Trochu jsem ještě poupravil střeva toho source, takže už by to mělo být OK. Zkoušel jsem to na tabulce s 2.7 mil. záznamy.
Pro info pro tabulky s tolika daty zatím nedoporučuji používat default filtr. Ten bude mít v budoucnu omezení a pokud bude více než určitý počet unikátních záznamů, tak se nebudou zobrazovat checkboxy.
Díky ten count hodně pomohl.
doplněno 3.11.2014
Ještě jsem zjistil, že při změně řazení nebo při změně stránky dojde
ke stejné chybě jako předtím.
Prozatím jsem přidal paměť takže to funguje, ale pokud mi přibudou data za
rok 2014 tak si nejsem jist.
Editoval svobodai (3. 11. 2014 12:13)