ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Pavel Janda
- Člen | 977
@Ivorius To by se mi líbilo! Pošleš PR? :D
Pokud nezvládneš PR, založil bys, prosím, issue?
- Ivorius
- Nette Blogger | 119
Jak mohu nechat při použití nette database table (selection) jako Datasource vypsat např. uživatele u objednávky? Myslel jsem, že bude fungovat něco jako u doctriny
<?php $grid->addColumnText('user', 'Uživatel', 'user.login'); ?>
Ale vyhazuje to Cannot read an undeclared column user.login z ActiveRow
Cizí klíč u tabulky orders je nad sloupcem user_id ⇒ tabulka users. Discovered reflection.
Editoval Ivorius (7. 12. 2016 21:17)
- Ivorius
- Nette Blogger | 119
Pavel Janda napsal(a):
@Ivorius http://ublaboo.org/…/data-source#…
To jsem zkoušel jako první, ale říkal jsem si že to je určené pro relaci has many, kdežto já chci jen has one (tedy objednávka má jen jednoho reg. uživatele (nebo mít taky nemusí).
$grid->addColumnText('user', 'Uživatel', ':users.login');
Každopádně výsledek je
No reference found for $orders->related(users)
Možná to nějak bude souviset s NDBT, třeba že do datasource předám jen Selection na tabulku orders?
Přidáno
Pokud zkusím
$grid->setDataSource($selection->select('orders.*,user.login AS login'));
tak funguje i
$grid->addColumnText('user', 'Uživatel', 'login');
ale nevím jestli je toto doporučený postup.
Editoval Ivorius (8. 12. 2016 10:01)
- Pavel Janda
- Člen | 977
@Ivorius Tohle mi přijde naprosto korektní:
$grid->setDataSource($selection->select('orders.*,user.login AS login'));
- sepo
- Člen | 69
Pavel Janda napsal(a):
Nová verze – v5.0.0
- Přibyla možnost zresetovat filtr jednoho sloupce přes malou ikonku v záhlaví cloupce
Ahoj
Toto sa na deme správa rozdielne pri gride na podstránke „overview“ a
inak pri gride podstránke „filter“.
Na „overview“ sa dá reset vykonať na konkrétnom stĺpci, pri „filter“
sa resetuje celý filter cez všetky stĺpce. Čím to je ?
- sepo
- Člen | 69
Pavel Janda napsal(a):
Nová verze – v5.0.0
- Přibyla možnost skrývat animovaně outer filter – collapsible filters
Ahoj
pri zmene hide/show sa nemení popis u button-u, chcelo by to meniť popis u button-u „Show filter“ / „Hide filter“ podľa stavu.
- exquis
- Člen | 83
Ahoj, řeším podobný problém s datagridem a doctrinou:
- Při filtrování např. dle description nic nevyfiltruje
- Při řazení dle sloupce vyhodí výjimku „Cannot use object of type Hi5\System\Log as array“
public function createComponentHistorieAkci()
{
$Grid = new DataGrid();
\DataGridTranslator::translate($Grid);
$Grid->setItemsPerPageList(self::GRID_ITEMS_PER_PAGE);
$Grid->setDataSource($this->EM->getRepository(Log::class)->findAll());
$Grid->setDefaultSort(["date" => "DESC"]);
$Grid->addExportCsv('Export do CSV', 'historie_akci.csv', 'windows-1250', ',');
$Grid->addColumnDateTime("date", "Datum")->setSortable()->getElementPrototype("th")->addAttributes(["width" => "120px"])->setFilterDate();
$Grid->addColumnText("description", "Popis")->setFilterText();
return $Grid;
}
dořešilo se to nějak posledně?
- Ivorius
- Nette Blogger | 119
Nevíte proč se mi nedaří zprovoznit autosubmit na filtrech? Koukám se do konzole a vždycky to při výběru ze selectu vyhodí tuto js error
Snažím se to rozchodit v rámci webpacku – konfigurace a tam zřejmě bude zakopaný pes. Nevěděl by někdo jak na to?
- iguana007
- Člen | 970
exquis napsal(a):
Ahoj, řeším podobný problém s datagridem a doctrinou:
…
dořešilo se to nějak posledně?
Zde je moje reseni, ktere funguje: https://forum.nette.org/…any-datagrid?p=13
- flamengo
- Člen | 135
@PavelJanda http://ublaboo.org/ nefunguje:
Server Error
We're sorry! The server encountered an internal error and was unable to complete
your request. Please try again later.
Potřeboval bych nahlédnout do dokumentace.
Třeba toto od mé poslední verze nefunguje:
$td = $tr->getElementPrototype('td')
->class('media-icon');
A určitě toho bude víc co jsem tak zběžne koukal.Předem díky.
Editoval flamengo (18. 12. 2016 17:11)
- Pavel Janda
- Člen | 977
@flamengo Na serveru došlo místo pro session. :P Fixed.
Editoval Pavel Janda (18. 12. 2016 18:51)
- Pavel Janda
- Člen | 977
@esorimer Ideální podporu pro tohle datagrid nemá. Ale pomocí custom šablon + JS bys měl asi kýženého efektu dosáhnout snadno. V šabloně si naházej data atributy (id) k inputům a tvoje tlačítko pak jenom triggeruje odeslání všech těchto dat na server. Uložíš a je to.
- radas
- Člen | 224
Ahoj,
používám verzi 5.0.1. A nedaří se mi nastavit třídu do jednotlivých
buněk. Třída se zkrátka nepřidá.
$grid->addColumnText(...)
->getElementPrototype('td')
->addAttributes(['class' => 'danger']);
Ani podmíněně:
$grid->addColumnCallback('title', function($column, $item)
{
if (strlen($item->offsetGet('title')) === 0)
$column->addAttributes(['class' => 'danger']);
});
A dále mě trápí ještě jedna věc ohledně filtrování. Nevím, jestli dělám něco špatně. Problém je v tom, že chci filtrovat podle sloupce, který má nastaven alias.
$grid->addColumnText('item_default', 'Položka')
->setSortable()
->setFilterText();
Po odeslání filtru dojde k chybě „Unknown column ‚item_default‘ in ‚where clause‘“. Přitom třeba sortování funguje nad takovým sloupcem bez problému. Vím, že to je záležitost MySQL. Ale dá se to nějak v datagridu nastavit?
SELECT `id`, `item_cs` AS `item_default`
FROM `tree_multilang`
WHERE (`item_default` LIKE '%nehody%' COLLATE utf8_general_ci)
ORDER BY `id` ASC
Díky moc.
- igor.pocta
- Člen | 100
Ahoj,
měl bych několik otázek:
- Podporuje datagrid alternativní identifikátor? Např. Ramsey\Uuid\DegradedUuid
- Pokud ano, tak jak ho správně nastavit? Můj případ je následující:
Mám tabulku se stránkami, chci si vypsat grid se seznamem článků (např. sloupce Id a title). Nezobrazí to žádný (v patičce mám Items: 0 – 0 from 20 a v těle mi to píše No items found.)… Když se podívám na SQL debugger, vidím, že to vytváří následující dotaz:
SELECT p0_.id AS id_0, p0_.title AS title_1, ... FROM page p0_ WHERE p0_.id IN (Ramsey\Uuid\DegradedUuid, Ramsey\Uuid\DegradedUuid) ORDER BY p0_.id ASC
Když to zaměním za standardní ID, tak to v tomhle stavu funguje. Už jsem na to narazil a raději to přepsal :)
- Naběhne mi stránka, pak se spustí nějaký ajaxový request na pozadí. Kdyý se dokončí, přepíše mi mojí URL adresu /page/show/(UUID) na /page/show/(NIC) a např. obnovení stránku skončí chybou, protože mu chybí vstupní parametr. Netušíte proč?
Mé nastavení gridu:
/** @var QueryBuilder $qb */
$qb = $this->_em->getRepository(Page::class)->createQueryBuilder('pr');
/** @var DataGrid */
$grid = new DataGrid($this, $name);
$grid->setTranslator($this->translator);
$grid->setDataSource($qb);
$grid->setColumnsHideable();
$p = $this;
// ID
$grid->addColumnText('id', 'pages.id')
->setAlign('center')
->setDefaultHide()
->addAttributes(["width" => "8%"]);
$grid->addColumnText('title', 'pages.title');
return $grid;
}
Díky za nápady
- Pavel Janda
- Člen | 977
@Klobasa Ano, viz http://ublaboo.org/datagrid/
Buď lze vypnout stránkování úplně
($grid->setPagination(FALSE);
), nebo nastavit
napevno: $grid->setItemsPerPageList([2000]);
- Pavel Janda
- Člen | 977
@Člověk Super nápad. Založíš issue na githubu? Do issue klidně sypej jakékoliv nápady k tomu datasource. Samozřejmě PR by byl nejlepší! :)
- iNviNho
- Člen | 352
Ahojte,
Ako som updatoval datagrid na dev-master nedokážem rozchodiť aby mi do td elementov tabuľky dopisovalo nasledovne atributy:
<?php
$grid->addColumnDateTime("parameter.odoslaneBaTo", "v PHA")
->getElementPrototype("td")
->addAttributes([
"data-editable" => "true",
"data-type" => "odoslaneBaTo"
]);
?>
Po dumpe:
Ublaboo\DataGrid\Column\ColumnDateTime #0586
align protected => "right" (5)
format protected => "j. n. Y" (7)
replacements protected => array ()
renderer protected => NULL
template protected => NULL
sortable protected => FALSE
translatable_header protected => TRUE
sortable_reset_pagination protected => FALSE
sortable_callback protected => NULL
sort protected => NULL
template_escaping protected => TRUE
header_escaping protected => FALSE
template_variables protected => array ()
editable_callback protected => NULL
editable_element protected => array (2)
0 => "textarea" (8)
1 => array (1)
class => "form-control" (12)
default_hide protected => FALSE
key protected => "parameter.odoslaneBaTo" (22)
name protected => "v PHA" (5)
grid protected => Ublaboo\DataGrid\DataGrid #24a7
column protected => "parameter.odoslaneBaTo" (22)
A výsledný element má iba
class="text-right col-parameter.prisloBa2"
Vôbec nerozumiem :-\
Skúsil som obnovu zo zálohy na staršiu verziu datagridu a už mi to opäť funguje :-\ Je možné v zistiť akú mám aktuálnu verziu? V composery je len dev-master ale to bolo pár mesiacov dozadu :-\
Editoval iNviNho (5. 1. 2017 16:28)
- thirdknown
- Člen | 26
Používám jako dataSource doctrine query builder.
<?php
$qb = $em->getRepository(Task::class)->createQueryBuilder(Task:class);
$grid->setDataSource($qb);
?>
Entitou zde je Task. Každý Task má „řešitele“ $worker:
<?php
/**
* @ManyToOne(targetEntity="App\Sign\Model\Actor")
* @JoinColumn(name="worker", referencedColumnName="id")
*/
public $worker;
?>
V gridu zobrazuji první jméno „řešitele“. To jde.
Ale už nejde filtrování:
<?php
$grid->addColumnText('worker_name', 'Řešitel', 'worker.firstName');
$grid->addFilterText('worker_name', 'Řešitel', 'worker.firstName');
?>
Pro filtrování dostávám:
Doctrine\ORM\Query\QueryException
[Semantical Error] line 0, col 63 near ‚worker.firstName‘: Error:
‚worker‘ is not defined.
apod.
Hledal jsem, co dělám špatně, zkoušel jsem různé kompinace addFilterText(), bohužel jsem na nic nepřišel.
Můžu poprosit o pomoc, co je špatně? Díky.
- flamengo
- Člen | 135
@PavelJanda Kód z dokumentace:
$th = $grid->addColumnText('name', 'Name')
->getElementPrototype('td'); // Or element element <th> via Column::getElementPrototype('th')
$th->data('foo', 'bar');
$th->class('super-column')
$grid->addColumnText('name', 'Name')
->addAttributes(['class' => 'text-center']);
nefunguje :( Dle composer.json „ublaboo/datagrid“: „^5.0“
Přidávat css třídy buňkám v tabulce je pro mne opravdu základní funkce, bez toho je pro mne bohužel grid nepoužitelný a musím se vrátit na starou verzi, co jsem měl upravenou.
A jak multisort? někde jsem četl, že to bylo dodáno do verze 5, ale také mi to nefunguje.
$grid->setMultiSortEnabled($enabled = TRUE);
$grid->setDefaultSort(['name' => 'ASC', 'id' => 'ASC']);
Nebo najde někde v dokumentaci popis jak nastavit?
Kdyžtak předem díky.
Editoval flamengo (7. 1. 2017 15:25)
- Pavel Janda
- Člen | 977
@iNviNho @flamengo Atributy a elementy th/td jsou fixnuté zatím v neotagované verzi, ještě dnes otestuji a releasnu.
@flamengo Co znamená, že nefunguje? Máš aktuální assety?
- Pavel Janda
- Člen | 977
@sevca79 Momentálně to neumí. Musela by zvolit jiná JS knihovna a přidat FitlerDateTime.
Právě z toho důvodu teď vymýšlím způsob, jak nechat uživatele používat vlastní třídy filtrů (tím pádem vlastní JS knihovny, vlastní filtrování). Nějaká geniální nápad? :)
- Pavel Janda
- Člen | 977
@Twinity Jo
Edit: :D DataGrid::allowRowsAction()
, pohledám link do docu
Edit2: http://ublaboo.org/datagrid/row#…
Editoval Pavel Janda (13. 1. 2017 15:21)
- igor.pocta
- Člen | 100
Funguje správně přidání atributů?
Mám nastaveno tohle a nikam se ta šířka nepropsala :/
$dataGrid->addColumnText('title', 'grid.title')
->addAttributes(["width" => "8%"])
->setFilterText('title')
->setCondition(function ($qb, $value) {
/** @var QueryBuilder $qb */
$qb->andWhere($qb->expr()->like('tr.title', $qb->expr()->literal('%' . $value . '%')));
});
- Pavel Janda
- Člen | 977
@igor.pocta V nějnovějším tagu je to fixnuté. Nechceš to napsat spíš takto?
->addAttributes(["style" => "width: 8%;"])
Editoval Pavel Janda (14. 1. 2017 12:27)
- igor.pocta
- Člen | 100
Pavel Janda napsal(a):
@igor.pocta V nějnovějším tagu je to fixnuté. Nechceš to napsat spíš takto?
->addAttributes(["style" => "width: 8%;"])
Paráda, díky moc :)
- Pavel Janda
- Člen | 977
@chap Myslíš již od někoho napsané? Já můžu poskytnout CS překlady. EN je by default. DE by se dala udělat. Super nápad, přidám jich pár na web.
- flamengo
- Člen | 135
@PavelJanda Tak jsem prubnul verzi 5.0.6, bohužel zase něco nefunguje, nebo prostě něco dělám špatně :(
- Paginator nekouká na filtr, takže při aktivním filtru zobrazuje neaktuální stránkování. Vlastně se stránkování vůbec nezmění a to ani, když dám v prohlížeči F5.
- Po filtrování nefunguje reload?
V tabulce mám tlačítko aktivní/neaktivní. Po kliknutí na fajfku/křížek se změní stav třeba článku. Poté dojde na reload ceného gridu. Normálně to funguje. Jakmile ale použiji filtr, tak se po změně grid znova nenačte, nechápu.
public function handleEnabled($id)
{
$this->model->enable($id);
$this->flashMessage('blablabla', 'info');
if($this->isAjax()){
$this->redrawControl('flashes');
$this->getComponent('grid')->reload();
}
else{
$this->redirect('this');
}
}
Předem díky za reakci.
- Pavel Janda
- Člen | 977
@flamengo Vypadá to, že máš rozbitý celý JavaScript. Bohužel v tomhle směru nevím, kde hledat příčinu. Zkus odebrat všechny JS knihovny a pak postupně přidávat..
- sevca79
- Člen | 55
ahoj,
jak prosím vyřešit to, když používám jako datasource
NetteDatabaseDataSource a v dotazu používám GROUP
BY, tak mi to poté v paginatoru vyhazuje nesmyslný celkový počet
položek.
Resp. ten SELECT count(*), který se poté pošle do paginatoru je
víceřádkový (kvůli tomu GROUP BY) a vrací mi to první řádek z toho
jak prosím docílit toho aby to zobrazovalo správně
prostě když teď mám něco jako
...
$query = "SELECT * FROM login_log GROUP BY username";
$datasource= new \Ublaboo\NetteDatabaseDataSource\NetteDatabaseDataSource($this->database, $query);
$grid->setDataSource($datasource);
...
tak mi paginator zobrazuje něco jako Položek: 0 – 7 z 3
předem děkuji za radu ;)
- sevca79
- Člen | 55
@CZechBoY To mě taky napadlo..tohle byl jen jednoduchej příklad pro
představu a možnost úpravy paginatoru..Možná mi poradíš jak zefektnivnit
db dotaz, i když to nepatří do týhle diskuse..není to úplně přesně to
co mám, ale taky zjednodušeně
mám tabulku uživatelů, organizací a vztahovou tabulku mezi nimi např
users(id, username) , organizations(id, name) , users_organizations_relationships(user_id, organization_id)
,
kdy každý uživatel může být ve vztahu s více organizacemi
a chci zobrazit seznam uživatelů a na každým řádku mít i seznam
organizací..ve výsledku aby mi to vracelo něco jako
users.id | users.username | org1,org2,org3
což sem řešil přes dotaz
SELECT users.id, users.username, GROUP_CONCAT(organizations.name) FROM users
LEFT JOIN users_organizations_relationships ON users_organizations_relationships.user_id=users.id
LEFT JOIN organizations ON organizations.id=users_organizations_relationships.organization_id
GROUP BY users.id
což u tohoto grupování mi to vrací ten nepěkný count(*) do paginatoru..
nejsem moc zběhlý ani v sql, takže možná na ten výpis jdu přes špatnej dotaz a půjde se na to dotázat jistě i jinak
dík za rady ;)