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::truncate() | |
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('birthday', '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í
- Pro otevření buňky k inline editaci lze využít:
- CTRL + DOUBLE CLICK na Windows/Linux
- CMD + DOUBLE CLICK na Mac OS
- Pro potvrzení editace stiskněte ENTER, buňka pro editaci musí mít focus
- Pro zrušení editace stiskněte ESC, buňka pro editaci musí mít focus
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.
- ajax s kompletním stavem v URL
- hromadné označování řádků s podporou shiftu
- invertování výběru řádků
- prompt pro rychlé přeskočení na stranu
- kontrola numerického vstupu
- potvrzování nastavených akcí a operací
- odscrolování po změně
- cool url parametry
- odeslání filtru po změně hodnoty