ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- oorac
- Člen | 7
Ahoj,
setkal se někdo s následující situací?
Mám nette framework, ublaboo/datagrid a ORM Doctrine. V datagridu mám
přes 15 sloupečků, 5 je defaultně zobrazeno a zbytek defaultně skryto.
Nicméně, když chci vyfiltrovat dle dataRange a zároveň dle typu položky
v rámci filterSelect, tak se mi občas děje to, že server spadne. Server je
na gigaserver.cz v rámci klasického webhostingu Easy. Vždy mě to na
10 minut zablokuje a pak to zase funguje dál. Stane se mi to vždy alespoň
1-krát denně. Nesetkal se s tím už někdo?
Tohle je část mého kodu:
$grid = new Datagrid($this, $name);
$grid->setTranslator($this->translator);
$grid->setItemsPerPageList([10, 50, 100, 250, 500], false);
$grid->setColumnsHideable();
$grid->setDefaultPerPage(10);
$grid->setStrictSessionFilterValues(false);
$grid->setTemplateFile(DIR_APP . DS . 'Templates/Datagrid/templates/custom.latte');
$grid->setDataSource(new DoctrineDataSource($this->queryBuilder, 'id'));
$grid->setDefaultSort(['accountDate' => 'DESC']);
$grid->addColumnText('type', $this->translator->translate('forms.type'))
->setRenderer(function (AllData $allData) {
return $this->translator->translate('texts.allDataType.' . $allData->getType());
})
->setSortable()
->setFilterSelect([
'' => $this->translator->translate('texts.-all-'),
AllData::TYPE_CASH_REGISTER_ITEM => $this->translator->translate('texts.allDataType.' . AllData::TYPE_CASH_REGISTER_ITEM),
AllData::TYPE_SAFE_ITEM => $this->translator->translate('texts.allDataType.' . AllData::TYPE_SAFE_ITEM),
AllData::TYPE_FIX_ITEM => $this->translator->translate('texts.allDataType.' . AllData::TYPE_FIX_ITEM)
])
->setCondition(function (QueryBuilder $qb, $value) {
$qb->andWhere('allData.type = :type')
->setParameter('type', $value);
});
$grid->addColumnDateTime('accountDate', $this->translator->translate('forms.accountDate'))
->setRenderer(function (AllData $allData) {
return $allData->getAccountDate()?->format('d.m.Y');
})
->setSortable()
->setSortableCallback(function (QueryBuilder $qb, $sort) {
if ($sort['accountDate']) {
$qb->addSelect('COALESCE(cri.accountDate, si.accountDate, fi.accountDate) AS HIDDEN orderedDate')
->orderBy('orderedDate', $sort['accountDate']);
}
})
->setFilterDateRange()
->setCondition(function (QueryBuilder $qb, ArrayHash $value) {
if ($value->offsetExists('from') && empty($value->offsetGet('from'))) {
$qb->andWhere('((cri.accountDate <= :dateTo AND cri.id IS NOT NULL) OR
(si.accountDate <= :dateTo AND si.id IS NOT NULL) OR
(fi.accountDate <= :dateTo AND fi.id IS NOT NULL))')
->setParameter('dateTo', new DateTime(str_replace(' ', '', $value->offsetGet('to'))));
} elseif ($value->offsetExists('to') && empty($value->offsetGet('to'))) {
$qb->andWhere('((cri.accountDate >= :dateFrom AND cri.id IS NOT NULL) OR
(si.accountDate >= :dateFrom AND si.id IS NOT NULL) OR
(fi.accountDate >= :dateFrom AND fi.id IS NOT NULL))')
->setParameter('dateFrom', new DateTime(str_replace(' ', '', $value->offsetGet('from'))));
} elseif ($value->offsetExists('from') && $value->offsetExists('to')) {
$qb->andWhere('((cri.accountDate BETWEEN :dateFrom AND :dateTo AND cri.id IS NOT NULL) OR
(si.accountDate BETWEEN :dateFrom AND :dateTo AND si.id IS NOT NULL) OR
(fi.accountDate BETWEEN :dateFrom AND :dateTo AND fi.id IS NOT NULL))')
->setParameter('dateFrom', new DateTime(str_replace(' ', '', $value->offsetGet('from'))))
->setParameter('dateTo', new DateTime(str_replace(' ', '', $value->offsetGet('to'))));
}
});
Děkuji za případnou radu.
Editoval oorac (29. 1. 8:41)
- radas
- Člen | 224
Doporučuji vytvořit nativní formulářový prvek přes addDateTime().
Editoval radas (19. 2. 12:18)
- d@rkWolf
- Člen | 167
@Felix jsou někde zkompilované minifikované assety k té NEXT verzi? Ve složce assets je tuna .ts souborů – nevím, k čemu jsou a co s nimi. NPM nepoužívám, roky používám u webů Webloader, protože mi zkompiluje SASS, zminifikuje CSS/JS a to vše udělá i na obyčejném hostingu(kde rozhodně nehrozí, že mě nechají připojit na terminál a něco tam spouštět), takže když si nějaký klient vyžádá u několik let starého webu změnu barvy z červené na modrou, přihlásím se PSPadem na FTP, upravím příslušný CSS či SCSS soubor a smažu minifikovaný CSS, práce na pár minut. Místo, abych trávil půl dne stahováním webu na localhost, úpravou souborů, spouštěním kompilace přes NPM a pak to zas nahrával na web a ještě někde přepisoval nějakou verzi nebo url souboru kvůli cache prohlížečů.
U aktuální verze Datagridu jsem si prostě všechny potřebné CSS a JS stáhl, hodil do příslušné složky a přidal do webloaderu, ale to s těmi TS asi fungovat nebude.
- Pavel Janda
- Člen | 977
DataGrid::setDataSource(new ApiDataSource(…))
matronator napsal(a):
Pavel Janda napsal(a):
A ještě jedna věc: přibyl nový datasource:
ApiDataSource
. Je experimentální a netestoval jsem ho. Pokud ho někdo využije, piště, co přidat/zlepšit. Moc tam toho asi nebude. ApiDataSource prostě forwarduje filtrování, sortění a pod na remote api.Sorry, vim že je to starý příspěvek, ale mám dotaz k tomu
ApiDataSource
. Chci přidat filtr, který nebude filtrovat v databázi, ale pošle tu zadanou hodnotu na remote API a z té se mi pak vrátí objekt, ze kterého bych chtěl vytáhnout jednu property a tu následně použít pro filtrování výsledků datagridu.Je tam asi víc věcí, které mi teď ještě nejsou úplně jasné jak udělat, ale prvně jsem se zasekl na tom, že když chci zavolat
$grid->setFilterText(function ($dataSource, $item))
, tak jak mám nastavit tomu$dataSource
URL té API, která uApiDataSource
lze nastavit pouze v konstruktoru?
- Pavel Janda
- Člen | 977
Tree view nemá pagination, nedávalo mi to smysl přidávat… :)
tom napsal(a):
Ahoj, funguje vam setPagination pripadne setDefaultPerPage pro TreeView? Me se tam strankovani neukazuje
- Pavel Janda
- Člen | 977
Od toho je větev next
, za pár chvil budeme mergovat do
masteru. Z té pak vznikne po otestování verze 7 – bez jQuery a komplet
přepsaným JS. Navrhuji vzít zatím pro testovací účely tuto verzi
iru napsal(a):
iru napsal(a):
Felix napsal(a):
👋 Pripravujeme novou verzi datagridu. S podporou PHP 8, bootstrap 5 a prepsanym javascriptem. Postupne muzete testovat v next vetvi.
https://github.com/…id/pull/1060
https://github.com/…ton/pull/168Jak prosím nainstaluji? Mám:
"require": { "php": ">= 8.0", "nette/application": "^4.0", "nette/bootstrap": "^3.2 || ^4.0", "nette/caching": "^3.2 || ^4.0", "nette/database": "^4.0", "nette/di": "^3.2 || ^4.0", "nette/forms": "^4.0", "nette/http": "^4.0", "nette/mail": "^4.0", "nette/php-generator": "^4.0", "nette/robot-loader": "^4.0", "nette/safe-stream": "^3.0", "nette/security": "^4.0", "nette/utils": "^4.0", "latte/latte": "^3.0", "tracy/tracy": "^2.10 || ^3.0", "ublaboo/datagrid": "dev-next" }, "require-dev": { "nette/tester": "^2.0" }, "autoload": { "psr-4": { "App\\": "app/" } }, "minimum-stability": "dev" }
C:\..........>composer update Loading composer repositories with package information Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires ublaboo/datagrid dev-next -> satisfiable by ublaboo/datagrid[dev-next]. - ublaboo/datagrid dev-next requires nette/forms ^3.1.3 -> found nette/forms[v3.1.3, ..., v3.1.x-dev] but it conflicts with your root composer.json require (^4.0). Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
Na serveru mám PHP 8.2, Pokusila jsem se změnit nette/forms ze 4 na 3.1, ale to zase nefungovalo s PHP 8.2. Tak nevím, jak se k tomu datagridu dostat. Když jsem měla Nette 3.2 a PHP 7.2, nefungovalo, tak jsem přešla na nette 4, ale zase mi to nejde :-(
Composer pro nette4 jsem sestavila viz: https://github.com/…ommit/master
Děkuji.Stále bych ten datagrid chtěla používat a nedaří se mi ho nainstalovat, Nevíte prosím někdo jak zprovoznit na PHP 8 a nette4?
- Pavel Janda
- Člen | 977
Yes, po/před mergnutí větve next
do masteru budeme přidávt
lokální build assetů, no worries. Slyším potřeby cca 10k firem v čr,
které npm nepoužívají.
d@rkWolf napsal(a):
@Felix jsou někde zkompilované minifikované assety k té NEXT verzi? Ve složce assets je tuna .ts souborů – nevím, k čemu jsou a co s nimi. NPM nepoužívám, roky používám u webů Webloader, protože mi zkompiluje SASS, zminifikuje CSS/JS a to vše udělá i na obyčejném hostingu(kde rozhodně nehrozí, že mě nechají připojit na terminál a něco tam spouštět), takže když si nějaký klient vyžádá u několik let starého webu změnu barvy z červené na modrou, přihlásím se PSPadem na FTP, upravím příslušný CSS či SCSS soubor a smažu minifikovaný CSS, práce na pár minut. Místo, abych trávil půl dne stahováním webu na localhost, úpravou souborů, spouštěním kompilace přes NPM a pak to zas nahrával na web a ještě někde přepisoval nějakou verzi nebo url souboru kvůli cache prohlížečů.
U aktuální verze Datagridu jsem si prostě všechny potřebné CSS a JS stáhl, hodil do příslušné složky a přidal do webloaderu, ale to s těmi TS asi fungovat nebude.
Editoval Pavel Janda (13. 3. 9:22)
- Taps
- Člen | 168
Zdravím,
používám
$grid->addColumnDateTime('datumPlan', 'Datum')->setSortable()->setFilterDateRange();
a potřeboval bych poradit, jak datepicker převést do češtiny. Zkoušel jsem i níže uvedený kod, ale čeština v datepickeru mi funguje jen pokud se nacházím na první straně výpisu
<script>
$(document).ready(function()
{
$(':text[data-provide="datepicker"]').datepicker(
{
language: 'cs'
});
});
</script>
Dále pak mám dotaz zda existuje nějaká možnost jak tlačítko pro resetování umístit nahoru nad tabulku?
Děkuji
- lukyn
- Člen | 18
Zdravím…
čistá instalace Nette 3.2.3 a datagrid. Při napojení k databázi se
objeví chyba:
Unexpected ‚{else}‘, expecting </a> for element started on line 11 at
column 3 (in ‚…/templates/data_grid_paginator.latte‘ on line 12 at
column 2)
Nevíte, kde může být chyba ?
Editoval lukyn (14. 6. 14:02)
- Infanticide0
- Člen | 99
v data_grid_paginator.latte na řádku 12, Latte narazilo na {else} tam, kde čeká konec tagu <a>.
{if $paginator->isFirst()}
<a class="first btn btn-sm {$btnSecondaryClass} disabled"> TADY
{else}
<a class="btn btn-sm {$btnSecondaryClass} ajax" href="{$link('page!', ['page' => $paginator->page - 1])}" rel="prev"> TADY
{/if}
- vojtech.sejkora
- Člen | 2
Infanticide0 napsal(a):
v data_grid_paginator.latte na řádku 12, Latte narazilo na {else} tam, kde čeká konec tagu <a>.
{if $paginator->isFirst()} <a class="first btn btn-sm {$btnSecondaryClass} disabled"> TADY {else} <a class="btn btn-sm {$btnSecondaryClass} ajax" href="{$link('page!', ['page' => $paginator->page - 1])}" rel="prev"> TADY {/if}
A jak se to da opravit? Kdyz jsem pridal </a> z te casti za {/if}, tak mi to pise
Cannot redeclare block 'icon-arrow-left' (in '.../templates/data_grid_paginator.latte' on line 13 at column 123)
Nemluvě o tom, že se to instaluje pres composer, takze jakakoliv uprava se mi zase zmeni
- vojtech.sejkora
- Člen | 2
David Grudl napsal(a):
Zkus v konfiguračním souboru vypnout strictParsing
Díky to mi ten problem vyresilo :)
- pista5
- Člen | 66
Zdravim,
resit tu jednu vec, s kterou si nevim rady… vse jsem nainstaloval, CSS a JS
jsem si vzal z vendor/ublaboo/datagrid/assets
Mam tam Bootstrap 5 a nette.ajax.js
V URL se mi ale po kazde akci zobrazuji parametry…
/?grid-perPage=20&grid-filter[email]=in
na demoverzi se to vsak nedeje??
https://examples.contributte.org/…id-skeleton/
Cim to prosim muze byt?
- oorac
- Člen | 7
Ahoj, jak je to prosím s ublaboo/datagrid v PHP verzi 8.2? Je to kompatibilní? Nefunguje tam paginator kvůli latte compilaci.
{if $paginator->isLast()}
<a class="first btn btn-sm {$btnSecondaryClass} disabled">{='ublaboo_datagrid.next'|translate}<i n:block = "icon-arrow-right" class="{$iconPrefix}arrow-right"></i></a>
{else}
<a class="btn btn-sm {$btnSecondaryClass} ajax" href="{$link('page!', ['page' => $paginator->page + 1])}" rel="next">{='ublaboo_datagrid.next'|translate}
{/if}
Unexpected ‚{/if‘, expecting </a> for element started on line 30 at column 3 (in ‚…/templates/data_grid_paginator.latte‘ on line 31 at column 2)
Poradí někdo co s tím? Zatím jsem si to fixnul na tvrdo v šabloně, ale vím, že to není správně.
Editoval oorac (Včera 8:54)