ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Sami_
- Člen | 15
Pavel Janda napsal(a):
Tak to možná zkuste uložit do session, to by mělo být celkem rychlé/snadné řešení.
Stále to samé. Data se načtou na 1 stranu Gridu a jakmile stranu přepnu, všechno zmizí.
Presenter
public function handleTest($data)
{
$session = $this->getSession(__CLASS__);
$session->objectsForTable = $this->myService->getObjectsFromData($data);
$this['importGrid']->setDataSource($session->objectsForTable);
$this['importGrid']->reload();
}
protected function createComponentImportGrid()
{
$g = new DataGrid();
$g->setDataSource($this->getSession(__CLASS__)->objectsForTrade); // inicializováno na []
$g->addColumnDateTime('timeOpen', 'Čas otevření');
return $g;
}
Nevím, jestli chyba není někde jinde, ale vůbec mě nenapadá kde
Editoval Sami_ (10. 3. 2021 22:46)
- Kamil Valenta
- Člen | 815
Když odstránkuješ, nevykoná se handleTest(), ale jen createComponentImportGrid() a v něm máš
$g->setDataSource([]);
takže je jasné, že se grid vyprázdní.
Dej si tam:
$g = new DataGrid();
$session = $this->getSession(__CLASS__);
$g->setDataSource($session->objectsForTable);
- Kamil Valenta
- Člen | 815
Aha, ten příspěvek se změnil. Takže teď:
public function handleTest($data)
{
$session = $this->getSession(__CLASS__);
$session->objectsForTable = $this->myService->getObjectsFromData($data);
//$this['importGrid']->setDataSource($session->objectsForTable);
$this['importGrid']->reload();
}
protected function createComponentImportGrid()
{
$g = new DataGrid();
$g->setDataSource($this->getSession(__CLASS__)->objectsForTable); // inicializováno na []
$g->addColumnDateTime('timeOpen', 'Čas otevření');
return $g;
}
Pozor, jednou v session pracuješ s objectsForTable, ale pak saháš na objectsForTrade.
- Sami_
- Člen | 15
Kamil Valenta napsal(a):
Když odstránkuješ, nevykoná se handleTest(), ale jen createComponentImportGrid() a v něm máš
$g->setDataSource([]);
takže je jasné, že se grid vyprázdní.
Dej si tam:$g = new DataGrid(); $session = $this->getSession(__CLASS__); $g->setDataSource($session->objectsForTable);
Mezitím mi to došlo a akorát jsem to šel opravit tady, už mi to jede! Moc dík za tvoji trpělivost!
- jAkErCZ
- Člen | 322
Zdravím,
narazil jsem na divné chování při funkci addFilterSelect . Mám
addColumnStatus ve kterém si vypisuji statusy.
"ublaboo/datagrid": "^6.6" - v6.8.1
$grid->addColumnStatus('status', 'Status')->setAlign('center')
->addOption('10', 'Založeno')
->setClass('btn-primary')
->endOption()
->addOption('20', 'Nabídka odeslána')
->setClass('btn-warning')
->endOption()
->addOption('25', 'Email: 9 věcí čeká')
->setClass('btn-secondary')
->endOption()
->addOption('30', 'Email: 9 věcí odesláno')
->setClass('btn-warning')
->endOption()
->addOption('35', 'Email: Jak si stojíme čeká')
->setClass('btn-secondary')
->endOption()
->addOption('40', 'Email: Jak si stojíme odesláno')
->setClass('btn-warning')
->endOption()
->addOption('50', 'Volání před zaměřením')
->setClass('btn-primary')
->endOption()
->addOption('60', 'Zaměření domluveno')
->setClass('btn-focus')
->endOption()
->addOption('70', 'Návrh SOD po zam. odeslán')
->setClass('btn-primary')
->endOption()
->addOption('80', 'Volání po zaměření')
->setClass('btn-primary')
->endOption()
->addOption('100', 'Smlouva')
->setClass('btn-success')
->endOption()
->addOption('101', 'Smlouva: Záloha uhrazena')
->setClass('btn-contract-success')
->endOption()
->addOption('102', 'Smlouva: Záloha neuhrazena')
->setClass('btn-contract-nosuccess')
->endOption()
->addOption('103', 'Zakázka ve výrobě')
->setClass('btn-primary')
->endOption()
->addOption('104', 'Zakázka skladem (BRN)')
->setClass('btn-primary')
->endOption()
->addOption('105', 'Zakázka skladem (TCE)')
->setClass('btn-primary')
->endOption()
->addOption('110', 'Zakázka dokončena')
->setClass('btn-success')
->endOption()
->addOption('duplicity', 'Duplicitní nabídka')
->setClass('btn-danger')
->endOption()
->addOption('postoped', 'Nabídka odložena')
->setClass('btn-primary')
->endOption()
->addOption('cancel', 'Nezobchodováno')
->setClass('btn-danger')
->endOption()
->onChange[] = [$this, 'changeStatus'];
A potom klasicky
$grid->addFilterSelect('status', 'Status:', ['' => 'Všichny statusy', 'Statusy' => $this->projectRepository->getOrderStates()])->setAttribute('class', 'select2');
A problém nastává tehdy jakmile vyfiltruji nějaký status který má ID (10,20,30) tak mi grid vrátí Žádné položky nenalezeny ale když dám F5 a grid se znovu načte z parametry už mi to vrátí všechny statusy odpovídající tomu danému ID. Ale pokud ve filtru vyberu status který má název ( duplicity,postoped,cancel) grid mi normálně vrátí ty řádky aniž bych musel znovu načítat F5.
Proč se tomu tak děje?
Editoval jAkErCZ (11. 3. 2021 10:50)
- MW
- Člen | 626
Zdravím a prosím o radu.
Mám jako zdroj array.
Potřebuji rozchodit itemsDetail:
$datagrid->setDataSource(array...));
$datagrid->setItemsPerPageList([20, 50, 100]);
$datagrid->addColumnText('id', 'ID');
$datagrid->addColumnText('email', 'E-mail')
->setSortable()
->setFilterText();
$datagrid->setItemsDetail();
$datagrid->setTemplateFile(__DIR__ . '/Templates/kontakty_template.latte');
return $datagrid;
kontakty_template.latte
{extends $originalTemplate}
{block detail}
<p>Lorem ipsum</p>
<button class="btn btn-default btn-secondary btn-sm">Just a button</button>
{/block}
výsledek po kliknutí na detail:
<tr class="row-item-detail item-detail-grid-grid-id-1 loaded toggled" id="snippet-grid-grid-item-1-detail">
</tr>
tedy prázdné
Dělám něco špatně. Vše vč. stránkování, filtru funguje
Edit: pokud to nastavím stejně a jako source je DB, tak to jede. Tedy je nejaký problém assoc array jako datasource ??
Tady jsem našel to bylo i reportované. Víte prosím někdo, jak to
opravit?
https://github.com/…d/issues/817
Díky moc!
Editoval MW (29. 3. 2021 19:54)
- d@rkWolf
- Člen | 167
Nedělal někdo s TreeView a Sortable? Je to funkční? Já furt narážím na problém s řazením, pokud se něco posune mezi úrovněmi(změní se parent). V tu chvíli mi docela pravděpodobně nastavává situace, kdy zanořená položka má stejnou hodnotu pozice jako jiná ve vyšší úrovni a jak je přesunu k sobě, celé se to zblázní.
Není někde nebo nemáte někdo nějakou funkční implementaci? V demo kódu to akorát vyhazuje alert hlášku s id, prevId, nextId pozicemi.
Chtěl jsem to použít místo jsTree, co sem měl dříve, ale asi na něj zase dojde, protože mi teď přesunování připomíná řešení rubikovy kostky :-(
Editoval d@rkWolf (30. 3. 2021 0:19)
- MW
- Člen | 626
d@rkWolf napsal(a):
@MW jo, s array datasource detail nefunguje, taky sem na to narazil, i když mě nefungoval ani s DB, protože používám zajaxovanou celou stránku a s tím to nefunguje vůbec(překreslí to místo jednoho řádku celý grid a nechá jen ten detail-ostatní řádky zmizí)
Tak hint je skutečně tady:
ArrayDataSource.php line:94
public function filterOne(array $condition): IDataSource
{
foreach ($this->data as $item) {
foreach ($condition as $key => $value) {
if ($item[$key] =**=**= $value) {
$this->setData([$item]);
return $this;
}
}
}
$this->setData([]);
return $this;
}
Je to jiný datový typ. Po odmazání jenoho „=“ to funguje.
- H0w4rd
- Člen | 96
Nepsal jste někdo prosím export do Excelu, který by bylo možné
poskytnout?
Vím, jak na to, ale nechtěl bych vynalézat kolo :)
Nezabýval jste se někdo nějakým lepším nastylováním? Bez urážky, datagrid je skvělý, ale jeho základní vzhled vůbec neoslní. Lidi se rozhodují na základě emocí a vzhled je to, co nejvíc prodává, bohužel.
PS: Při filtrování s nejnovější verzí Nette Forms to hází
Nette\Forms\Container::getValues() invoked but the form is not valid.
viz https://forum.nette.org/…innem-inputu
Prosím přijmi pull request https://github.com/…2813a629c159
Editoval H0w4rd (3. 4. 2021 13:17)
- mt
- Člen | 2
Zdravim, jak bych se mohl dostat k paginator datum? Mam na jednom projektu velkou databazi a pri nacitani gridu padam na pamet. Potreboval bych tedy implementovat strankovani pro nacitani z databaze. A nevim jak se co nejjednodusseji dostat k paginator datum a co bude pripadne potreba jeste upravit.
- Pavel Janda
- Člen | 977
@H0w4rd Ahoj!
- Nevím o ničem, co by existovalo někde veřejně např. v gistu. Pokud bys export do excelu připravil a zveřejnil jako OS, bylo by to megasuper! Já sám s tím asi moc nepomohu, už jsou to roky, co jsem se o něco podobného snažil. Ale komunita by to, podle mě, moc moc ocenila.
- Hodně lidí si styly upravuje, to je jasné. Já už leta používám AdminLTE v nějaké konkrétní verzi, kam datagrid s defaultními styly celkem, myslím, pasuje. Ale už kdysi jsem chtěl připravit styly pro AdminLTE, Material Design, nejnovější Bootstrap a pod. Kdybys vykopnul nějaké téma, cool, super! Budem rádi. Souhlasím, že by to chtělo zase po čase nějaký facelift.
@mt Nejsem si jistý, jestli to správně chápu. Potreboval bych tedy implementovat strankovani pro nacitani z databaze. → tohle se děje, jinak by datagrid fungovat pořádně ani nemohl.. Z databáze se vždy vytahuje max X (třeba 20) položek z databáze. Nebo tím myslíš něco jiného?
- mt
- Člen | 2
@PavelJanda Uz jsem pokrocil, mam problem s tim ze musim pouzivat pouze sql dotazy a pouzival jsem array datasource. Ted jsem zacal pouzivat Nette database source ale ten ma problemy s parsovanim naseho komplikovaneho postgresql dotazu.Myslim si ze problem je v parsovani selectu v left joinu.
- Pavel Janda
- Člen | 977
@mt Pokud řešíte nějaký sožitější SQL dotaz, doporučuji poohlédnout se po něčem přímočařejším, paříklad Dibi. Nebo pokud nemáte jinou možnost než použít nette database, můžete zkusit data source, který vám umožní psát přímo SQL.
- Petr Parolek
- Člen | 455
H0w4rd napsal(a):
Nepsal jste někdo prosím export do Excelu, který by bylo možné poskytnout?
Vím, jak na to, ale nechtěl bych vynalézat kolo :)Nezabýval jste se někdo nějakým lepším nastylováním? Bez urážky, datagrid je skvělý, ale jeho základní vzhled vůbec neoslní. Lidi se rozhodují na základě emocí a vzhled je to, co nejvíc prodává, bohužel.
PS: Při filtrování s nejnovější verzí Nette Forms to hází
Nette\Forms\Container::getValues() invoked but the form is not valid.
viz https://forum.nette.org/…innem-inputu
Prosím přijmi pull request https://github.com/…2813a629c159
Ahoj, můžeš se inspirrat např. tu https://github.com/…tService.php
- svatekr@gmail.com
- Člen | 1
Ublaboo je mi moc sympatické. Zkouším co umí. Do svého cvičného projektu jsem chtěl vložit sloupec s hodnocením hvězdičkama. Kdyby to někoho zajímalo, vymyslel jsem to takto:
$grid->addColumnText('vote', 'Hlasování')
->addCellAttributes(['width' => '15%'])
->setRenderer(function (Katalog $item) use ($voteSelectFacade) {
$rating = $voteSelectFacade->getRate($item->getId());
$rates = [1, 2, 3, 4, 5];
foreach ($rates as $rate) {
$highLight = $rate <= $rating ? ' text-warning' : '';
$farFas = $rate <= $rating ? 'fas' : 'far';
$i[$rate] = Html::el('i', ['class' => $farFas . ' fa-star' . $highLight]);
$el[$rate] = Html::el('a', ['class' => 'ajax'])
->href($this->link("Vote!", $item->getId(), $rate))
->setHtml($i[$rate]);
}
return Html::el('div')
K tomu ještě nějaké styly:
<style>
.col-vote a .far, .col-vote a .fas {
color: gray;
}
.col-vote a:hover .far, .col-vote a:hover .fas {
font-weight: 900;
color: #ffda6a !important;
}
</style>
Výsledek je k vidění na http://katalogy.rudolfsvatek.cz. Případné kritické komentáře ohledně SEO katalogů přezíravě ignoruji ;-) – jde spíš o cvičný projekt, kde zkouším spojení Nette, Doctrine2 a Ublaboo.
Editoval svatekr@gmail.com (11. 4. 2021 20:12)
- theo
- Člen | 57
Snažím se provést update aplikace na současnou verzi Datagridu a narazil jsem na tento problém:
V minulosti bylo možné nastavit přes setDefaultPerPage()
metodou výchozí počet položek na stránku. Jedna z možností která tam
byla (a zákazník na ni bohužel trvá) je i hodnota all
pro
zobrazení všech hodnot najednou. Bohužel deklarace této metody se změnila
na setDefaultPerPage(int $count)
, což je sice hezké z hlediska
předvidatelnosti hodnot a typové kontroly, ale prakticky to znemožňuje
nastavit hodnotu all
. Přitom ve zbytku kódu tato logika zůstala
zachována, neboť v $itemsPerPageList
zůstala ve výčtu
výchozích hodnot.
Je to doopravdy rozbité (tak to aspoň podle mě vypadá), nebo jsem jen nepochopil jak to použít?
- jikki
- Člen | 73
Ahoj,
na předchozí stránce jsem se dočetl, že Ublaboo 6.8.0 by mělo již fungovat s Nette/Forms 3.1.3. Dělal jsem update z 6.2.x na 6.8.0, zkoušel jsme i poslední 6.8.1. Ale při filtrování stále vyhazuje varování:
User Warning
Nette\Forms\Container::getValues() invoked but the form is not valid.
Je tam nějaké jiné řešení, než se vrátit v Nette/Forms 3.0.x ?
Díky moc
- jikki
- Člen | 73
jikki napsal(a):
Ahoj,
na předchozí stránce jsem se dočetl, že Ublaboo 6.8.0 by mělo již fungovat s Nette/Forms 3.1.3. Dělal jsem update z 6.2.x na 6.8.0, zkoušel jsme i poslední 6.8.1. Ale při filtrování stále vyhazuje varování:
User Warning
Nette\Forms\Container::getValues() invoked but the form is not valid.Je tam nějaké jiné řešení, než se vrátit v Nette/Forms 3.0.x ?
Díky moc
Ahoj,
Nedalo mi to a znova si s tím hraji. Updatoval jsem vše na poslední verzi
Nette/Forms 3.1.3 a Ublaboo 6.8.1.
Zjistil jsem, že filtrování mi v některých tabulkách funguje a jiných
ne. Rozdíl byl InlineAdd. Pokud má tabulka InlineAdd, tak filtrování háže
výše zmíněnou chybu. Bez InlineAdd funguje filtr v pořádku.
Snad to pomůže autorům udělat opravu.
Díky moc
- d@rkWolf
- Člen | 167
Zdravím – dá se nějak zablokovat sortování pro určitý řádek v Tree View? Potřeboval bych, aby byla 1.pozice neměnná, aby s ní nešlo hýbat, ani nic dostat před ni. Totálně mi to narušuje fungování systému, protože posunutí čehokoliv nad(nebo pod? jak chcete) „kořen stromu“ je absurdní.
- MW
- Člen | 626
Zdravím, prosím o radu.
pokud gridu nastavím defaultFilter
$datagrid->setDefaultFilter(['rokdokl' => date('Y')], false);
Tak grid naskočí s defaultním filtrem, ale tlačítkem „Resetovat filter“ se tato hodnota nesmaže ani s parametrem false.
Jak na to prosím? Filtry jinak fungují.
Díky!
- dTTb
- Člen | 30
Ahoj, narazil sem na drobny bug. Pokud mam jako datasource array/ArrayHash
tak big inline editing nefunguje – po kliku na edit tlacitko se v odpovedi
neposle cast snippets, cimz nedojde k vykresleni edit formu…
Pri zmene datasource na Nette\Database\Table\Selection editace funguje
normalne.
Testovano na ublaboo/datagrid v6.6.1 a v6.7.1.
- TJ00
- Člen | 1
Zdravím, snažím se v gridu, který má datasource array, přidat ItemsDetail, ale nic se neděje – ani žádný error.
př.:
$grid->setDataSource([['id' => 1, 'text' => 'TEST']]);
$grid->addColumnText('text', 'Text');
$grid->setItemsDetail(function() { return 'Lorem Ipsum'; });
Mohl by to být bug?
- pp
- Člen | 50
Ahoj, potreboval bych v gridu pouzit rozsirene filtrace.
Jednak potrebuju filtrovat pomoci zavisleho selectu
(napr. pro vyber adresniho mista – mesto ⇒ ulice ⇒ cp)
a pomoci gps souradnic z mapy.
Asi bych si poradil se samostatnym formularem ale nevim jak to zakomponovat do
filtracniho zahlavi datagridu.
Muzu poprosit neco pro inspiraci?
diky
Editoval pp (5. 7. 2021 19:09)
- petak23
- Člen | 16
Ahojte,
chcem sa opýtať ako je to s balíkom datagrid-nette-database-data-source.
Chcem rozbehnúť jeden projekt a mám tam php 8.0.
1. Nefunguje mi balíček: composer require contributte/datagrid-nette-database-data-source aj napriek tomu, že z oficiálnej stránky je tam smerované. Vyhadzuje mi to:
[InvalidArgumentException]
Could not find a matching version of package contributte/datagrid-nette-database-data-source. Check the package spelling, your version constraint and that the package is available in a stability which match
es your minimum-stability (dev)
2. Paradoxne balíček: composer require ublaboo/datagrid-nette-database-data-source funguje ale vyhadzuje mi to chybu:
Problem 1
- ublaboo/datagrid-nette-database-data-source[v1.1.0, ..., v1.1.1] require nette/application ^2.3|^2.4 -> found nette/application[v2.3.0, ..., v2.4.x-dev] but it conflicts with your root composer.json require (^3.0.6).
- Root composer.json requires ublaboo/datagrid-nette-database-data-source ^1.1 -> satisfiable by ublaboo/datagrid-nette-database-data-source[v1.1.0, v1.1.1].
Čo je teda správne? A ako nainštalovať balík
datagrid-nette-database-data-source na php8.0? Ide to vôbec?
V dokumentácii je php: ^7.2
Preistotu prikladám aj composer.json(Na konci mám minimum-stability: dev, ale
ani stable nefungovalo…):
{
"name": "nette/web-project",
"description": "Nette: Standard Web Project",
"keywords": ["nette"],
"type": "project",
"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
"require": {
"php": ">= 7.2",
"nette/application": "^3.0.6",
"nette/bootstrap": "^3.0",
"nette/caching": "^3.0",
"nette/database": "^3.0",
"nette/di": "^3.0",
"nette/finder": "^2.5",
"nette/forms": "^3.0",
"nette/http": "^3.0",
"nette/mail": "^3.0",
"nette/robot-loader": "^3.0",
"nette/security": "^3.0",
"nette/utils": "^3.0",
"latte/latte": "^2.5",
"tracy/tracy": "^2.6",
"mdanter/ecc": "^1.0",
"dg/adminer-custom": "^1.28",
"ublaboo/datagrid": "^6.9"
},
"require-dev": {
"nette/tester": "^2.3"
},
"autoload": {
"classmap": ["app/Bootstrap.php"]
},
"minimum-stability": "dev"
}
- piskotek
- Člen | 35
Ahoj,
řešil někdo potřebu mít „předdotaz“ pro datagrid + elastic?
Př: X uživatelů bude mít přístup k různým věcem z jednoho indexu
v elasticu a potřebuju na základě user ID, jejich práv, a odeslaného
formuláře s dotazem (mimo datagrid) zobrazit výsek z indexu (cca 300 tis
položek v indexu). Řešil někdo něco takového? Nějaký nástřel jak na
to? Díky
- pp
- Člen | 50
Ahoj,
muzu nejak pri vytvareni datagridu prednastavit predvybrane hodnoty pro
setFilterMultiSelect()
?
nebo aspon lze pridat atribut data-actions-box
pro zobrazeni voleb
selectAll/deselectAll ?
Zda se ze
setAttribute('data-actions-box', true)
mi nefunguje.
Popr. jak nahradit ‚bootstrap-select‘ za ‚select2‘ ?
Editoval pp (3. 9. 2021 21:28)
- jikki
- Člen | 73
Ahoj,
začal jsem používat naju místo nette.ajax. Datagrid funguje, jediné co zlobí je zobrazení stromu. Rozbalení na nejvyšší úrovni hodí js chybu. Rozbalení vnořené úrovně už načte znova celou stránku. Nevíte prosím někdo co s tím?
Uncaught TypeError: naja.load is not a function
at dataGridLoad (datagrid.js:91)
at success (datagrid.js:671)
at EventTarget.<anonymous> (datagrid.js:28)
at EventTarget.makeRequest (Naja.ts:150)
Mám přes composer
ublaboo/datagrid": "^6.9
A přes NPM
„ublaboo-datagrid“: „^6.7.1“
„naja“: „^2.1.5“,
Děkuji
- bortomar
- Člen | 7
Zdravím, pokouším se zprovoznit víceúrovňový TreeView. Ajaxové requesty mi fungují u první úrvoně, ale jakmile kliknu na zobrazení potomků na druhé úrovni, neproběhne ajax ale běžný request, přičemž se refreshne stránka a všechny řádky se tudíž uzavřou. Nevíte, kde by mohl být problém? Díky.
Edit: Zapomněl jsem zmínit, že používám Naju. Při použití nette.ajax to funguje.
Editoval bortomar (19. 11. 2021 12:12)
- jikki
- Člen | 73
Ahoj,
používám bootstrap-dark-4 místo originálního bootstrap 4. Používá se stejně jako originál bootstrap 4, jen má vestavěný dark mode, umí se i přepínat automaticky podle nastavení systému.
Datagrid sice použává bootstrap styly, ale v souboru datagrid.css má několik tříd nastavenou barvu pozadí na bílou nebo světle šedou. Při přepnutí na tmavým režime kdy se stránka přebarví do tmava datagrid stále svítí bíle. Upravil jsem v bootstrap.css čtyři řádky, kde jsem zrušil nastavení pozadí na bílou. A to stačilo to na to, aby se i datagrid přebarvil do tmava, musím říct, že vypadá skvělé i tmavý. Pokud by měl někdo zájem, tak pošlu pull request.
Dále by mě zajímalo, zda je v plánu updade, který přidá podporu bootstrap 5. Bylo by to fajn a rád pomohu.
Díky moc
- lubos
- Člen | 22
Umíme v DataGrid změnit třídění při nastavování filtru v setCondition ?
$grid->addColumnDateTime('dt_market', 'na trh')
->setSortable()
->setFilterSelect(['1'=>'vyjde', '2'=>'vyšlo', '0'=>'vše'], 'dt_market')
->setCondition(function($fluent, $value) {
if ($value==1) {
$fluent->where('dt_market >= CURDATE()')
// tady vnutit třídění: order('dt_market ASC');
} else if ($value==2) {
$fluent->where('dt_market <= CURDATE()');
// tady vnutit třídění: order('dt_market DESC');
}
});
- theo
- Člen | 57
Ahoj,
existuje nějaký způsob jak si určit, ve kterém místě (pod)dotazu se
bude provádět omezení počtu výsledků (LIMIT/OFFSET)?
Používám Dibi DataSource nad PostgreSQL a potřeboval bych, aby LIMIT/OFFSET
klauzule byla uvnitř poddotazu, což je šikovný způsob jak zrychlit
stránkování na konci velkého objemu dat.
Například místo dotazu
SELECT d.dil,
d.cislo_dilu,
d.typ_dilu,
d.datum AS datum_montaze,
t.nazev AS nazev_typu_dilu,
u.uzivatel,
u.jmeno AS namontoval
FROM dily d
LEFT JOIN typy_dilu t USING (typ_dilu)
LEFT JOIN uzivatele u USING (uzivatel)
ORDER BY d.datum
LIMIT 25
OFFSET 136875;
ve kterém se nejprve k tabulce díly (která je obrovská) připojí potřebné sloupce z ostatních tabulek a to vše se následně seřadí a omezí by měl dotaz vypadat jako:
SELECT d.dil,
d.cislo_dilu,
d.typ_dilu,
d.datum AS datum_montaze,
t.nazev AS nazev_typu_dilu,
u.uzivatel,
u.jmeno AS namontoval
FROM (
SELECT *
FROM dily
ORDER BY d.datum
LIMIT 25
OFFSET 136875
) d
LEFT JOIN typy_dilu t USING (typ_dilu)
LEFT JOIN uzivatele u USING (uzivatel);
To vede k tomu, že se nejdříve vše seřadí podle data a omezí a pak se k tomu teprve připojí potřebná data z ostatních tabulek, což je mnohem rychlejší než předchozí postup.
Přes Dibi fluent rozhraní se mi to nepodařilo zprovoznit a nedaří se mi
to ani s pomocí definice DataSource
jako databázového dotazu (a
s pomocí metody toFluent()
z něj udělám
DibiFluentDataSource
), kde si LIMIT
a
OFFSET
nahradím s pomocí modifikátoru %lmt
a
%ofs
.
Chvíli to vypadalo, že by cesta mohla vést přes callback
onRender
, ve kterém bych upravil nastavil DataSource, který by
měl již nastavená omezení, ale ani to mi moc nepomohlo.
Tuší někdo jak dostat do definice datového zdroje výše zmíněnou podobu dotazu tak, aby byla navázána na řazení a stránkování?
- Pavel Janda
- Člen | 977
@theo Mělo by to jít celkem dobře. Kdysi jsem řešil něco trošku podobného – nehodil se mi žádný existující data source – potřeboval jsem tahat data z elasticu, ale přitom něco dotahovat z mysql. A count volat vůbec úplně jinak.
Můžeš si pro tenhle kokrétní grid podědit buď
DibiFluentDataSource
nebo rovnou FilterableDataSource
a potřebné metody si dopsat sám. Například v ::getCount()
vůbec nebudeš řešit nějaké joiny ani vložené selecty, vrátíš tam
select count(id) from dily
. Tím máš optimalizaci č. 1. A tak
postupuješ dál. :) Makes sense?
- karlosek
- Člen | 1
Ahoj, asi jsem našel chybku. Pokud použiju řazení na jednom sloupci,
který mi dá dotaz přes 3 tabulky, tak nemůžu použít filtrování textu
na sloupci, který má stejný název v některé z těch tabulek.
...WHERE (("name" ILIKE '%d%'))...
Ambiguous column: 7 ERROR: column reference "name" is ambiguous
Potřeboval bych asi něco jako
...WHERE (( "public"."table"."name" ILIKE '%d%'))...
Nebo to lze nějak parametrem nastavit?
Díky
- Pavel Janda
- Člen | 977
@Zdeno1981 Ahoj, já ji nechystám, bo se mi líbí současná verze. :P Ale nebudu se bránit PR se styly a templatou 👍
- Petr Parolek
- Člen | 455
POZOR na BC break ve verzi 6.9.3
$inlineAdd->onSubmit[] = function (ArrayHash $values): void {
bdump($values);
$this->flashMessage('Record was added!', 'success');
$this->redrawControl('flashes');
};
předtím byl typeint Nette\Utils\ArrayHash a nyní je typehint array
- Petr Parolek
- Člen | 455
Petr Parolek napsal(a):
POZOR na BC break ve verzi 6.9.3
$inlineAdd->onSubmit[] = function (ArrayHash $values): void { bdump($values); $this->flashMessage('Record was added!', 'success'); $this->redrawControl('flashes'); };
předtím byl typeint Nette\Utils\ArrayHash a nyní je typehint array
@PavelJanda díky za opravu ve verzi 6.9.4.