Nový Nette DataGrid pro Bootstrap s možností vypsat strom

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

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.

svobodai
Člen | 136
+
0
-

Dají se v pageru pojmenovat názvy u tlačítek v češtině.

mesour
Nette Blogger | 236
+
0
-

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 ;-)

mesour
Nette Blogger | 236
+
0
-

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)

svobodai
Člen | 136
+
0
-

Ještě dotaz k pageru v gridu mám

$grid->enablePager();

přesto se mi zobrazuje Advanced pager

svobodai
Člen | 136
+
0
-

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.

mesour
Nette Blogger | 236
+
0
-

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

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

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

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

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

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

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 ;-)

svobodai
Člen | 136
+
0
-

Ještě jedna věc. Řekl bych, že řazení není voláno přes grid.js?

mesour
Nette Blogger | 236
+
0
-

svobodai napsal(a):

Ještě jedna věc. Řekl bych, že řazení není voláno přes grid.js?

Ne, to jde přes classu ajax.

mesour
Nette Blogger | 236
+
0
-

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

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

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

V dev-master je také fixnutý StatusColumn.

  • Nyní má na <td>/<li> classu status-buttons místo right-buttons
  • Classa no-active-button se na <td>/<li> zobrazuje jen když skutečně nejsou žádné aktivní buttony
svobodai
Člen | 136
+
0
-

Mám 2 otázky.

  1. 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)
  2. Dá se Button použít i mimo grid?
mesour
Nette Blogger | 236
+
0
-

svobodai napsal(a):

Mám 2 otázky.

  1. 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)
  2. Dá se Button použít i mimo grid?
  1. 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.
  2. 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
+
0
-

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

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

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

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.

FJP
Člen | 124
+
0
-

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).

mesour
Nette Blogger | 236
+
+1
-

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 ;-)

tom
Člen | 171
+
0
-

Můžu poprosit o ukázku kódu použití Permissions pro Button? Díky

mesour
Nette Blogger | 236
+
0
-

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

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).

  1. 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);
?>
  1. 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?
  1. 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).
  1. 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ěď.

FJP
Člen | 124
+
0
-

Ahoj,
při přechodu na 1.4.4 error:

Declaration of DataGrid\Extensions\BaseControl::createTemplate() should be compatible with Nette\Application\UI\Control::createTemplate($class = NULL)

jak se tomu můžu vyhnout?

jazby
Člen | 44
+
0
-

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).

  1. 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?

Xethilos
Člen | 19
+
+1
-

@FJP

	protected function createTemplate($class = NULL)
{
    $template = parent::createTemplate($class);
    $template->setTranslator( $this->parent["translator"] );
    return $template;
}
FJP
Člen | 124
+
0
-

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

@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.

jazby
Člen | 44
+
+1
-

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

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

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

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

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

mám problém s datagridem, když mi má vyselectovat 20000 záznamů. nešloby to načítání dat dělat přes callback?

mesour
Nette Blogger | 236
+
0
-

svobodai napsal(a):

mám problém s datagridem, když mi má vyselectovat 20000 záznamů. nešloby to načítání dat dělat přes callback?

Nechápu tvůj dotaz, jak to myslíš? Nebo takhle, v čem je problém?

svobodai
Člen | 136
+
0
-

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

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

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

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

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

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

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

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)