Grido – DataGrid pro Nette
- o5
- Člen | 416
V čem se Grido liší od ostatních? Unikátní vlastnosti:
- Grido není pouze další datagrid co vykreslí tabulku a vše ostatní si lepíte sami
- Žádný jiný datagrid NEMÁ kompletní pokrytí unit testy
- Datasources: Nette Database, Dibi, Doctrine, ArraySource
- Exportování vyfiltrovaných dat
- Hromada Client-side features
Odkazy:
Demo:
Zkus si pohrát s demem u sebe na localhostu než se zde zeptáš. Instalace je otázka jednoho příkazu!
composer create-project o5/grido-examples
Editoval o5 (16. 10. 2019 23:41)
- ajda2
- Člen | 66
Dobrý den,
předem děkuji autorovi za tento data grid, je vynikající.
Nicméně jsem narazil na problém při filtrování dat při použití Nette
Database. Název sloupce se obalí do hranatých závorek a způsobí to
chybný dotaz.
Můj konkrétní případ vypadá takto:
<?php
SELECT *
FROM `registered_mail`
WHERE (([email] LIKE ? ))
ORDER BY `id`
?>
Zkoušel jsem chybu najít, ale nenašel. Název sloupce se pošle správně.
- o5
- Člen | 416
@ajda2
Divny, zkousel jsem to na prikladu co je na webu a funguje mi to.
SELECT [id], [firstname], [surname], [gender], [birthday], [cctype], [emailaddress]
FROM [user]
WHERE (([firstname] LIKE ? ))
LIMIT 20
To zkus taky na prikladu co mam jako live demo, melo by stacit
$grid->setModel($this->context->db->table('user'));
a odebrat definici pro sloupec country.
Editoval o5 (29. 12. 2012 14:47)
- o5
- Člen | 416
@ajda2
Tak priznam se, ze Grido jsem tedy v jine nez sqlite db nezkousel, protoze jsem
tak nejak predpokladal, ze nekompatibility za me vyresi db vrstva typu
dibi/nette database. Ono jestli zminene neni dokonce bug v nejakem Nette
Database mysql driveru? :)
Pri filtrovani se tam skutecne pridavaji hranate zavorky, zkus nahradit metodu v Grido/DataSources/NetteDatabase.php timto
private function removePlaceholders(array $condition)
{
$condition[0] = trim(str_replace(array('%s', '%i', '%f'), '?', $condition[0]));
return array(str_replace(array('[', ']'), array('`', '`'), $condition[0]) => $condition[1]);
}
Behem zitrka to pak vyzkousim v ostatnich db.
- o5
- Člen | 416
hrach napsal(a):
Wow, tak to je vazne dobrej feedback pro uzivatele, ze autorovi doplnku je jedno, ze ho ma zabugovanej. Nehlede na to, ze tu roznasis bludy.
Klidek :) Ta reakce samozrejme byla na to, jestli to ma v Nette Database fungovat nebo ne.
Editoval o5 (31. 12. 2012 15:38)
- o5
- Člen | 416
libja napsal(a):
Bylo by nějaké donate, rád bych poděkoval i nějakou korunou.
EDIT: Kdo by rád poděkoval, tak na stránkách projektu lze vpravo nahoře najít odkaz na PayPal.
Editoval o5 (5. 1. 2015 14:24)
- zn30
- Člen | 3
Parádní grid!
Narazil jsem jen na jednu věc v souvislosti s využítím PostgreSQL přes
Nette/Database.
Musel jsem upravit funkci v Grido/DataSources/NetteDatabase.php aby fungovalo
filtrování.
private function removePlaceholders(array $condition)
{
$condition[0] = trim(str_replace(array('%s', '%i', '%f'), '?', $condition[0]));
return array(str_replace(array('[', ']'), array('"', '"'), $condition[0]) => $condition[1]);
}
Při nahrazení ‚[‘ za ‚`‘ PostgreSQL vrací chybu ‚No operator matches the given name and argument type(s). You might need to add explicit type casts.‘
Závorky se taky v této funkci dají odstranit úplně. Pak to funguje v MySQL i PostgreSQL. Problém může nastat u některých názvů tabulek. (Třeba v postgre, když název tabulky začíná číslem).
- zn30
- Člen | 3
Trochu jsem to testoval. Nejlepší řešení mi přijde závorky úplně odstranit. Je to univerzální a pokud už někdo použije název tabulky, který je potřeba nějak ‚escapovat‘ je to spíš vyjímka. Nezachrání to ani Nette/Database. Testoval jsem postgre s tabulkou ‚123_test‘. Musel jsem psát
.. ->database->table('"123_test"') ..
jinak jsem dostával chybu.
- pjoter
- Člen | 118
Zdarec,
nejprve bych chtěl poděkovat za výborný grid. Seznamujeme se a potřeboval bych trochu popostrčit. Řeším vlastní confirm dialogy (konkrétně bootstrap), chcu se optat – u akci pro jednotlivy radek je to easy preventnu default a tlacitku v dialogu pridam href akce.
Jak je to ale u hromadne akce?
Zkousim neco takoveho ale bez sance.
<script>
...
onSubmit: function(e)
{
var itemsCount = $($.grido.operations.selector + ':checked', $.grido.$element).length,
hasConfirm = $.grido.operations.getSelect().attr(
'data-grido-' + $.grido.operations.getSelect().val()
);
if(hasConfirm)
{
e.preventDefault();
}
return hasConfirm
? showDialog(hasConfirm.replace(/%i/g, itemsCount),0,$(this).parent('form'))
: true;
},
...
function showDialog(message,href,form)
{
$('#formConfirmModal .modal-body').html('<p>' + message + '</p>');
$('#formConfirmModal').modal('show');
if(href) {
$('#formConfirmModal .modal-footer a.yes').attr('href',href);
}
else {
$('#formConfirmModal .modal-footer a.yes').on('click',function() { form.submit(); });
}
}
</script>
Predem diky za tipy.
Editoval pjoter (17. 1. 2013 19:01)
- pjoter
- Člen | 118
tak at zkousim jak zkousim kdyz mi vyskoci dialog pro hromadny confirm po stisku tlacitka ano (.yes) se nic nestane. Potreboval bych redirect na handler tak jako to fungovalo po kliknuti na OK v dialogu vyvolanem funkci confirm
kdyz tam neni prevent default tak se to po submit rovnou presmeruje na handler neceka az kliknu na yes
Editoval pjoter (19. 1. 2013 16:36)
- czhDavid
- Člen | 14
<?php
protected function createComponentGrid($name){
$grid = new Grido\Grid($this, $name);
$grid->setModel($this->context->archiv->getPrehled());
$grid->addColumn('a', 'A')->setSortable();
$grid->addColumn('b', 'B')->setSortable();
$grid->addAction('detail', 'Detail')
->setIcon('pencil');
}
?>
nakonec jsem to vyřešil prostě tak že jsem tam přidal filtry a prázné pole operations
<?php
$operations = array();
$grid->setOperations($operations, callback($this, 'gridOperationsHandler'));
?>
Pak už vše funguje jak má.
- Matúš Matula
- Člen | 257
Ahoj,
planujes pridat podporu radenia podla viacerych stlpcov?
Editoval Matúš Matula (28. 1. 2013 4:02)
- David Matějka
- Moderator | 6445
tak jsem si hral a upravil Grido k obrazu svemu :) az bude cas na doladeni,
tak to asi i zverejnim…
Co jsem upravil/predelal/pridal:
- psr0 kompatibilni struktura
- ve filtrech prepsany skladani filtru (uz ne jako retezec, ale jako objekty a datasource si to sestavi sam)
- doctrine datasource
- upraveny exporty – co export to jedna trida, takze neni potreba dedit atd.
- razeni dle vice sloupcu
- pro datum novy filtr datarange (od – do)
- sumarizace – treba nad sloupeckem ‚cena‘ zapnu sumarizaci a dole pod tabulkou vyjede tabulka se souctem hodnot :)
Co jeste zbyva
- zatim jsem zrusil nejaky vlastnosti – vlastni filtry nebo co to tam bylo :)
- datasource pro nette\database a dibi
- roarbb
- Člen | 29
Mam este otazku :)
V databaze mam stlpec, typ datetime(2012–11–06 16:20:13).
Ako sa da aplikovat na tento stlpec filter?
Skusal som:
<?php
$grid->addColumn($columnRow->name, $columnName, Column::TYPE_DATE)->setDateFormat(Date::FORMAT_DATETIME);
$grid->addFilter($columnRow->name, $columnName, Filter::TYPE_DATE);
?>
Ako mam spravne filtrovat podla datetime? Da sa to vobec?
Dakujem.
- o5
- Člen | 416
S Filter::TYPE_DATE nejsem moc spokojen, každopádně filtrovat se samozřejmě nechá podle všeho, použij $filter->setCondition() . Dokonce filtování s datem najdeš v příkladu.
- Ot@s
- Backer | 476
o5 napsal(a):
Neumí a ani v dohledné době umět nebude. Přijde mi to jako individuální věc, kterou si lidi řeší sami různě.
S tou individuálností nesouhlasím. Z hlediska ergonomie by to mělo mít jednotné místo (tj. součást gridu), navíc si tím člověk zbytečně přidává kód do latte šablony, atd… Nevermind, urobím si to po svým. Díky za info.
- o5
- Člen | 416
poulik napsal(a):
Jde nastavit šířku sloupce ?
Jde:
- pomocí css…každé hlavičce sloupce se generuje unikání css třída (grid-header-<column_name>)
- pomocí fce getHeaderPrototype() viz dokumentace
$column->headerPrototype->style = 'width: xxx';
Editoval o5 (16. 2. 2013 22:53)
- Yaromil
- Backer | 20
Rád bych také poděkoval za skvělý doplněk! Umí víceméně vše co potřebuji, chybí mi však jedna pro mě zásadní funkcionalita a to, aby se odkaz na presenter/akci dal navěsit na jakýkoliv sloupec.
Budu mít např. následující tabulku se sloupci:
- Aktivní (pro každou buňku sloupce např. odkaz na handler active($id))
- Město (zde např. odkaz na presenter Town:detail, $id_town)
- Jméno
- Příjmení
- Akce (klasické akce edit, delete)
Napadlo mě upravit \Grido\Columns\Href, ale díky následné redundanci s funkcemi \Grido\Actions\Href mi to nepřijde jako dobré řešení…
Bylo by nějaké doporučení, jak toto řešit elegantně?
Ještě jednou díky!