ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- marek-m
- Člen | 66
@PavelJanda v Ublaboo\DataGrid\Row vo funkcii getValue($key) uprav na riadku 92
} else if ($this->item instanceof DibiRow) {
return $this->item->{$key};
}
return tak, aby key rozdelilo napr. z t.id na id – takto bude fungovat $grid->setPrimaryKey(‚t.id‘); pri joint selectoch, dik
- raven
- Člen | 1
Pod Nette24–20160731 dosávám hlášku: DataGrid is attached to:
‚App\AdminModule\Presenters\PostPresenter‘, but instance of
PresenterComponent is needed.
Pod Nette2310 je to OK.
Nevím si už rady, poradíte prosím?
Když kód na kontrolu té instanceof zakomentuji, DataGrid normálně naběhne,
ale to asi není ideální řešení.
Děkuji.
Post.list.latte
{control postListGrid}
PostPresenter.php
use App\AdminModule\Components\Grid;
class PostPresenter extends BasePresenter {
...
/** @var Grid\PostListGridFactory @inject */
public $postListGrid;
protected function createComponentPostListGrid($name) {
$this->postListGrid->create($this, $name);
}
...
}
PostListGrid.php
class PostListGridFactory {
...
public function create($parentPresenter, $componentName) {
$grid = new DataGrid($parentPresenter, $componentName);
$grid->setDataSource([['id' => 1, 'name' => 'John'], ['id' => 2, 'name' => 'Joe']]);
$grid->addColumnNumber('id', '#')->setSortable();
$grid->addColumnText('name', 'jméno');
}
}
- iNviNho
- Člen | 352
Chalani nenarazili ste niekedy na problém pri setSortableCallback($callback) na prvku, ktorý sa custom vypisuje bez reálnej existencie stlpca?
Kód:
<?php
->setSortable()
->setSortableCallback(function($fluent, $sort) use($fId) {
$this->contactService->sortByFieldId($fluent, $fId, $sort[$fId]);
});
?>
Pri ajaxovom requeste na sort funguje všetko ako má. Do url sa vloží
http://URL?locale=sk&contactGrid-per_page=20&contactGrid-sort%5B3%5D=ASC
Akonáhle ja by som dajme tomu refreshol stránku, tak mi vyhodí doctrina QueryException, pretože to nerobí môj sortable callback, ale defaultný order by… Problém nastáva hlavne preto, lebo daný stlpec nie je reálny stlpec v DB a doctrina sa snaží zoradiť podľa neho …
- Pavel Janda
- Člen | 977
@iNviNho Jakou používáš verzi? Mohl bys kdyžtak udělat sandbox-like příklad a poslat v zipu do issue? Díky!
- iNviNho
- Člen | 352
V composeríku mám:
"ublaboo/datagrid": "dev-master"
Podobná chyba sa riešila tu
Trápim sa ešte trocha a ked tak vytvorím issue :) Chyba pravdepodobne vzniká pri vykonávaní toho sortenia, kde by sa mal kód pozrieť, či nie je definovaný setSortableCallback a ak je, tak použiť jeho a nie defaultne nastavený sortable, lebo Doctrine mi vyhadzuje QueryException:
SELECT c
FROM ContactModule\Entities\Contact c
ORDER BY c.2 ASC
Avšak 2ka nie je stlpec, preto je tam custom callback aby na základe tej dvojky spravil fluent operáciu :(
Editoval iNviNho (5. 10. 2016 10:47)
- CZechBoY
- Člen | 3608
Mně by se zase líbily filtry klikací jak v MS Office Access atd. –
kliknu na název sloupce nebo trychtýř vedle názvu a vyjede mi okno
s filtrováním.
https://support.content.office.net/…f0c6ae79.gif
- Pavel Janda
- Člen | 977
@CZechBoY Takovým způsobem schovávající se filtry se mi moc nelíbí. Většina lidí chce rychle něco najít, neřešit několik kliknutí jenom vyfiltrování stavu == 1.
@ryu S tímhle naopak souhlasím. Pokud jsou filtry prázdné, budou schované, pokud je již někde něco filtrováno, tak zůstane filtr vidět. Mohl bys založit issue? Nebo v lepším případě PR? :P
- Hug0
- Člen | 35
Ahoj,
po tomhle
commitu se mi nedaří zobrazit filtry. Nefunguje mi to ani na jednoduchém
příkladu:
<?php
protected function createComponentDataGrid($name)
{
$grid = new DataGrid($this, $name);
$grid->setDataSource($this->repo->createQueryBuilder('worklog'));
$grid->addColumnDateTime('date', 'Date')
->setFormat('j.n.Y H:i:s')
->setFilterDate('date');
}
?>
Když smažu podmínku:
<?php
!empty($control->filters)
?>
tak je vše v pořádku. Dělám něco špatně?
- Hug0
- Člen | 35
Hug0 napsal(a):
Ahoj,
po tomhle commitu se mi nedaří zobrazit filtry. Nefunguje mi to ani na jednoduchém příkladu:<?php protected function createComponentDataGrid($name) { $grid = new DataGrid($this, $name); $grid->setDataSource($this->repo->createQueryBuilder('worklog')); $grid->addColumnDateTime('date', 'Date') ->setFormat('j.n.Y H:i:s') ->setFilterDate('date'); } ?>
Když smažu podmínku:
<?php !empty($control->filters) ?>
tak je vše v pořádku. Dělám něco špatně?
Myslím, že by tam mělo být
<?php
!empty($filters)
?>
místo
<?php
!empty($control->filters)
?>
- Pavel Janda
- Člen | 977
@pitr82 Určitě jde, použij vlastní podmínku:
$grid->addFilterText('custom', 'Custom search:', 'name')
->setCondition(function($fluent, $value) {
/**
* The data source is here DibiFluent
* No matter what data source you are using,
* prepared data source will be passed as the first parameter of your callback function
*/
$fluent->where('name NOT LIKE %like', $value);
});
- iNviNho
- Člen | 352
Ahojte chalani,
riešili ste už niekto ako pri small inline editaci zobraziť datepicker a úspešne zvoliť dátum?
<?php
$grid->addColumnDateTime("completeDate", "Dátum odovzdania")
->setEditableCallback(function($id, $value) {
})
->setEditableInputType("text", ["class" => "form-control datepicker"]);
?>
Po kliku sa mi zobrazí textové políčko a vysunie datepicker, ale akonáhle kliknem na dátum z datepickru, tak sa mi zatvorí textové pole :-\
Skúšal som čosi v JS, ale neúspešne :-\ Viete ma troška naviesť?
- FTCP
- Člen | 6
Dobré den,
odpovím si sám na dotaz ohledně odebrání zobrazení všech položek
„All“ z paginace, bo to v dokumentaci není.
$grid->setItemsPerPageList([10, 30, 50, 100],FALSE);
jinak, šlo by prosím přidat možnost nastavení lokalizace/jazyka datepickerů již při vytváření komponenty v presentru ? musím to obcházet přidáním attributy onReady
$("[data-provide='datepicker']").attr("data-date-language","cs");
- matoni555
- Člen | 40
Ahoj,
předně díky za skvělý datagrid. Implementoval jsem ho do svého projektu a
pracuje se s ním skvěle.
Mám však dva dotazy:
- Proč je nutné, aby pro funkci skrývání sloupců bylo zapnuté setRememberState? Chci využívat skrývání sloupců, ale mám u gridů nastaveno $grid->setRememberState(FALSE); protože nechci, aby si gridy pamatovaly nastavení.
- Plánuje někdo funkci autocomplete u textových filtrů?
Díky
Editoval matoni555 (26. 10. 2016 19:32)
- Pavel Janda
- Člen | 977
@matoni555 1, Asi jsi myslel
$grid->setRememberState(FALSE);
?
Chápu, zajímavý námět. Mohl bys založit issue? Dává to smysl
implementovat. Teď jeto bráno celkově – buď bude datagrid používat
session nebo ne. A v té session jsou všechny věci – filtry,
sortyování, pagination, skrývání sloupců.
2, Neplánuji, protože mi to vedle toho realtime vyhledávání přijde zbytečné.. Výsledky vyhledávání vidíš stejně hned..
- Pavel Janda
- Člen | 977
@CZechBoY Pokud má člověk větší db, bude pro našeptávání používat nějaké víc custom řešení, třeba elastic, což?
Ale pokud by to někdo využil, rád mergnu související PR. :)
- Filip111
- Člen | 244
Ahoj,
chtěl jsem grid vyzkoušet, ale po instalaci a zkoušení hned prvního
příkladu dostávám výjimku:
Ublaboo\DataGrid\Exception\DataGridException
Session filter: Filter [params] not found
Kód:
public function createComponentSimpleGrid($name)
{
$grid = new DataGrid($this, $name);
$grid->setDataSource(array(
'0' => array('title' => 'asdasdasd', 'description' => 'adadqwdad')
));
$grid->addColumnText('name', 'Name');
}
Je potřeba nějak iniciovat session nebo je problém jinde?
(Nette 2.4, datagrid 4.4, PHP 7)
Díky.
- Pavel Janda
- Člen | 977
@Filip111 Věřím, že hláška pochází z jiné instance
komponenty.. Takovýhle příklad ale stejně nemůže fungovat. DataGrid
potřebuje znát primární klíč, což je by-default id
. To
můžu napravit:
$grid = new DataGrid($this, $name);
$grid->setPrimaryKey('title');
//...
Teď však přidáváš sloupec s indexem name
($grid->addColumnText('name', 'Name');
), ale v tom poli
žádné name
není.
Změním tedy $grid->addColumnText('name', 'Name');
na
$grid->addColumnText('title', 'Title');
. Teď grid funguje
v pohodě.
Editoval Pavel Janda (25. 10. 2016 10:33)
- Filip111
- Člen | 244
@Pavel Janda:
Rozdílným názvem sloupců gridu a sloupců datasource to nebylo –
zkopíroval jsem do fóra nějakou blbost (zkoušel jsem primárně Doctrine
datasource a nakonec zjednodušoval, sloupce jsem měl správně).
Ale, tvoje zmínka o jiné instanci pomohla.
Dokud jsem volal {control grid}
tak to nešlo, až když jsem ho
přejmenoval na např. {control necoGrid}
, tak se to chytlo. Sice
nechápu, kde se bere komponenta s názvem grid (v configu není,
v presenterech taky ne), ale už to funguje.
Díky.
- libik
- Člen | 96
Ahoj,
zkousim tento datagrid s Doctrine2. Mam tabulku (135 MiB, 274459 zaznamu, 56 sloupcu) a pokud si nactu celou entitu, strankovani je silene pomale: Queries: 3 , time: 9015.516 m
Entitu chci celou a vyuzil bych setDefaultHide() a nechal na userovi, co si zobrazi.
Je nejaka moznost jak to zrychlit? Tusim, ze problem bude spis na strane MySQL. Jedine co me napada, je entitu nenacitat celou, ale vybrat jen nektere sloupce explicitne, coz se mi nechce. Navic vyberu-li jich vic jak polovinu, uz ten cas zase leti nahoru.
Diky.
- JardaH
- Člen | 5
Ahoj,
především díky za skvělý datagrid. Mám jen dva dotazy.
Mám sloupce cena, množství a celková cena. Na sloupci množství je
nastavený setEditableCallback.
Kliknu na množství, změním, přes collback zapíši do databáze, ok
Teď dotaz:
- V callbacku je pouze hodnota primárního klíče a nové množství. Dá se nějak dostat k hodnotě sloupce „cena“?
- V řádku se mi překreslí nově zadané množství. Já ale v databázi měním i „celkovou cenu“, ta se nepřekreslí. Je možné překreslit celý řádek?
Nechci používat velkou editaci s ikonkami ke změně jedné položky. Datasource je dibifluent.
Díky
- Pavel Janda
- Člen | 977
@JardaH Ahoj,
1, V tom callbacku nikde další data nedostaneš, ale můžeš si je ze svého modelu vytáhnout, když znáš primární klíč. Stačí tak?
2, Můžeš na datagridem zavolat po editaci
DataGrid::redrawItem($id)
. To překreslí editovaný (a nebo jiný,
záleží na $id) řádek. :) Akorát přijdeš asi o tu zelenou animaci,
protože se překreslí novým řádkem.
- libik
- Člen | 96
Jeste to zkoumam a neni mi jasne proc mysql dotazy paginatoru ve vsech dotazech obsahuji vsechny vlastnosti Entity. Nestacilo by to jen u 3. dotazu, ktery vybira uz konkretnich x zaznamu pro zobrazeni v tabulce?
Pro celkovy pocet (trva cca 4s)
SELECT COUNT(*) AS dctrn_count
FROM (
SELECT DISTINCT id_0
FROM (
SELECT c0_.id AS id_0, c0_.surname AS surname_1, c0_.name AS name_2,
...
c0_.call AS call_55
FROM customer c0_) dctrn_result) dctrn_table
Pro zjisteni ID dle offset a limit (trva cca 4s):
SELECT DISTINCT id_0
FROM (
SELECT c0_.id AS id_0, c0_.surname AS surname_1,
....
c0_.call AS call_55
FROM customer c0_) dctrn_result
ORDER BY id_0 DESC
LIMIT 10
OFFSET 0
A finalni vyber dat (trva 9ms):
SELECT c0_.id AS id_0, c0_.surname AS surname_1
...
c0_.call AS call_55
FROM customer c0_
WHERE c0_.id IN (317030, 317029, 317028, 317027, 317026, 317025, 317024, 317023, 317021, 317020)
ORDER BY c0_.id DESC
Kdyz u prvnich dvou dotazu vnoreny select zkratim na
SELECT c0_.id AS id_0
Tak to leti v radu ms…
Nebo mi neco unika (coz je mozne :)?
EDIT: Ted uz nemam vic casu, ale… neseknul by se pak na tom filtr? Ale to by se dalo vyresit uvedenim jen tech poli, ktere bude obsahovat where, ne?
Editoval libik (27. 10. 2016 11:34)
- ondrusu
- Člen | 118
Ahojte, tento datagrid je super, objevil jsem jednu chybku. Zde na řádku 1501 v definici tlačítka by neměl být druhý parametr. Nette tam pak samo doplní „Odeslat“ a takhle to vypadá jak to je teď viz tento obrázek
Nemám moc zkušeností s vývojem open-source knihoven, že bych to opravil
a commitnul…
Je moje teoreie správná? Mám Nette\Forms ve verzi 2.3 možná 2.4
Děkuji.
Editoval ondrusu (29. 10. 2016 16:11)
- Pavel Janda
- Člen | 977
@ondrusu Teorie i praxe je taková, že tlačítko je přes css by-default skryto. Ale je pravda, že se nikomu nic nestane, když to bude tak, jak říkáš. Dobrý nápad, upravím.
- ondrusu
- Člen | 118
Pavel Janda napsal(a):
@ondrusu Teorie i praxe je taková, že tlačítko je přes css by-default skryto. Ale je pravda, že se nikomu nic nestane, když to bude tak, jak říkáš. Dobrý nápad, upravím.
no a jak se jinak dá odesílat filter? To si na to mám napsat nějaký „automatic submit“ u každýho políčka?
- Pavel Janda
- Člen | 977
@ondrusu Automatický submit tam již je. Zkus prozkoumat docu: http://ublaboo.org/datagrid/?…
- ondrusu
- Člen | 118
jo já to prostuduju, ten „bower“ je něco jako composer že …
Ještě bych měl jeden dotaz. Mám dvě entity.
Řekněme články a kategorie. Každý článek má vyplněnou kategorii
(idčko) a ta kategorie má název popis atd…
Chci v datagridu vypsat název kategorie, ale když v SQL dotazu zmíním tu
kategorii tak to spadne na chybě.
[Semantical Error] line 0, col 69 near 'category,': Error: Invalid PathExpression. Must be a StateFieldPathExpression
A metoda, která vrací data.
public function getArticles() {
$qb = $this->em->createQueryBuilder();
$qb->select('arc.id, '
. 'arc.name, '
. 'arc.desc, '
. 'arc.category, '
. 'arc.last_time, '
. 'arc.last_date ')
->from(Articles::class, 'arc')
return $qb->getQuery()->getScalarResult();
}
Nevěděl bys kde je chyba?? Nebo jak to mám vrátit v Doctrine aby to bylo správně?
- F.Vesely
- Člen | 369
Vse je v dokumentaci v sekci Data Source:
public function getArticles() {
$qb = $this->em->createQueryBuilder();
$qb->from(Articles::class, 'arc');
return $qb;
}
$grid->setDataSource($this->articlesService->getArticles());
$grid->addColumnText('name', 'Name', 'name');
$grid->addColumnText('category_name', 'Category', 'category.name');
- ondrusu
- Člen | 118
F.Vesely napsal(a):
Vse je v dokumentaci v sekci Data Source:
public function getArticles() { $qb = $this->em->createQueryBuilder(); $qb->from(Articles::class, 'arc'); return $qb; }
$grid->setDataSource($this->articlesService->getArticles()); $grid->addColumnText('name', 'Name', 'name'); $grid->addColumnText('category_name', 'Category', 'category.name');
jj díky já to vyzkouším
- ondrusu
- Člen | 118
Jo funguje, a ještě líp než jak sem to měl já. Paráda ted můžu předávat i
$item->getName()
Díky všem co mi poradily.
Ještě mám jednu otázku, to už je jen technická:
Můj projekt se snaží být OOP a snažim se psát i čistý kod atd.
Chci se zeptat kam dáváte třídy / metody s definici datagridu
public function getGridDefinition($presenter, $name) {
$grid = new DataGrid($presenter, $name);
$grid->setTemplateFile(....latte);
$grid->setDataSource($datasource);
$grid->addColumnText('name', 'Name')->setFilterText();
return $grid;
}
Mám teď adresářovou strukturu modelů
model/facades
model/entities
model/services
myslíte že se to hodí do
model/component
Nebo je lepší název??
díky za pomoc.
- libik
- Člen | 96
Ahoj,
pokorne se pripominam s https://forum.nette.org/…any-datagrid?p=12 ;)
Lze u action pouzit neco jako setDisabled(), kde bych na zaklade danych podminek mohl tlacitko nezobrazit?
- Pavel Janda
- Člen | 977
@libik Ten link míří na jiné téma než disabled tlačítko…
Každopádně, je to možné, víz dokumentace: http://ublaboo.org/datagrid/row#… :)
- Pavel Janda
- Člen | 977
@libik Bohužel nepoužívám doctrinu, takže asi neporadím. Ale určitě jsou načítat properties entity lazy, ne?
- jvitasek
- Člen | 1
Ahoj, nenašel jsem, že by se to tady už řešilo, pokud ano, tak se omlouvám.
$grid->addColumnNumber('idobjednavka_voucher', 'Voucher')
->setRenderer(function($item){
return $this->searchModel->getVoucherById($item->idobjednavka_voucher)->nazev;
})->setFilterText();
Nicméně filtr samozřejmě hledá v IDčkách. Jak říct filtru, aby hledal ve vyrenderovaných textech? Jde to vůbec? Díky za info!
- romiix.org
- Člen | 343
jvitasek napsal(a):
Takto by to malo ísť: http://ublaboo.org/datagrid/filter
$grid->addFilterText('custom', 'Custom search:', 'name')
->setCondition(function($fluent, $value) {
/**
* The data source is here DibiFluent
* No matter what data source you are using,
* prepared data source will be passed as the first parameter of your callback function
*/
$fluent->where('id > ?', strlen($value));
});
- Pavel Janda
- Člen | 977
@jvitasek Neboj se kouknout do kódu. :)
public function setFilterText($columns = NULL)
{
# ...
}
Takže si jednak upravíš dotaz do DB a jednak si nastavíš, nad kterým
sloupcem/sloupci se má vyhledávat. (Více sloupců:
Column::setFilterText(['v.nazev', 'v.popis'])
, jeden sloupec:
Column::setFilterText('v.nazev')
)
- matous.radek
- Člen | 2
Použil jsem jako datasource ublaboo/datagrid-nette-database-data-source
Jak můžu přidat ItemsDetail?
Dělám to pomocí
$grid->setItemsDetail($detail = TRUE, $primary_where_column = $grid->getPrimaryKey());
Kdy jako datasource mám query ktere se sklada z 3 joinu. Mám ale problém s id. V query je více id ček. Když je přejmenuji přes Alias na p_id a nastavím $grid->setPrimaryKey(‚p_id‘); tak to nefunguje protože při kliknutí na detail se přída podle primaryKey where kde alias není znám.
Pokud zkusím nastavit PrimaryKey na ‚products.id‘ pres teckovou notaci tak to vypíše chybu Cannot read an undeclared column ‚products‘.
Jak tedy určit id pro primaryKey aby šel ItemDetail?edit: Zde jsem osekal daný kod, když mám v query vice tabulek, nevím jak definovat primary key, bud to píše že id není jednoznačne, alias na sloupec to nezna, a tabulku taky ne. Stejný problém se projeví všude při praci s primarním klíčem(ne jen u itemsdetail) tedy např u callbacku pro statusColumn.
> public function createComponentProductsGrid()
> {
> $grid = new DataGrid();
> $query =
> 'SELECT p.id, b.id as b_id, p.name AS p_name, b.name AS b_name
> FROM products AS p
> LEFT JOIN brands AS b
> ON p.brands_id = b.id';
>
> $params = [];
> $datasource = new NetteDatabaseDataSource($this->ndb, $query, $params);
> $grid->setPrimaryKey('products.id');
> $grid->setDataSource($datasource);
> $grid->addColumnText('name', 'Název', 'p_name')->setSortable();
> $grid->addColumnText('brandName', 'Značka', 'b_name')->setSortable();
> $grid->setItemsDetail($detail = TRUE, $primary_where_column = $grid->getPrimaryKey());
>
> return $grid;
> }
Díky za pomoc
Ahoj zdravím, chci poblahopřát ke skvělému datagridu.
Mám ale nicméně problém stejného rázu jako mistr Domki.
Existuje tedy nějaké řešení? Domkimu jsem psal, ale teď řešení
nemá.
Používám PostgreSQL a DibiFluent.
Chybová hláška při
$grid->setPrimaryKey("kniha.id");
"Attempt to read missing column ‚kniha‘, did you mean ‚knihaid‘?
Problém však je, že samozřejmě nikde v dotazu nemám, že bych hledal sloupec kniha, nýbrž právě kniha.id.
Nastavit
$grid->setPrimaryKey("id");
samozřejmě nefunguje, kvůli kolizím id.
Editoval matous.radek (5. 11. 2016 9:24)