Grido – DataGrid pro Nette

o5
Člen | 416
+
+3
-

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)

Felix
Nette Core | 1183
+
0
-

Vypada to hezky. +1

iguana007
Člen | 970
+
0
-

nice! :)

uestla
Backer | 796
+
0
-

Vypadá moc pěkně.

blacksun
Člen | 177
+
0
-

Tak to vypadá hodně luxusně. +2

ajda2
Člen | 66
+
0
-

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
+
0
-

@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)

ajda2
Člen | 66
+
0
-

@o5
Stáhl jsem aktuální verzi a pořád to nefunguje – Tvůj live příklad je funkční. Jen když použiji normální SQL databázi, tak to nefunguje.
Zkoušel si si dotaz v normálním SQL, místo sqlite? Když v dotazu odstraním hranaté závorky, tak se provede.

o5
Člen | 416
+
0
-

@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.

ajda2
Člen | 66
+
0
-

@o5
Díky, tuhle metodu sem přehlídl :)
Po úpravě je to funkční.
Hranaté závorky se přidají i při SQLite, ale tam to projde.
Nepřidají se tam při parsování názvu sloupce z URL?

o5
Člen | 416
+
0
-

@ajda2 Ty hranate zavorky se tam pridavaji schvalne na vice mistech, mam to zazite z dibi. V Nette Database by to IMHO melo mohlo fungovat taky, takze asi bug.

Editoval o5 (29. 12. 2012 20:04)

hrach
Člen | 1834
+
0
-

V Nette\Database nic takoveho fungovat nema.

o5
Člen | 416
+
0
-

@hrach je mi to vazne jedno :)

hrach
Člen | 1834
+
0
-

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.

o5
Člen | 416
+
0
-

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)

libja
Člen | 8
+
0
-

Úžasné :-), první datagrid, který jsem zprovoznil do 15 min a nastavil na pár řádkách.
Našel jsem vše, co potřebuji. Přehledná dokumentace, velká možnost úprav.
Ve volbě datagridu už mám jasno :-).
Moc moc děkuji. :-)
Bylo by nějaké donate, rád bych poděkoval i nějakou korunou.

o5
Člen | 416
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

o5
Člen | 416
+
0
-

Jestli si na to neprisel, tak ta tvoje fce showDialog() musi vracet true nebo false :)

Editoval o5 (17. 1. 2013 21:55)

pjoter
Člen | 118
+
0
-

pokud nahradim form.submit() , return true; tak to mi nepomuze :(

o5
Člen | 416
+
0
-

A co to dela nebo nedela? Takto to asi tezko vyresime.. Proc si tam pridaval preventDefault()? Neni tam potreba, viz puvodni

pjoter
Člen | 118
+
0
-

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
+
0
-

Pokud nemá ani jeden sloupec filter tak potom Grido zahlásí chybu že nezná proměnou Filters.
Pokud nejsou nastavené žádné operace a chci změnit počet záznamů na stránku tak hlásí Component with name ‚operations‘ does not exist .

Má tyto problémy ještě někdo ?

o5
Člen | 416
+
0
-

Pouzivejte prosim issues na githubu.

@czhDavid: muzes nekam hodit definici gridu? (tj funkci createComponentGrid())

czhDavid
Člen | 14
+
0
-
<?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á.

o5
Člen | 416
+
0
-

Dva opravdu hloupé bugy, díky za report. Mělo by to být nyní opraveno.

Editoval o5 (23. 1. 2013 14:39)

Matúš Matula
Člen | 256
+
0
-

Ahoj,

planujes pridat podporu radenia podla viacerych stlpcov?

Editoval Matúš Matula (28. 1. 2013 4:02)

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

Mam otazku, neviem ci je to bug alebo moja chyba.

Mam v databaze typ enum(‚1‘,‚0‘)
Ak si do grida pridam tento stlpec ako text alebo aj ako Filter::TYPE_SELECT nedari sa mi filtrovat podla hodnoty 0, pri hodnote 1 je to OK.

Stretol sa s tym niekto?

Dakujem za info.

o5
Člen | 416
+
0
-

@roarbb opraveno.

roarbb
Člen | 29
+
0
-

Good Job, dakujem.

roarbb
Člen | 29
+
0
-

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
+
0
-

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.

roarbb
Člen | 29
+
0
-

dakujem za nasmerovanie ;)

Ot@s
Backer | 476
+
0
-

Možná se jedná o moji nepozornost, ale grid nepodporuje něco jako addToolbarButton (tj. globální tlačítka k tabulce)? Díky za info.

o5
Člen | 416
+
0
-

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ě.

Ot@s
Backer | 476
+
0
-

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
+
0
-

To „jednotné místo“ si právě neumím představit. Pokud máš chuť se pak podělit ⇒ fork ⇒ rád se na to podívám a pokud to bude pěkné, klidně zmerguju :)

poulik
Člen | 1
+
0
-

Jak se nastaví šířka sloupce ?

Editoval poulik (16. 2. 2013 22:43)

o5
Člen | 416
+
0
-

poulik napsal(a):

Jde nastavit šířku sloupce ?

Jde:

  1. pomocí css…každé hlavičce sloupce se generuje unikání css třída (grid-header-<column_name>)
  2. pomocí fce getHeaderPrototype() viz dokumentace
$column->headerPrototype->style = 'width: xxx';

Editoval o5 (16. 2. 2013 22:53)

Yaromil
Backer | 20
+
0
-

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:

  1. Aktivní (pro každou buňku sloupce např. odkaz na handler active($id))
  2. Město (zde např. odkaz na presenter Town:detail, $id_town)
  3. Jméno
  4. Příjmení
  5. 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!

o5
Člen | 416
+
0
-

@Yaromil: $column->setCustomRender() podobne jako je to v prikladu??

Yaromil
Backer | 20
+
0
-

@o5: tak to je fantazie!, mockrát děkuji za pomoc

akadlec
Člen | 1326
+
0
-

Nezkoušel někdo z vás ten grid donutit makat s doctrine?

akadlec
Člen | 1326
+
0
-

No takže se mě podařilo ten grid naučit používat doctrine, ale teď zápasím s filtry a sortováním. Potřebuju tomu sloupci přidat alias, taky hlavně pro případ spojení dvou a více tabulke. Řek bych že tady toto neni dořešené nebo jo?

o5
Člen | 416
+
0
-

Tento fork umi Doctrine. V dohledne dobe planuji zmergovat do mastera.

akadlec
Člen | 1326
+
0
-

díky za tip, perfektní prácička. Drobátko jsem si to musel potunit včetně JS ale zatím šlape jak potřebuji ;)

o5
Člen | 416
+
0
-

akadlec napsal(a):

Drobátko jsem si to musel potunit včetně JS ale zatím šlape jak potřebuji ;)

Děkuju za důležitou informaci, že sis to „musel potunit“ :)) Ne vážně, je to tak těžké udělat fork?