Fork me on GitHub

Grido

DataGrid for Nette Framework!

Download this project as a .zip file Download this project as a tar.gz file

Grido je komponenta usnadňující výpis dat, jejich formátování, řazení, stránkování, filtrování, hromadné akce a export dat. Při návrhu byl kladen důraz na jednoduché použití a přizpůsobení.

Instalace

Komponentu si stáhněte a rozbalte do projektu, nebo nainstalujte pomocí nástroje Composer.

composer require o5/grido

Použití

Grido vytvoříme továrničkou na komponenty, nastavíme model. Grido aktuálně podporuje tyto datasources: Nette Database, Dibi, Doctrine a Array.

protected function createComponentGrid($name)
{
    $grid = new Grido\Grid($this, $name);
    $grid->setModel(array(
        array('name' => 'Lucie', 'gender' => 'female'),
        array('name' => 'Petra', 'gender' => 'female'),
        array('name' => 'Lenka', 'gender' => 'female'),
    ));
}

Settery gridu

Metoda Popis Příklad parametru / Výchozí
setModel model implementující rozhraní IDataSource nebo DibiFluent, Nette\Database\Table\Selection, Doctrine\ORM\QueryBuilder, Array
setDefaultFilter výchozí filtrování
setDefaultSort výchozí řazení př.: array('column_name' ⇒ 'ASC')
setDefaultPerPage počet vykreslených položek na stranu 20
setPerPageList položky selectu "počet řádků na stranu" array(10, 20, 30, 50, 100)
setTranslator vlastní translátor FileTranslator
setFilterRenderType nastaví vnitřní (Filter::RENDER_INNER) nebo vnější (Filter::RENDER_OUTER) vykreslení filtrů vniřní, ale pokud grid obsahuje filtr, který nemá svůj sloupec, použije se vnejší vykreslení (stejně tak, když filtr nemá definovanou akci)
setPaginator vlastní stránkovač
setPrimaryKey primární klíč, který identifikuje řádek "id"
setTemplateFile název šablony Grid.latte
setRememberState ukládání stavu gridu do session FALSE
setRowCallback callback volaný při vykreslení řádku tabulky. Callback vrací tr Html element function($row, Html $tr)
{return $tr}
setEditableColumns nastaví všechny sloupce editovatelné pomocí inline editace. Volitelný callback na funkci, která se postará o práci se změněnými daty. function($id, $newValue, $oldValue, $column) {}
{return (bool) $success}

Gettery gridu

Metoda Popis
getCount vrátí celkový počet výsledků
getColumn vrátí sloupec
getFilter vrátí filtr
getAction vrátí akci
getOperation vrátí operace
getFilterValue aktuální hodnota filtru
getTranslator vrátí translátor (výchozí FileTranslator, př.:$grid->translator->setLang('cs');)
getRememberSession vhodné např. pro nastavení expirace session
getModel vhodné např. pro nastavení vlastní metody modelu

Vlastní metody modelu

Pokud potřebujeme změnit některou z modelových metod, lze místo dědění využít callback.

//reimplementace metody getCount()
$grid->model->callback['getCount'] = function($model) {
    $fluent = clone $model->fluent;
    return $fluent->removeClause('SELECT')->select('COUNT(*)')->fetchSingle();
};

//je samozřejmě možné "přetěžovat" všechny metody modelu,
//přičemž argumenty volané z gridu jsou předány jako pole v druhém parametru
$grid->model->callback['limit'] = function($model, $args) {
    $offset = $args[0];
    $limit = $args[1];
    //...
};

Události gridu

Událost Popis Příklad
onRender událost volající se při vykreslování gridu function (Grid $grid)
onFetchData událost umožnující modifikovat data těsně před předání šabloně function (Grid $grid)
{return $grid->data}

Sloupce

$grid->addColumnText('email', 'E-mail');

První parametr reprezentuje název sloupce v datasource, následuje popisek.

Typy

Metoda Popis Info
addColumnText surový text
addColumnEmail naformátuje výstup na klikací mail
addColumnHref naformátuje výstup na klikací odkaz
addColumnDate naformátuje výstup na datum formát lze měnit pomocí setDateFormat().
Existující formáty: Date::FORMAT_DATE, Date::FORMAT_DATETIME, Date::FORMAT_TEXT
addColumnNumber naformátuje výstup na číslo formát lze měnit pomocí parametrů `$decimals`, `$decPoint`, `$thousandsSep`

Settery

Metoda Popis Příklad parametru
setSortable povolí řazení sloupce
setReplacement nastaví masku pro nahrazování array('published' ⇒ 'ok')
setColumn namapuje na sloupec v db, lze použít callback function($item)
{return $item->country->title}
setFilter zkratka pro vytvoření filtru stejného názvu
setDefaultSort výchozí řazení 'ASC'
setCustomRender callback pro vlastní vykreslení function($item)
{return $item->mail}
setTruncate ořízne výstup, parametry jako pro Strings::trun­cate()
setEditable nastaví sloupec jako editovatelný pomocí inline editace. $editableCallback
$control
setEditableControl nastaví pro sloupec vlastní Nette\Forms\IControl $control
setEditableCallback nastaví vlastní callback pro práci se změněnými daty function($id, $newValue, $oldValue, $column) {}
{return (bool) $success}
setEditableValueCallback nastaví callback pro hodnotu sloupce function($row, $column) {}
disableEditable znemožní inline editaci na daném sloupci

Gettery

Metoda Popis
getCellPrototype umožní nastavit např. vlastní css třídu buňce
getHeaderPrototype umožní nastavit např. vlastní css třídu hlavičky sloupce
getEditableControl vrátí Nette\Forms\IControl používaný pro inline editaci

Filtry

$grid->addFilterText('bir­thday', 'Birthday');

První parametr reprezentuje název sloupce v datasource, následuje popisek.

Typy

Metoda Popis Info
addFilterText surový text metoda setSuggestion() povolí našeptávání zohleďnující aktuální filtr, parametrem lze uvést sloupec zdroje. Další metody upravující chování našeptávače jsou uvedené v API zde.
addFilterDate hledání dle data
addFilterDateRange hledání dle datového rozsahu
addFilterCheck checkbox filtr
addFilterSelect selectbox filtr položky výběru se nastavují parametrem č.3
addFilterNumber číselný typ

Settery

Metoda Popis Příklad parametru
setColumn namapuje na sloupec v db, lze filtrovat pomocí více sloupců 'date', 'OR'
setCondition vlastní sql podmínka, příklady níže
setFormatValue formátování hodnoty při sestavování sql podmínky '%value%'
setDefaultValue výchozí hodnota

Vlastní podmínky

//pouze operátor
$grid->addFilterCheck('male', 'Only male')
    ->setCondition('<> ?');

//výčet hodnot a přiřazení celé podmínky
$list = array('' ⇒ '', 'publihed' ⇒ 'Published', 'deleted' ⇒ 'Deleted');
$grid->addFilterSelect('status', 'Status', $list)
    ->setCondition(array(
        'publihed' ⇒ array('status',  '<> ?', 'deleted'),
        'deleted' ⇒ array('status',  '= ?', 'deleted')
));

//callback
$grid->addFilterCheck('male', 'Only male')
    ->setWhere(function($value, \Nette\Database\Table\Selection $connection) {
        $value
            ? $connection->where('column = ?' , 'male')
            : NULL;
});

Gettery

Metoda Popis
getWrapperPrototype umožní nastavit např. vlastní css třídu elementu

Akce

$grid->addActionHref('edit', 'Edit');

První parametr je název akce, následuje popisek.

Typy

Metoda Popis Info
addActionHref vygeneruje odkaz na action / handle Parametry jsou $destination a $args které se předají metodě $presenter->link(), pokud se nenastaví, jako $destination se použije první parametr.
addActionEvent vygeneruje odkaz na vlastní callback callback je potřeba uvést ve třetím parametru

Settery

Metoda Popis Příklad parametru
setPrimaryKey nastaví "primární" klíč, který identifikuje řádek
setElementPrototype vlastní html element
setCustomRender callback pro vlastní vykreslení function($item, \Nette\Utils\Html $el)
{return $el}
setDisable callback pro ovlivnění vykreslení, když vrátí TRUE => nevykreslí se function($item)
{return $item->role == 'admin'}
setIcon nastaví idetifikátor ikony 'pencil'
setConfirm nastaví javascriptový confirm, lze použít callback function($item)
{return "Are you sure you want to delete {$item->title}?"}

Gettery

Metoda Popis
getElementPrototype umožní nastavit např. vlastní css třídu

Operace

$grid->setOperation(array('delete' ⇒ 'Delete'), function($operation, $id) { … } );

První parametr je pole podporovaných akcí, druhý je handler volající se po vybrání akce.

Settery

Metoda Popis Příklad parametru
setConfirm nastaví javascriptový confirm pro operaci "delete", "Opravdu chcete mazat?"
setPrimaryKey nastaví "primární" klíč, který identifikuje řádek

Export

$grid->setExport('user_export');

První parametr je název exportovného souboru, pokud není nastaven použije se název gridu. Formát exportu je CSV. Export zohleďňuje aktuální filtr.


Inline editace

Inline editace umožní upravovat jednotlivé buňky přímo v tabulce Grido. Pro datasource Nette Database je již implementována výchozí update() metoda, v ostatních případech je potřeba si metodu doimplementovat a to prvním parametrem metody $grid->setEditableColumns(), nebo pomocí $column->setEditableCallback().

Ovládání

Ukázka kódu a použití


    // Umožnění inline editace nad celým gridem
    $grid->setEditableColumns();

    // Umožnění inline editace nad celým gridem s vlastním callbackem pro práci se změněnými daty
    $grid->setEditableColumns(callback(...));

    // Umožnění inline editace pouze nad konkrétním sloupcem
    $column->setEditable();

    // Nastavení vlastního callbacku pro práci se změněnými daty nad jediným sloupcem
    $column->setEditable(callback(...));
    //nebo
    $column->setEditable();
    $column->setEditableCallback();

    // Znemožnění editace nad jediným konkrétním sloupcem
    $grid->setEditableColumns();
    $column->disableEditable();

    // Nastavení vlastního IControl pro konkrétní sloupec
    $column->setEditable(callback(...), $control);
    // nebo
    $column->setEditableControl($control);
    // případně
    $column->setEditable(NULL, $control);

    // Pokud potřebujete předzpracovat hodnotu sloupce pro IControl je možné nastavit vlastní ValueCallback
    $column->setEditableValueCallback(function($row) {
        return $row->id;
    });

    /**
     *  Callback funkce pro zpracování změněných dat s parametry
     *  $id mixed primární klíč řádku
     *  $newValue mixed změněná hodnota
     *  $oldValue mixed původní hodnota
     *  $column Grido\Components\Columns\Editable sloupec grida
     */
    function($id, $newValue, $oldValue, $column) {
        if ($isDataSaved) {
            $success = true;
        } else {
            $success = false;
        }
        return $success;
    }

    

Client-side features

Ve složce client-side lze najít základní css styl a javascriptové skripty zastřešující klientskou část. Obojí lze nainstalovat přes Bower, název balíčku je grido. Grido.js lze pomocí prototypů snadno rozšířit a je možné tak použít např. vlastní plugin pro kalendářík. Příklad takového rozšíření lze najít zde.


Screenshot