Grido – DataGrid pro Nette
- o5
- Člen | 416
@mpis: předej si $grid do tý anonymní fce přes use:
$action->setCustomRender(function($item, \Nette\Utils\Html $el) use ($grid)
{
...
'title' => $grid->translator->translate(...),
...
});
Na ty formuláře a šablonu zkus fci setTranslator() – nečekaně : ))
@libik: nevím přesně co tím chceš udělat, ale neměl by to být problém :))
Editoval o5 (19. 9. 2014 2:13)
- Ja
- Člen | 260
Zdravim, nevsimli jste si nekdo podivneho chovani pri pouziti
->setRememberState(true);?
Co se stalo mne – povolil jsem tuto moznost, vyfiltroval jeden column a ted
pokazde kdyz na grid prijdu odkudkoli, tak se filtruje jen ten jeden column,
i prestoze jsem zkusil filtraci zrusit, nebo filtrovat podle jineho columnu.
Stale tam visi filtrace dle toho prvniho. Nejaka idea?
Moc diky
Update: zkousel jsem i grido ze sandboxu, a tam se to taky chova divne (ale nastesto to vyresilo spoustu dalsich problemu, ktery jsem mel) – rikam si, jestli neni dokurvenyho v tom lampu co mam – EasyPHP
Update2: tak v lampu nic blbe neni, blbne to i na forpsi
Editoval Ja (21. 9. 2014 12:04)
- o5
- Člen | 416
@Ja: Nechápu co ti připadá jako podivné chování. Teď jsem zkusil grido-sandbox na localhostu s master verzí a funguje to dle očekávání.
- zvolím filtr dle sloupce Firstname=„martin“ ⇒ dostanu 4 výsledky
- smažu z URI parametry týkající se filtru (grid-filter[firstname]=martin) a opět dostanu stejný výsledek (filtr načten ze sesssions)
- pokud přidám filtraci dle dalšího sloupce, výsledků je míň (+ sessions filtr se rovněž změní )
- pokud filtr smažu, smaže se tak i filtr uložený v sessions
Editoval o5 (21. 9. 2014 15:23)
- Ja
- Člen | 260
@o5: tak uz jsem dosel na workflow, jak ten filtr „rozbit“, resp. jak se ten filtr u me chova (aplikuju to na tvuj priklad, zaznamy mam z vlastni tabulky ‚uzivatele‘)
- vyfiltruju ‚martin‘
- klik na menu polozku ‚uzivatele‘ (smaze mi parametry v url)
- grid si filtraci ‚martin‘ nepamatuje
- vyfiltruju znovu ‚martin‘ a pridam k tomu sort dle nejakeho sloupce (uplne jedno jakeho)
- viz bod 2.
- filtr si najednou pamatuje filtraci i sort
zkousel jsem to i na sandboxu co jsem prevcirem stahl z githubu, napojil jsem to na sva data a NetteDatabase.php jsem jen obohatil o $grid->setRememberState(true);
Editoval Ja (22. 9. 2014 16:47)
- Tirus91
- Člen | 199
@o5
Chtěl bych se optat. Jak při
$grid->addColumnText('albums', 'Albums')
->setSortable()
->setColumn('id.gallery_album.title');
Mohu získat počet záznamů v podřízené tabulce vůči té, kterou mám v modelu? Také bych potřeboval ještě podřízené této podřízené (category → album → photo)
Děkuju
- Tirus91
- Člen | 199
@o5
super, tak to funguje, Děkuji.. Ještě bych ale měl jednu otázku. Když chci
využít setConfirm() a v callbacku si vrátit string ve stylu
$grid->addActionHref('deleteUser', '')
->setIcon('trash')
->setDisable(function($item) {
return !$this->isInRole(['admin']);
})
->setConfirm(function($item) {
return 'Opravdu si přejete smazat uživatele '.$item->username.'?';
})
->getElementPrototype()
->addAttributes(array('class' => 'btn-sm btn-danger'));
Jak mohu docílit aby se mi do translatoru ta věta dostala jen jednou a né Xkrát (pro každého uživatele)?
Také mi nějak nefunguje date filter a to jen v případě jednoho presenteru (v jiném mi funguje)
protected function createComponentUserGrid($name) {
$grid = new \Grido\Grid($this, $name);
$grid->setTranslator($this->getTranslator());
$grid->model = $this->userModel->findAll();
$grid->addColumnText('id', 'ID')
->setSortable();
$grid->addColumnText('username', 'Username')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('email', 'Email')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('firstname', 'First name')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('surname', 'Surname')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnDate('created', 'Register', 'd.m.Y H:i')
->setSortable()
->setFilterDate(\Grido\Components\Columns\Date::FORMAT_DATETIME)
->setSuggestion();
$grid->addColumnDate('logged', 'Logged', 'd.m.Y H:i')
->setSortable()
->setFilterDate(\Grido\Components\Columns\Date::FORMAT_DATETIME)
->setSuggestion();
$grid->addActionHref('deactivateUser', '')
->setIcon('fa fa-fw fa-ban')
->setDisable(function($item) {
return !$item->active;
})
->getElementPrototype()
->addAttributes(array('class' => 'btn-sm btn-warning'));
$grid->addActionHref('activateUser', '')
->setIcon('fa fa-fw fa-unlock')
->setDisable(function($item) {
return $item->active;
})
->getElementPrototype()
->addAttributes(array('class' => 'btn-sm btn-success'));
$grid->addActionHref('manageRole', '')
->setIcon('fa fa-fw fa-group')
->getElementPrototype()
->addAttributes(array('class' => 'btn-sm btn-default'));
$grid->addActionHref('edit', '')
->setIcon('pencil')
->setDisable(function($item) {
return !$this->isInRole(['admin']);
})
->getElementPrototype()
->addAttributes(array('class' => 'btn-sm btn-info'));
$grid->addActionHref('deleteUser', '')
->setIcon('trash')
->setDisable(function($item) {
return !$this->isInRole(['admin']);
})
->setConfirm(function($item) {
return 'Opravdu si přejete smazat uživatele '.$item->username.'?';
})
->getElementPrototype()
->addAttributes(array('class' => 'btn-sm btn-danger'));
$grid->setExport();
$grid->getColumn('id')->headerPrototype->style = "width:5%";
$grid->getColumn('username')->headerPrototype->style = "width:15%";
$grid->getColumn('email')->headerPrototype->style = "width:15%";
$grid->getColumn('firstname')->headerPrototype->style = "width:15%";
$grid->getColumn('surname')->headerPrototype->style = "width:15%";
$grid->getColumn('created')->headerPrototype->style = "width:7%";
$grid->getColumn('logged')->headerPrototype->style = "width:7%";
$grid->filterRenderType = $this->filterRenderType;
return $grid;
}
Když kliknu na výběr datumu ve filtru, tak mi ho dovolí zvolit, ale jakmile kliknu do jiného prvku nebo kamkoliv mimo, tak se filtr vymaže
Editoval Tirus91 (29. 9. 2014 23:09)
- svobodai
- Člen | 136
Dá se ve filtru nějak udělat závislé select boxy, např. vyberu jméno a select box s příjmeními se mi omezí jen na ta, která mají vybrané jméno?
Dají se udělat custom filtery, myslím tím, že vyberu informaci ze selectboxu a pomocí jiné tabulky dohledám hodnoty k tomuto výběru a ty hodnoty teprve použiju pro filtrování.
- o5
- Člen | 416
Tirus91 napsal(a):
Jak mohu docílit aby se mi do translatoru ta věta dostala jen jednou a né Xkrát (pro každého uživatele)?
Tohle je celkem advanced věc a momentálně to jinak než přes nějaký
javascript, který projde všechny data-grido-confirm a přilepí k ním
username neuděláš. edit: https://forum.nette.org/…id-pro-nette?p=13
Tirus91 napsal(a):
Také mi nějak nefunguje date filter a to jen v případě jednoho presenteru (v jiném mi funguje)
To hlasíš nějaký UX bug nebo co? Nerozumím tomu.
svobodai napsal(a):
Dá se ve filtru nějak udělat závislé select boxy, např. vyberu jméno a select box s příjmeními > se mi omezí jen na ta, která mají vybrané jméno?
Dají se udělat custom filtery, myslím tím, že vyberu informaci ze selectboxu a pomocí jiné > tabulky dohledám hodnoty k tomuto výběru a ty hodnoty teprve použiju pro filtrování.
Rovněž custom požadavek. Ale jde to :)) Nedávno jsem řešil takto svázané selectboxy a to výběr místa (region/district). Udělal jsem si vlastní ListSelectFilter a tuhle logiku dopsal do konstruktoru + přidal javascriptovou obsluhu donačítání okresů.
Editoval o5 (30. 9. 2014 13:25)
- pepakriz
- Člen | 246
Jak mohu docílit aby se mi do translatoru ta věta dostala jen jednou a né Xkrát (pro každého uživatele)?
->setConfirm(function($item) use ($grid) {
return sprintf($grid->getTranslator()->translate('Opravdu si přejete smazat uživatele %s?'), $item->username);
})
Možná by stálo za to zvážit, jestli v případě callbacku se má confirm překládat. Takto se totiž hláška přeloží 2×.
- o5
- Člen | 416
@Tirus91: @pepakriz: LOL, tak tohle mi tam jedna dobrá duše implementovala :))
Takže to bude takto:
->setConfirm(function($item) {
return ['Opravdu si přejete smazat uživatele %s?', $item->username];
})
Přidám to ještě do testů ;)
Editoval o5 (30. 9. 2014 13:26)
- svobodai
- Člen | 136
o5 napsal(a):
svobodai napsal(a):
Dá se ve filtru nějak udělat závislé select boxy, např. vyberu jméno a select box s příjmeními > se mi omezí jen na ta, která mají vybrané jméno?
Dají se udělat custom filtery, myslím tím, že vyberu informaci ze selectboxu a pomocí jiné > tabulky dohledám hodnoty k tomuto výběru a ty hodnoty teprve použiju pro filtrování.
Rovněž custom požadavek. Ale jde to :)) Nedávno jsem řešil takto svázané selectboxy a to výběr místa (region/district). Udělal jsem si vlastní ListSelectFilter a tuhle logiku dopsal do konstruktoru + přidal javascriptovou obsluhu donačítání okresů.
Mohl by jsi mi naznačit kde pak dělat ty změny, nebo nějaký lehký příklad.
- verex
- Člen | 12
Tirus91 napsal(a):
@verex
a co takhle si tam přidat ještě$grid->addColumnText('photos', 'Photos') ->setCustomRender(function($item) { return $item->related('gallery_photo')->count('id'); }) ->setSortable() ->setFilterText() ->setSuggestion();
Do order by a do where se použije photos a skončí to chybou Column not found.
- svobodai
- Člen | 136
musíš k tomu filtru ještě připojit
<?php
$grid->addColumnText('photos', 'Photos')
->setCustomRender(function($item) {
return $item->related('gallery_photo')->count('id');
})
->setSortable()
->setFilterText()
->setColumn('photo_id')
->setSuggestion();
?>
v tom setColumn nastavíš podle jakého sloupce chceš filtrovat.
- verex
- Člen | 12
svobodai napsal(a):
musíš k tomu filtru ještě připojit
<?php $grid->addColumnText('photos', 'Photos') ->setCustomRender(function($item) { return $item->related('gallery_photo')->count('id'); }) ->setSortable() ->setFilterText() ->setColumn('photo_id') ->setSuggestion(); ?>
v tom setColumn nastavíš podle jakého sloupce chceš filtrovat.
Takže si pak zadám hodnotu filtru 10 a skutečně dostanu řádky
s počtem fotek 10 nebo s photo_id = 10?
Já bych řekl, že to druhé.
- svobodai
- Člen | 136
Ano to druhé. Budeš muset použít místo setCondition, kde si můžeš zadat vlastní sql podmínky pro filtrování. viz dokumentace
- Tirus91
- Člen | 199
@o5
Tak zatím vše funguje, jen musím otestovat ty datepickery..
Ale mám ještě jeden dotaz. Když mám sloupeček, který vypisuji
následovně
$grid->addColumnText('album', 'Album')
->setSortable()
->setCustomRender(function($item) {
if ($item->gallery_album_id) {
return $item->gallery_album->title;
}
return null;
});
Jak mohu docílit filtrace (správné) a také editace? (u editace musí být výběr z číselníku… u filtrace preferuji spíše text)
- s4muel
- Člen | 92
@Tirus91: filter by mal ist takto takto:
...->setFilterText()->setColumn('gallery_album.title');
a editaciu pozri v dokumentacii a sandboxe:
http://o5.github.io/…tion.cs.html#…
- Hafran
- Člen | 121
svobodai napsal(a):
Ano to druhé. Budeš muset použít místo setCondition, kde si můžeš zadat vlastní sql podmínky pro filtrování. viz dokumentace
No tím možná spravíš filtrování, ale řazení tím dle mého nepůjde.
- svobodai
- Člen | 136
Mám trochu problém s paginatorem.
Mám grid, a formulář s filtrací, který není součástí gridu. Když
změním parametry v té filtraci tak se mi správně nastaví select a vše se
zobrazí správně, ale pokud mám více stránek tak po přechodu na další
stránku ten grid zapomene ty filtrační podmínky.
Filtrační podmínky předávám pomocí funkce setModel, kam vložím ten
základní dotaz s novými podmínkami.
Jak to upravit aby i při tom přechodu na další stránku zůstal ten select omezen.
Dá se nějakým způsobem udělat sumace některých sloupců na aktuální stránce, případně za celý výběr?
Dá se kromě vyfiltrovaných dat vyexportovat i ten hlavní select bez filtrovaných dat?
Editoval svobodai (8. 10. 2014 13:15)
- pepakriz
- Člen | 246
matopeto napsal(a):
Zdravim, da sa prosim vas, nastavit nejako vlastna trieda na export? V dokumentacii to nemozem najst a z kodu tiez niesom velmi chytry.
Dá se v gridu přetížit tato metoda, a v ní použiješ vlastní Export třídu: https://github.com/…ontainer.php#L372
Jiná cesta momentálně neexistuje.
- kolsi
- Člen | 131
Nevím, jestli je to schválně, ale když mám více sloupců s filtrem a u více filtrů nastavím výchozí hodnotu přes ->setDefaultValue(…), tak každé zavolání této funkce přepíše předchozí nastavenou hodnotu. Ve výsledku je pak výchozí hodnota filtru aplikována pouze u toho filtru, který je nastaven jako poslední.
- semi333
- Člen | 1
Zdravim, je mozne prekreslovat vlastny snippet mimo gridu po filtrovani dat? Snazim sa urobit prepocitavanie hodnot z vyselektovanych dat Grida a vypisovat ich do samostatneho snippetu. Neviem ci na to idem spravne, ale snazim sa to docielit cez udalost gridu $grid->onFetchData. Vdaka za odpoved.
- evil
- Člen | 1
Zdravím, mám problém s odkazy pro sortování
domena.org/projekt/uzivatel/liste/4
v teto strance mam grid umisten
generuje mi vsak odkazy
domena.org/projekt/uzivatel/liste?grid-sort%5Bjmeno%5D=↑
chybi mi tam /<id> … /4
a pak padám na chybu protože nemůžu načíst data protoze se mi ta hodnota
4 do id nepreda
nejaka rada co delam spatne ?
mam podobny projekt kde to funguje, ale v tomto to uplne ignoruje nastaveni routovani a vypisuje fyzickou cestu
Editoval evil (23. 10. 2014 15:43)
- mkos
- Člen | 4
Zdarek
Začínám s Nette a po vyzkoušení několika gridů mi Grido vyhovuje
nejvíc. Potřeboval bych ale píchnout s nastavením filtru. V tabulce je
pole datum_zadani a potřebuji filtrovat podle
měsíce a roku. Pokud přidám filtr podle ukázky
$mesice = array('' => '', 1 => 'leden', 2 => 'únor');
$grid->addFilterSelect('mesic', 'Měsíc', $mesice)
->setColumn('datum_zadani')
->setWhere(function($value, \Nette\Database\Table\Selection $connection){
$value
? $connection->where('MONTH(datum_zadani) = ?', 'mesic')
: NULL;
});
tak mi uniká způsob nastavení setWhere
Díky za nakopnutí
- s4muel
- Člen | 92
@mkos
nie
$connection->where('MONTH(datum_zadani) = ?', 'mesic')
ale
$connection->where('MONTH(datum_zadani) = ?', $value)
v ukazke z dokumentacie
$connection->where('column = ?' , 'male')
je preto ‚male‘, lebo filter je checkbox a preto ak je zakliknuty (true), tak je tam rovno hodnota stlpca
- cujan
- Člen | 410
s4muel napsal(a):
@cujan
$grid->setRowCallback(function($row, \Nette\Utils\Html $tr) { if ($row->stlpec_so_sumou >= 0) { $tr->class[] = 'prijem'; } else { $tr->class[] = 'vydaj'; } return $tr; });
hodil som to tam a hodilo mi chybovu hlasku
Nette\DeprecatedException
ActiveRow is read-only; use update() method instead.
protected function createComponentGrid($name) {
$grid = new \Grido\Grid($this,$name);
$grid->translator->lang='sk';
$grid->setModel($this->prijmyvydaje->findAll());
$grid->setDefaultSort(array('datum'=>'DESC'));
$grid->addColumnDate('datum', 'Datum')->setDateFormat(\Grido\Components\Columns\Date::FORMAT_DATE)->setSortable();
$grid->addColumnText('popis', "Popis");
$grid->addColumnText('suma', "Suma")->setSortable();
$grid->addColumnText('idCiselnikTypTransakcie', 'typ transakcie')->setColumn(function($item){ return $item->ciselnikTypTransakcie->nazov;})->setSortable();
$grid->addColumnText('identifikator', 'identifikator');
$grid->setRowCallback(function($row, \Nette\Utils\Html $tr) {
if ($row->identifikator = 1) {
$tr->class[] = 'prijem';
}
else {
$tr->class[] = 'vydaj';
}
return $tr;
$grid->addActionHref('delete', 'Zmaz');
});
- cujan
- Člen | 410
s4muel napsal(a):
@cujan
if ($row->identifikator = 1) { if ($row->identifikator == 1) {
super funguje…vobec mi to nedoslo,inac nemozes mi poradit ako nastavit inner filter na tento stlpec?
$grid->addColumnText('idCiselnikTypTransakcie', 'typ transakcie')->setColumn(function($item){ return $item->ciselnikTypTransakcie->nazov;})->setSortable();
teda na stlpec, ktoreho hodnoty taham z inej tabulky?
inac povedane, ako na setFilterSelect() ak to je stlpec tahany z inej tabulky cudzim klucom?
vdaka
Editoval cujan (31. 10. 2014 19:45)
- s4muel
- Člen | 92
@cujan pisem len namatkovo, takto nejako by to mohlo fungovat, skus:
$grid->addColumnText('idCiselnikTypTransakcie', "typ transakcie")
->setColumn(function($item) {
//nastavenie stlpca s datami
return $item->tabulka_typov->stlpec_s_nazvom_typu;
})
->setSortable()
//metoda nizsie musi vratit pole s ciselnikom typov v tvare
//id_typu => nazov_typu, pripadne s prvym 'prazdnym' prompt elementom napr: '' => 'vyberte typ'...
->setFilterSelect($this->sluzba_ci_repozitar->ciselnik_typov())
//nastavenie stlpca pouziteho na filtrovanie (ak nemas komplikovany model, tak nazov tabulky netreba uviest)
->setColumn('tabulka_zaznamov.db_stlpec_s_cudzim_klucom_na_tabulku_typov');
Editoval s4muel (3. 11. 2014 14:33)