ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Domki
- Člen | 310
Takže jako Datasource dát klasický query, jo to by asi šlo díky ;-)
Pavel Janda napsal(a):
@Domki Ano, přesně jak zmínil @PavelKravčík – pokud chceš položit složitější dotaz přes NDB::query(), použij zmíněný ublaboo/datagrid-nette-database-data-source. Dovolí ti složité dotazy a přitom se nebude fetchovat do paměti celá databáze :) .
- ryu
- Člen | 29
Zdravím, předně díky za povedený datagrid.
Řeším teď zrovna inlineadd a zjistil jsem že mi nefungují validační
podmínky v js. Pokud na některé pole nastavím setRequired(), stejně se
formulář odešle, ikdyž je pole prázdné. Dělám něco blbě, nebo to
prostě grid (zatím?) neumí?
U běžných nette formulářú to funguje jak má…
$p = $this;
$grid->addInlineAdd()
->onControlAdd[] = function($cont) use ($p) {
$cont->addText("description")->addCondition(Form::FILLED);
.
.
.
};
- pp
- Člen | 50
Ahoj, poprosil bych o radu
mam zobrazeny grid a pro kazdou polozku bych chtel v jejim detailu zobrazit
dalsi udaje nactene nejakym modelem. Myslel jsem, ze to muze fungovat
nejak takto:
$grid->setItemsDetail(function($item) { return $this->serviceManager->getAll($item->id); } );
tohle melo vratit asociativni pole
ale ze sablony pro grid vidim jen promennou $item – ale jak se dostanu k $items_detail ?
{$original_template}
{block detail}
<h2>{$item->id}</h2>
<p>Lorem ipsum ...</p>
{foreach $items_detail as $k => $v}
<div class="itemdetail">{$k} => {$v}</div>
{/foreach}
{/block}
- romiix.org
- Člen | 343
pp napsal(a):
Neskúšal som to, ale asi by som podedil DataGrid a nahradil metódu
getTemplate()
tak, aby už obsahovala danú premennú.
@PavelJanda Možno by nebolo odveci pridať metódu
addVariable()
a tieto premenné potom dodávať do šablóny. Bolo
by to všeobecne použiteľné riešenie pre tieto problémy.
- pp
- Člen | 50
omlouvam se ale asi bych potreboval jeste postrcit, nejlepe na priklade
chtel bych dosahnout toho, ze se v gridu v detailu pro kazdy radek na zaklade vysledku z modelu serviceManager treba podle $item->id vrati pole hodnot (ruzne delky) ktere bych chtel zobrazit v sablone
neco jako
$grid->getTemplate()->data = $this->serviceManager->getAll($item->id);
{$original_template}
{block detail}
<h2>{$item->id}</h2>
<p>Lorem ipsum ...</p>
{$data}
{/block}
ale jak se dostanu k promenne $item ?
Bohuzel nemam dost zkusenosti na to abych se orientoval v celem kodu gridu
takze mi neni jasny jak zajistit to individualni naplneni sablony pro
detail.
- pp
- Člen | 50
jeste trochu odbocim, zkousel jsem to nejak resit pres vnoreny formular ale
uz pri pouziti
prikladu z dokumentace koncim na chybe
end() expects parameter 1 to be array, null given
60: $this->global->formsStack[] = $formContainer = $_form = end($this->global->formsStack)["items_detail_form-$item->id"];
$grid->setTemplateFile(__DIR__ . '/customer_grid.latte');
$grid->setItemsDetail();
$p = $this->getPresenter();
$grid->setItemsDetailForm(function(Nette\Forms\Container $container) use ($grid, $p) {
$container->addHidden('id');
$container->addText('surname');
$container->addSubmit('save', 'Save')
->onClick[] = function($button) use ($p) {
$values = $button->getParent()->getValues();
$p['customerGrid']->redrawItem($values->id);
};
});
{formContainer items_detail_form-$item->id}
{input id, value => $item->id}
{input name, value => $item->name}
{input save}
{/formContainer}
- Domki
- Člen | 310
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
Editoval Domki (6. 9. 2016 13:24)
- Pavel Janda
- Člen | 977
@Domki Můžeš zkusit master plus pár úprav?
1,
$query =
'SELECT p.id AS 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';
2,
$grid->setPrimaryKey('p_id');
Co je v masteru jinak: třída Row
, která rozhoduje
o způsobu získání dat z jedné položky, neznala třídu
Nette\Database\Row
, tak to spadlo do synfoního property access
(kde se tečka znamená něco jiného). Již o ní ví.
Editoval Pavel Janda (7. 9. 2016 23:17)
- Domki
- Člen | 310
@PavelJanda Stáhl jsem „ublaboo/datagrid“:
„@dev",
verze "ublaboo/datagrid“: „dev-master“ mi nešla stahnout kvuli
minimální pozadavkum: ublaboo/datagrid-nette-database-data-source
v1.0.5 requires ublaboo/datagrid ~2.3|~3.0|~4.0
Ale po kliknutí na akci to vyhodí:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'p_id' in 'where clause' search►
Caused by PDOException
SQL
SELECT p.id AS 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
WHERE p_id = '1'
Ten alias jako primary_key si myslím že nebude správně protože když
daný sql spustím pres phpmyadmin tak to vypiše stejnou chybu a co jsem našel
tak ve where nejsou známy aliasy.
Proto by asi chtělo nacpat plnout definici (products.id nebo p.id) jako
primaryKey. Coz v phpmyAdmin už pak funguje.
BtW. Podle dokumentace jsem pochopil že toto má být právě pro propojení více tabulek, kde budu mít i vice id.
- jirkag
- Člen | 1
Zdravím, předně musím autorovi říci super práce.
- Dotaz začátečníka: Lze u GroupAction vynutit, aby to nebyl ajaxový dotaz. Zkoušel jsem pak záznamy tisknout přes mPdf do souboru a to zřejmě takhle nejde. Děkuji za případný námět kudy lze.
- Inspirace: Líbilo by se mi pro Column prvek „ActionList“ (např.) – jedno tlačítko s více možnostmi (něco jako ColumnStatus, ale pro Action).
Hezký den všem
- flamengo
- Člen | 135
Ahoj, nebyla by prosím nějaká ukázka či odkaz jak pomocí
Nette\Database
dostat data do TREE gridu? V dokumentaci je
příklad pro DIBI, ale s tím nejsem vůbec kamarád :( Předem
díky moc.
- romiix.org
- Člen | 343
jirkag napsal(a):
- Dotaz začátečníka: Lze u GroupAction vynutit, aby to nebyl ajaxový dotaz. Zkoušel jsem pak záznamy tisknout přes mPdf do souboru a to zřejmě takhle nejde. Děkuji za případný námět kudy lze.
Skúsil by som aj pri ajaxovom dotaze:
$presenter->sendResponse(new Nette\Application\Responses\FileResponse(/* ... */));
- Inspirace: Líbilo by se mi pro Column prvek „ActionList“ (např.) – jedno tlačítko s více možnostmi (něco jako ColumnStatus, ale pro Action).
Issue existuje, všetci oceníme PR ;)
- Pavel Janda
- Člen | 977
Kruci ten ActionList, MultiAction (call it whathever you want) už chce víc lidí. Zmíněné issue jsem znovu otevřel. Pokud alespoň pár lidí nasype plusítka, tak to přidám. :)
- sucho
- Člen | 57
Ahoj @PavelJanda ako by sa dalo jednoducho zmeniť ikonky na material design
aktuálne je tam FontAwesome
<span class="fa fa-trash-o"></span>
a potreboval by som
<span class="material-icons">delete</span>
v Ublaboo\DataGrid\DataGrid máš
/**
* @var string
*/
public static $icon_prefix = 'fa fa-';
ale nieje tam žiaden setter ani getter
je to pridávané rovno do template v rendri
dokážem si preťažiť template zavolať parent a tú premenú tam poslať
ale v iných súboroch voláš rovno tú statickú metódu
public function tryAddIcon(Html $el, $icon, $name)
{
if ($icon) {
$el->addHtml(Html::el('span')->class(DataGrid::$icon_prefix.$icon));
if (strlen($name)) {
$el->addHtml(' ');
}
}
}
Editoval sucho (14. 9. 2016 9:57)
- Hug0
- Člen | 35
Ahoj,
předně díky za super doplněk a perfektní dokumentaci. Mám na stránce dva
datagridy, které umožňují inline editaci. Po potvrzení (uložení) změny
v jednom z nich, se mi mimo jiné vrací „_datagrid_inline_edited“ s id
upraveného záznamu. Problém je v tom, že se mi funkce níže (github)
vykoná pro oba datagridy. Dělám něco špatně? :)
<script>
$.nette.ext('datagrid.after_inline_edit', {
success: function(payload) {
if (payload._datagrid_inline_edited) {
$('tr[data-id=' + payload._datagrid_inline_edited + '] > td').addClass('edited');
return $('.datagrid-inline-edit-trigger').removeClass('hidden');
} else if (payload._datagrid_inline_edit_cancel) {
return $('.datagrid-inline-edit-trigger').removeClass('hidden');
}
}
});
</script>
- igor.pocta
- Člen | 100
Ahoj,
jde u TreeView nějak zaměnit setSortableHandler za callback?
Mám celý grid v komponentě ale při této změně se mi to odvolává na presenter a já bych to chtěl mít v rámci komponenty.
Nebo jdu na to špatně a celý grid by měl být přímo v presenteru?
Díky,
I.
- Pavel Janda
- Člen | 977
@Hug0 Neděláš, chybka je v JS datagridu, upravím ten selector, aby se hledal jen patřičný datagrid .
@igor.pocta Můžeš změnit handler, aby se volalo sortování
v komponentě
($grid->setSortableHandler('myComponent:sort!');
), ale JS
datagridu zatím neumí prefixnout název komponenty, pokud je sortable handler
mířen na komponentu. Issue na to již existuje (https://github.com/…agrid/issues?…).
Upravím o víkendu. :)
- Pavel Janda
- Člen | 977
@revoke Není to povinná položka, viz http://ublaboo.org/datagrid#…
Editoval Pavel Janda (14. 9. 2016 15:34)
- revoke
- Člen | 36
@PavelJanda jj, pro ostatní
bower install silviomoreto/bootstrap-select
. Děkuji.
Zkoušel jsem ještě další dvě věci. Postupoval jsem podle návodu, ale nefunguje:
- ColumnStatus – buttony se vykreslí, ale po kliknutí se nezobrazí popup s volbami a tlačítka na kliknutí nijak nereagují.
- Hideable Columns – v záhlaví sloupce nevidím šipky pro skrytí sloupců, nevidím ani tlačítko v pravém horním rohu, kde se dají sloupce nastavit. Vygenerované jsou, ale nejde na ně kliknout.
-- edit
Výše popsané potíže způsoboval právě bootstrap-select. Ikony nebyly
vidět, protože jsem používal glyphicon, nicméně stačilo přidat
do CSS:
.glyphicon-caret-down:before{content:"\e259";}
.glyphicon-gear:before{content:"\e019";}
.glyphicon-check-square-o:before{content:"\e067";}
.glyphicon-square-o:before{content:"\e157";}
Editoval revoke (15. 9. 2016 10:54)
- Re4DeR
- Člen | 71
Ahoj, super grid a díky za nej.
Našel jsem asi bug při řazení sloupců.
1. kliknu na sloupec poprvy – seřadí se, kliknu podruhý, seřadí se obráceně. Pokud kliknu potřetí tak se asi grid pokusí seřazení sloupce úplně vyhodit. Bohužel mi grid tvoří takovou to query:
SELECT *
FROM `servery`
ORDER BY `domena` 0
což háže chybu.
Používám nette dtb table.
Stejné chování je vidět v demu zde http://ublaboo.org/datagrid/filter a zde http://ublaboo.org/datagrid/column při řazení podle slupce „name“.
Pokud vyvolám chybu a pak refreshnu stránku tak už mám jen chybu 500.
- Pavel Janda
- Člen | 977
@Re4DeR Můžeš ukázat prosím celou tvojí továrničku komponenty? I s připraveným ndbt query?
- pitr82
- Člen | 121
@PavelJanda Ahoj,
Když mám grid jako komponentu, jak zavolám action z presenteru ?
Odkazuje mi to samozřejměn na action komponenty.
$grid->addAction('edit', '','**edit**')
->setIcon('pencil')
->setClass('btn btn-xs btn-default ajax')
->setTitle('Upravit zprávu');
Editoval pitr82 (16. 9. 2016 14:44)
- Re4DeR
- Člen | 71
Pavel Janda napsal(a):
@Re4DeR Můžeš ukázat prosím celou tvojí továrničku komponenty? I s připraveným ndbt query?
mám jen v prezenteru
public function createComponentDomainGrid($name) {
DataGrid::$icon_prefix = "glyphicon glyphicon-";
$grid = new DataGrid($this, $name);
$grid->setDataSource($this->serveryRepository->findAll());
}
serveryRepository mi vraci table.
public function findAll(){
return $this->getTable();
}
protected function getTable(){
//nazev tabulky odvodime z nazvu tridy = trida a tabulka se jmenuji stejne
preg_match('#(\w+)Repository$#', get_class($this), $m);
return $this->selectionFactory->table(lcfirst($m[1]));
}
a jak říkám – na demu se to podle mě chová stejně ( https://www.evernote.com/…lKY8wBEunrQw )
Editoval Re4DeR (16. 9. 2016 18:52)
- CZechBoY
- Člen | 3608
Jde nějak filtrovat čas?
Podle názvu funkce addColumnDateTime
bych očekával že se
zobrazí i čas;
podle názvu funkce addFilterDate
chápu, že asi čas filtrovat
nebude.
btw. docela bojuju s tim filtrováním datumu na sqlite (ukládá jako unix timestamp).
Taky se mi zdá divný filtrování
- dám filtrovat třeba podle jména „abcdef“
- odešlu filtrovací form enterem (nešlo by přidat filtrovací tlačítko?)
- chci filtrovat podle jména „xyz“
- odešlu filtrovací form
- filtruju podle jména „abcdef“
datagrid snad nejnovější verze (4.4.12)
Editoval CZechBoY (16. 9. 2016 19:57)
- kralik
- Člen | 230
Ahoj,
zkouším novou verzi datagridu a Nette mi vyhazuje hlášku „Illegal offset
type“ v nette\utils\src\Utils\Html.php:203
v kódu mám grid takto
<?php
...
$grid->addAction('delete', '', 'opravnenisekDel!')
->setIcon('trash-o')
->setTitle('Smazat')
->setConfirm('Opravdu smazat oprávnění pro uživatele %s?', 'uzivatel');
...
?>
Pokud zruším ->setIcon(‚trash-o‘), tak žádný problém není.
<?php
...
$grid->addAction('delete', '', 'opravnenisekDel!')
->setTitle('Smazat')
->setConfirm('Opravdu smazat oprávnění pro uživatele %s?', 'uzivatel');
...
?>
Zatím jsem neodhalil kde mám botu.
Prosím o radu.
Díky
- dusan.ivanco
- Člen | 4
Dobrý deň vám prajem.
Som v nette nový a zatiaľ sa len rozhliadam, ale môžem povedať, že tento datagrid je vážne perfektný. Chýba mi na ňom len jeden detail, ktorý sa neodvážim zatiaľ sám upraviť. Jedná sa o addExportCallback. Bolo by možné tam dodať tieto 2 možnosti?
$grid->addExportCallback($text, $callback, $filtered = FALSE, header = FALSE, view = FALSE);
O čo mi ide:
1.) rád by som dostal ako výstup buď všetko čo ide z setDataSource ako
je teraz, alebo keď by bolo nastavené view = true
aby bol výstup
taký ako ho vidím v samotnom datagride (čiže to čo si zobrazím pomocou
addColumn*), čiže v podstate to čo vidím v csv vygenerovanom pomocou
addExportCsv
2.) taktiež by som rád videl „popis sĺpcov“ pomocou
header = true
, čiže v prípade view = true
by som
na začiatku dostal názvy sĺpcov definované v addColumn*, opäť takisto ako
je v csv exporte a v prípade view = false
by som mal na
začiatku samotné názvy sĺpcov ako ich dostanem z setDataSource
Veľmi dúfam, že ste pochopili o čo som sa tu snažil vykoktať a že si nájdete čas na takúto úpravu.
Za všetko vám vopred veľmi pekne ďakujem.
- Pavel Janda
- Člen | 977
@Hug0 composer update
, JS věc aktualizována
@igor.pocta composer update
, JS věc aktualizována
- Pavel Janda
- Člen | 977
@Re4DeR Mohl bys, prosím, založit issue?
@kralik Mohl bys, prosím, založit issue?
@dusan.ivanco Bod jedna jsem snad pochopil. Bohužel to ale asi
nepřidám. :( Máš ale k dispozici třetí parametr metody
DataGrid::addExportCallback(..., $fileter = FALSE)
, kterým
můžeš ovlivnit, zda se jedná o data vyfiltrovaná (co, co vidí user),
nebo ne.
DataGrid::addExportCallback()
slouží ke custom exportům,
které si může programátor upravit dle libosti. Takže si to budeš muset
upravit.. :)
@CZechBoY U sloupce ColumnDateTime
si můžeš zvolit
formát výpisu data/času (Y-m-d
, nebo třeba H:i
,
proto má v názvu i čas.)
Filtr pro čas je dobrý nápad, mohl bys založit issue pls?
2, Mooc divné chování. Mohl bys vyrobit sandbox s ukázkovými sqlite daty a prdnout to jako ZIP do issue? Prozkoumám všechno, co jsi psal.
- dusan.ivanco
- Člen | 4
@dusan.ivanco Bod jedna jsem snad pochopil. Bohužel to ale asi nepřidám. :( Máš ale k dispozici třetí parametr metody
DataGrid::addExportCallback(..., $fileter = FALSE)
, kterým můžeš ovlivnit, zda se jedná o data vyfiltrovaná (co, co vidí user), nebo ne.
DataGrid::addExportCallback()
slouží ke custom exportům, které si může programátor upravit dle libosti. Takže si to budeš muset upravit.. :)
No, neviem či sme sa pochopili, hlavne pri bode 1 (ten bod 2 by som aj oželel). V bode 1 som myslel aby som mal možnosť v addExportCallback dostať presne tie dáta čo vidím v samotnom zobrazení, respektíve v csv exporte (addExportCsv). Konkrétny príklad:
<?php
private $counter = 1;
public function createComponentRegister($name) {
$grid = new DataGrid($this, $name);
.
.
.
$grid->addColumnText('x1', '#')
->setRenderer(function() {
return $this->counter++;
});
.
.
.
return $grid;
}
?>
Predpokladám, že toto do addExportCallback nedostanem
Aj tak ďakujem za skvelú prácu.
- Pavel Janda
- Člen | 977
@dusan.ivanco Chápu to. Chceš dostávat již zformátovaná data.. ExportCallback je právě proto, aby sis mohl data upravit ještě dalšími způsoby. Nevím, zda by takovouhle věc využilo víc lidí. Vždycky však můžeš poslat PR. :)
- jean_cz
- Člen | 12
Ahoj,
řeším problém s metodou addAction. Nepřišel jsem na způsob jak předat „action“ s jinými parametry než jsou data ve sloupcích.
Dejme tomu, že chceme zavolat action „print“ z presenteru „Printer“, která přijíma dva parametry id a velikost stránky – Printer:print(12, self::PAGE_SIZE) kde druhý parametr je konstanta a tedy se v datasource nenachází.
Nevěděl by někdo?
Díky.
- Pavel Janda
- Člen | 977
@jean_cz Action
zatím neumí přidání „externích“
parametrů. Ale můžeme to přidat, jelikož se po tom ptal i někdo jiný.
Mohl bys založit issue pls?
- Pavel Janda
- Člen | 977
@Domki Ano.
Edit: :D
Je to normálně komponenta, takže do ní můžeš šáhnout, respektive do její šablony:
$this['myGrid']->getTemplate()->foo = 'bar';
Editoval Pavel Janda (25. 9. 2016 14:19)
- Domki
- Člen | 310
Dík funguje, když to volam z render..().
Já to zkoušel při vytváření comonenty jako $grid->getTemplate→ a to
nešlo že není připojena komponenta
Pavel Janda napsal(a):
@Domki Ano.
Edit: :D
Je to normálně komponenta, takže do ní můžeš šáhnout, respektive do její šablony:
$this['myGrid']->getTemplate()->foo = 'bar';
- Pavel Janda
- Člen | 977
@Domki Můžeš už ze začátku připojit presenter jako rodiče:
public function createComponentFooGrid($name)
{
$grid = new DataGrid($this, $name);
}
Editoval Pavel Janda (25. 9. 2016 18:44)
- dusan.ivanco
- Člen | 4
Dobrý deň.
Pripájam sa ku kolegovi: https://forum.nette.org/…any-datagrid?p=11
Ten inline edit je vážne bomba, ale bez join-ov voľajako dosť ochudobnený.
Mimochodom, jedná sa o dibi
Ďakujem veľmi pekne.
Editoval dusan.ivanco (28. 9. 2016 6:56)
- Domki
- Člen | 310
Když mám inline editaci velkou, tak mi u formulářů funguje klasická
nette validace Filled, Integer…
Když přidám ale inline přidávání s validaci, tak se mi hadají inputy, a
ač editace je validni tak to háze hlášky.
Problém nejspíš bude že u obou je stejný název:
$container->addText(‚name‘, '')
Když ale u přidávaní změním název tak se inputy vůbec nevykreslí.
Jak toto opravit?
díky
Editoval Domki (28. 9. 2016 10:15)