Grido – DataGrid pro Nette

před 7 lety

o5
Člen | 417
+
+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)

před 7 lety

Felix
Nette Core | 989
+
0
-

Vypada to hezky. +1

před 7 lety

iguana007
Člen | 986
+
0
-

nice! :)

před 7 lety

uestla
Backer | 750
+
0
-

Vypadá moc pěkně.

před 7 lety

blacksun
Člen | 181
+
0
-

Tak to vypadá hodně luxusně. +2

před 7 lety

ajda2
Člen | 58
+
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ě.

před 7 lety

o5
Člen | 417
+
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)

před 7 lety

ajda2
Člen | 58
+
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.

před 7 lety

o5
Člen | 417
+
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.

před 7 lety

ajda2
Člen | 58
+
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?

před 7 lety

o5
Člen | 417
+
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)

před 7 lety

hrach
Člen | 1816
+
0
-

V Nette\Database nic takoveho fungovat nema.

před 7 lety

o5
Člen | 417
+
0
-

@hrach je mi to vazne jedno :)

před 7 lety

hrach
Člen | 1816
+
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.

před 7 lety

o5
Člen | 417
+
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)

před 7 lety

libja
Člen | 9
+
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.

před 7 lety

o5
Člen | 417
+
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)

před 7 lety

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

před 7 lety

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.

před 7 lety

pjoter
Člen | 119
+
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)

před 7 lety

o5
Člen | 417
+
0
-

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

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

před 7 lety

pjoter
Člen | 119
+
0
-

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

před 7 lety

o5
Člen | 417
+
0
-

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

před 7 lety

pjoter
Člen | 119
+
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)

před 7 lety

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 ?

před 7 lety

o5
Člen | 417
+
0
-

Pouzivejte prosim issues na githubu.

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

před 7 lety

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

před 7 lety

o5
Člen | 417
+
0
-

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

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

před 7 lety

Matúš Matula
Backer | 246
+
0
-

Ahoj,

planujes pridat podporu radenia podla viacerych stlpcov?

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

před 7 lety

David Matějka
Moderator | 6102
+
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

před 7 lety

roarbb
Člen | 30
+
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.

před 7 lety

o5
Člen | 417
+
0
-

@roarbb opraveno.

před 7 lety

roarbb
Člen | 30
+
0
-

Good Job, dakujem.

před 7 lety

roarbb
Člen | 30
+
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.

před 7 lety

o5
Člen | 417
+
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.

před 7 lety

roarbb
Člen | 30
+
0
-

dakujem za nasmerovanie ;)

před 7 lety

Ot@s
Backer | 478
+
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.

před 7 lety

o5
Člen | 417
+
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ě.

před 7 lety

Ot@s
Backer | 478
+
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.

před 7 lety

o5
Člen | 417
+
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 :)

před 7 lety

poulik
Člen | 1
+
0
-

Jak se nastaví šířka sloupce ?

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

před 7 lety

o5
Člen | 417
+
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)

před 7 lety

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!

před 7 lety

o5
Člen | 417
+
0
-

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

před 7 lety

Yaromil
Backer | 20
+
0
-

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

před 7 lety

akadlec
Člen | 1324
+
0
-

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

před 7 lety

akadlec
Člen | 1324
+
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?

před 7 lety

o5
Člen | 417
+
0
-

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

před 7 lety

akadlec
Člen | 1324
+
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 ;)

před 7 lety

o5
Člen | 417
+
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?