ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- oorac
- Člen | 6
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 | 221
Doporučuji vytvořit nativní formulářový prvek přes addDateTime().
Editoval radas (19. 2. 12:18)
- d@rkWolf
- Člen | 164
@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 | 167
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