ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Ivorius
- Nette Blogger | 119
Nesetkal se někdo s tím, že by mu ublaboo (datagrid-instant-url-refresh) přepisovalo špatně url?
Mám např. url /admin/pages/?type=posts (což je v v modulu Pages –
presenter Homepage – action(type)
a
render(type)
– router správně zachycen na (
[<locale [a-z]{2}>/]admin/<module>/<presenter>[/<action>][/<id>]
)
Jenže jakmile tam spustím componentu datagridu, tak se zavolá ajaxem grid-refreshState() a ta vrátí payloadem
state: {locale: "cs", grid-page: null, grid-per_page: 40, grid-sort: {created: "DESC"},…}
a následuje přepsání url adresy na něco takového: /admin/pages/?locale=cs&grid-per_page=40&grid-sort%5Bcreated%5D=DESC
Což jednak smaže type a navíc přidá locale (je @persistent), která je defaultní a standardně v url není.
Pokud type přidám do routeru, pak url zůstane správně /admin/pages/posts?locale=cs&grid-per_page=40&grid-sort%5Bcreated%5D=DESC, tzn. že to asi ořízne vše za otazníkem, což by ale asi nemělo?
- andros
- Člen | 145
Ahoj, prosím o radu. Jak správně v datagridu použít Nextras ORM ?
$grid->setDataSource($this->repository->findAll());
Toto očekává jako vstup: DataSource\IDataSource|array|\DibiFluent|\Dibi\Fluent|Nette\Database\Table\Selection|\Doctrine\ORM\QueryBuilder
Nextras ORM je: Nextras\Orm\Collection\ICollection
Díky za rady.
- Rob Bob
- Člen | 60
Tak to asi možné není, celý řádek + item detail je obalený v jedné snippetArea items, bylo by to potřeba rozdělit do dvou. Šlo mi o to, že jsem chtěl, aby po akci (ajaxový odkaz) v item detail zůstal item detail rozbalený a obnovil se pouze vnitřek, takto se obnoví celý řádek a item detail se pochopitelně zavře. Musel bych na to navěsit další JS handler, aby se opět zavolalo otevření item detail.
- Pavel Janda
- Člen | 977
@Člověk 10 měsíců
starý dotaz, ale přeci si na něj dovolím odpovědět: Elasticsearch se
již též dá použít jako data source: https://ublaboo.org/…data-source/. :)
Je to nástřel (byť funkční). Pokud by něco scházelo, PR i námitky
přijímám.
Editoval Pavel Janda (10. 11. 2017 19:49)
- monty
- Člen | 66
Ahoj.
Mohu prosím jeden dotaz, nevím si rady…
Především díky Pavle za skvělou komponentu, vypadá moc hezky :)
A teď k dotazu. Načítá se mi hrozně pomalu.
Cache by měla běžet. Při prvním načtení (tabulky, která
má 3 záznamy) 7–9s, potom už „jenom“
6–7s :)
Nevíte, v čem by mohl být háček? Dělám svůj první projekt v Nette a mám z toho všeho hlavu jako balón, takže díky za jakoukoliv radu :)
Peťa
- Pavel Janda
- Člen | 977
@Montanus Hm, tady fakt není jediný důvod, proč by to jelo pomalu.
Zkus zakomentovat: {control tagsGrid}
– stále je to tak
pomalé?
- monty
- Člen | 66
@PavelJanda Právě, že není…resp, žádná rychlovka to není
500 – 900ms, ale rozhodně ne 6 vteřin :)
Existuje nějaká možnost, jak přes Tracy zjistit, co přesně se jak dlouho
načítá?
- monty
- Člen | 66
sepo napsal(a):
monty napsal(a):
ako máš nakonfigurovaný host pre DB ?
„localhost“ verzus „127.0.0.1“ ?
Ahoj.
Zkoušel jsem obojí, nehraje to roli, žádná změna :/
Ještě nějaký návrh? To, že je to tak strašidelně pomalý na localhostu
není zase až tak zásadní, ale i na tom serveru to není zrovna
rychlovka.
- Pro srovnání – načítání TTFB
- s gridem bez cache – 1,5s
- s gridem z cache 1s
- stránka bez gridu bez cache 700ms
- stránka bez gridu z cache 300ms
- monty
- Člen | 66
@PavelJanda @sepo Zkusil jsem jednu věc…
Vyzkoušel jsem grid ještě v jiným projektu, co mi běží na localu a
všechno se zdá být v pořádku.
Existuje možnost, jak zjistit detailnější výpis načítání jednotlivých
tříd?
Už ale nevím, jak to víc ořezat, protože v aktuálním presenteru jsem
zakázal všechno kromě gridu, presenter mi rozšiřuje přímo základní
nette presenter a DI si předávám jen Database\Context.
Bootstrap mám totožný s druhým projektem…
…
hustý, tak sem na to přišel, je mi úplně blbý to vypustit, ale když už jsem to tady rozpoutal :>
Narozdíl od druhýho projektu jsem měl v configu u latte moc šikovný
řádeček…
setTempDirectory(null)
Když jsem zkoušel odpoledne všechno možný, včetně manuálního
vynucování cache v šabloně, protože se mi její funkce nějak nezdála,
v temp se sice něco tvořilo, ale žádný pozitivní výsledek v načítaní
to jinak nemělo…
…no tak už vím proč :D
Tak se mějte, díky za veškerou snahu.
Peťa
Editoval monty (13. 11. 2017 19:25)
- pitr82
- Člen | 121
@PavelJanda Ahoj,
jen takový dotaz.
Mám grid v komponentě.
při renderu používám standartní vykreslení:
public function render()
{
$this->template->setFile(__DIR__ . '/MenuGrid.latte');
$this->template->render();
}
Pokud ale nechci použít šablonu, kde je jen definován control
Zkusil jsem použit :
public function render()
{
$this['mujGrid']->render();
}
To ale vyhodí chybu.
U formlářu toto používám běžně …
Nette\InvalidStateException
Cannot send header after HTTP headers have been sent
- Pavel Janda
- Člen | 977
@pitr82 A pokud nepoužiješ tree view, tak to jede? Nezdá se mi, že by na to mělo tree view nějaký dopad..
- Pavel Janda
- Člen | 977
@cujan No jasně. Přidej si jako první sloupec, ve kterém budeš v customRendereru vypisovat $i++. :)
- cujan
- Člen | 410
A este jedna vec, potrebujem namapovat na idUser, meno z tabulky users, samozrejme FK mam na tabulku users z idUser na users.id
ale
$grid->addColumnText(‚idUser‘, ‚Meno‘,‚users.name‘);
hodi chybu
No reference found for $ekonomika->ref(users).
kde moze byt problem? rozhoduje aj nazov FK? Pouzivam Nette\Database…
Editoval cujan (21. 11. 2017 13:21)
- Pavel Janda
- Člen | 977
@cujan
$rowNumber = 1;
$grid->addColumnText('rowNumber', '#')
->setRenderer(function() use (& $rowNumber): int { // Intentionally &
return $rowNumber++;
});
- Pavel Janda
- Člen | 977
@cujan
ActiveRow ti umožňuje šáhnout na referenci přes jiný než defaultní
sloupec. Dělá se to tuším takto:
$item->ref($referencedTable, $throughColumn)
.
Takže:
1, Buď může použít custom renderer a doplnit tam vlastní
$throughColumn
2, Nebo mrkneš na stránky dokumentace, jak to lze udělat rafinovaně
jednoduše: https://ublaboo.org/…/data-source#…
- cujan
- Člen | 410
Pavel Janda napsal(a):
@cujan
ActiveRow ti umožňuje šáhnout na referenci přes jiný než defaultní sloupec. Dělá se to tuším takto:$item->ref($referencedTable, $throughColumn)
.Takže:
1, Buď může použít custom renderer a doplnit tam vlastní$throughColumn
2, Nebo mrkneš na stránky dokumentace, jak to lze udělat rafinovaně jednoduše: https://ublaboo.org/…/data-source#…
vdaka funguje…
- cujan
- Člen | 410
cujan napsal(a):
Pavel Janda napsal(a):
@cujan
ActiveRow ti umožňuje šáhnout na referenci přes jiný než defaultní sloupec. Dělá se to tuším takto:$item->ref($referencedTable, $throughColumn)
.Takže:
1, Buď může použít custom renderer a doplnit tam vlastní$throughColumn
2, Nebo mrkneš na stránky dokumentace, jak to lze udělat rafinovaně jednoduše: https://ublaboo.org/…/data-source#…vdaka funguje…
@PavelJanda
este jedna vec, ked idUser potrebujem tahat meno a priezviko ako to docielim,
lebo stlpec s nazvom idUser mozem pridat do gridu iba raz…nie?
- Pavel Janda
- Člen | 977
@cujan Pokud to chápu správně, potřebuješ vypsat hodnoty dvou
sloupců do jednoho sloupce datagridu. Je to tak?
Buď si tedy udělej concat v query a dej tomu alias, který pak vypíšeš,
nebo v custom rendereru vracej $item->ref(‚..‘)->name . ' ' .
$item->ref(‚..‘)->anotherField.
- marten_cz
- Člen | 10
Lze nejak dostat export do multiAction? Jde mi o to, ze bych potreboval dat moznost si stahnout CSV, TSV,… Obe moznosti, jak filtrovane, tak vse. Nechci davat tlacitka vedle sebe, bylo by toho moc. Chtel bych pouzit addMultiAction a tam mit moznost tsv, csv,… Ale nedari se mi najit hezkou cestu. Krome toho si to udelat v presenteru… Neslo by toto zakomponovat? Nejde se k tomu nejak dobre dostat?
- marten_cz
- Člen | 10
@PavelJanda Do MultiAction nelze dat export do CSV. Tedy aniz bych si ho musel napsat sam. Muzu pak udelat PR, ale at nedelam neco, co ma jine reseni.
Moje idea byla oddelit logiku exportu csv z handlu. Pak bych ji byl schopen pouzit i odjinud. Do multiaction pak muzu pridat ->addExportCsv. Vpodstate to same, co je ted primo na gridu. S tim, ze by to dostalo parametry z getu a nebylo vazano pouze na id exportu. Pak to muze fungovat i na formular, kde si uzivatel naklika format, v jakem chce export.
Nebo to nechces primo v gridu a resit si to mimo nej?
- Pavel Janda
- Člen | 977
@marten_cz Moc se mi nezdá, že je to celé kvůli tomu, že se ti
nelíbí víc tlačítek vedle sebe. Být tebou extendnu šablonu datagridu a
nahradím megajednoduše block exports
… Teď vypadá takto:
<span n:block="exports">
{foreach $exports as $export}{$export->render()}{/foreach}
</span>
Z toho můžeš klidně udělat dropdown. :) Obal to celé listem a jednotlivé exporty pak dej jako list-item. Simple, right?
- andros
- Člen | 145
Ahoj, řeším teď s gridem jeden problém a pořád nemůžu přijít na
řešení. Proto bych Vás rád požádal o radu.
Mám tabulku do které mám joinem připojený další sloupec z jiné tabulky.
např. seznam knih se sloupcem autor, který je navázán z jiné tabulky přes
id. Pak mám inline editaci, včetně sloupce autor. Jenže abych mohl autora
uložit DB, potřebuji po odeslání formuláře vědět i jeho id. Zároveň
ale nechci, aby to id bylo možné editovat.
když chci editovat nějaký sloupec, udělám to jednoduše:
$grid->addInlineEdit()
->onControlAdd[] = function ($container) {
$container->addText('author', '');
};
Jenže k autorovi, bych potřeboval i jeho id. Pokud id přidám jako další sloupec a nastavím jej jako setDefaultHide(), nezobrazí se mi hodnota v odeslaném formuláři.
Prosím, napadne někoho nějaké řešení ? Předem díky moc.
- andros
- Člen | 145
Pavel Janda napsal(a):
@andros
$container->addHidden('id', $id)
?
Tohle jsem zkoušel jako první, ale já potřebuji $item->id, jenže nemám $item.
$grid->addInlineEdit()
->onControlAdd[] = function ($container) {
$container->addHidden('id', $id)
Item mám až v:
$grid->getInlineEdit()->onSetDefaults[] = function ($container, $item) {
$container->setDefaults([
'id' => $item->id
]);
};
Něco dělám určitě špatně , ale co :(
- Čamo
- Člen | 798
Zdravím,
narazil som na problém pri použití group by. Paginator s tým vôbec
nepočíta. Raz zobrazí nadbytočné prázdne stránky inokedy nezobrazí
paginator vôbec. Je to bug alebo sa to dá nejako riešiť?
Vyzerá to tak, že sa to tu už preberalo https://forum.nette.org/…any-datagrid?p=18 ale bez odpovede.
Editoval Čamo (1. 12. 2017 23:07)
- nocturne32
- Člen | 21
Ahoj, jak funguje addColumnTitle (atd)? Já jen jestli by šlo udělat, abych
do jedné metody mohl dát více sloupců z db. (něco jako
addColumnMultipleText(‚key‘, ‚name‘, ‚COLUMNS‘))
Chtěl bych si přidat metodu, která mi bude vykreslovat něco takového:
(edit)
+----------------------------------+
| Titulek článku | //link
| (autor) | //pouze text
+----------------------------------+
Editoval nocturne32 (3. 12. 2017 16:52)
- Pavel Janda
- Člen | 977
@nocturne32 Úplně nerozumím tomu, čeho chceš dosáhnout, ale nepomohl by ti custom column template, případě custom renderer?
- nocturne32
- Člen | 21
Pavel Janda napsal(a):
@nocturne32 Úplně nerozumím tomu, čeho chceš dosáhnout, ale nepomohl by ti custom column template, případě custom renderer?
@PavelJanda Pardon, nepodíval jsem se jak vypadá můj příspěvek. Updatoval jsem to.
Editoval nocturne32 (3. 12. 2017 16:48)
- Pavel Janda
- Člen | 977
@nocturne32 No a můj příspěvek jsi si nepřečetl? :)
https://ublaboo.org/datagrid/column#…
https://ublaboo.org/…rid/template#…
- nocturne32
- Člen | 21
Pavel Janda napsal(a):
@nocturne32 No a můj příspěvek jsi si nepřečetl? :)
https://ublaboo.org/datagrid/column#…
https://ublaboo.org/…rid/template#…
Jej. Úplně mi tohle uniklo. Děkuju :)
- igor.pocta
- Člen | 100
Ahoj,
prosím poradíte? Když mám aktivní dva filtry a jeden zruším, tak se zruší oba. Na stránkách datagridu se ale zruší pouze ten požadovaný. Netuším, kde je chyba. Používám Doctrine2 jako zdroj a v několika případech používám i vlastní podmínky (setCondition).
Datagrid vypadá takto (zkusil jsem jak addFilterText, tak setFilterText a problém to nevyřešilo).
$grid->addColumnNumber('id', 'article.id');
$grid->addFilterText('id', 'article.id', 'article.id');
$grid->addColumnLink('title', 'article.title', 'Article:show', 'article.title');
$grid->addFilterText('title', 'article.title', 'article.title')
->setPlaceholder('article.placeholder');
// ...