Grido – DataGrid pro Nette
- chap
- Člen | 81
Ahoj, řeším problém s client-side Grida. Z nějakého důvodu se neinicializuje. Mám aktuální verze Nette a Grido, vše vypadá že jde, jen věci jako invertovat výběr, onSelect filtru atp mi nejdou. Skripty v původní podobě mám nalinkovány takto:
<script src="{$basePath}/js/jquery.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
<script src="{$basePath}/js//bootstrap.min.js"></script>
<script src="{$basePath}/js/netteForms.js"></script>
<script src="{$basePath}/js/grido.js"></script>
<script src="{$basePath}/js/history.ajax.js"></script>
<script>$(function () { $.nette.ext('history').cache = false;$.nette.init();});</script>
Konzole nehlásí žádný problém, takže bych to tipoval na to, že se mi
jen neinicializuje Grido …
Když skusím dát do grido.js
Grido.Grid.prototype =
{
...
init: function()
{
console.log("test");
...
}
tak se nic neděje. Poradíte prosím?
- o5
- Člen | 416
jval napsal(a):
zdravím, je možné v o5/grido nastavit aby tlačítka pro editaci/mazání směřovala na handle?
Koukal jsi do dokumentace či API?
Editoval o5 (12. 11. 2014 23:05)
- jval
- Člen | 36
o5 napsal(a):
jval napsal(a):
zdravím, je možné v o5/grido nastavit aby tlačítka pro editaci/mazání směřovala na handle?
Koukal jsi do dokumentace či API?
Chlapi omlouvám se, příště nejdřív testnu a pak teprve budu psát do
fóra.
Já to samozřejmě takto měl
$grid->addActionHref('edit', 'Upravit','edit!')->setIcon('pencil');
ale na pohled se mi nezdál odkaz který to generovalo
/client/default/9?do=edit
a než abych na to zkusil klepnout, tak jsem tady napsal dotaz.
- mpis
- Člen | 65
keeper7 napsal(a):
Jak do ctvrteho parametru $args dostanu data z aktualneho radku?
$action = $grid->addActionHref('edit', '');
$action->setDisable(function() { return !($this->can('EQUIPMENT_WRITE') and $this->template->docarea_id==0);});
$action->setCustomRender(function($item, \Nette\Utils\Html $el) use ($grid)
{
$el->removeChildren();
$el->addAttributes(array(
'href' => $this->link('Equipment:equipmentEdit', array(
'equipment_id' => $item->equipment_id,
'docarea_id' => $this->template->docarea_id,
'doccategory_id' => $item->doccategory_id)),
'class' => 'icon edit',
'title' => $grid->translator->translate('Editovat přístroj'),
));
return $el;
});
- Pavel Kravčík
- Člen | 1195
Zdravím,
zkoušeli jste někdo addColumnDate pro array Grid? Konkrétně mi jde o filtry. Nefungují mi, ať je nastavím jakkoliv. :(
Mám nějaké pole (activeRow, arrayHash, array) – zkoušel jsem všechny. Nastavenou hodnotu na:
vytvoreno => "19.11.2014" (10)
nebo:
vytvoreno => Nette\DateTime #f14e
date => "2014-11-19 09:43:40.000000" (26)
timezone_type => 3
timezone => "Europe/Prague" (13)
Pak si zavolám v gridu:
$grid->addColumnDate('vytvoreno', 'Vytvořeno')
->setSortable()
->setFilterDate();
Zkoušel jsem samozřejmě i Date::FORMAT_DATE a ty ostatní formátování i funkci addFormatDate() nebo jak se jmenuje.
Grid funguje bezvadně (náhodou jsem objevil, že nefiltruje podle datumu). Na čistém sandboxu taky nefiltruje, pokud použiju Array.
Nějaké rady/nákopy? Nic už mi nenapadá. Co tedy má být vstupem, aby to uměl addColumnDate filtrovat?
Díky
- Casper
- Člen | 253
@Ja Grido si interně cachuje $data, pokud potřebuješ grido překreslit s novými daty, musíš tuhle protected proměnnou vymazat a zavolat reload().
- Rampus
- Člen | 39
Řešil jste někdo skrývání sloupců při malých obrazovkách? Případně návrh na feature.
Mám sloupec který nechci zobrazit na tabletech a míň přes TWB.
<?php
$col=$table->addColumnText('sumaTax', "Částka s DPH");
$col->getHeaderPrototype()->addAttributes(['class'=>'column hidden-sm']);
$col->getCellPrototype()->addAttributes(['class'=>'hidden-sm']);
?>
funguje to krásně, ale pokud mám filter, který se vykresluje uvnitř, tak
tam se ten sloupec neskryje a rozhází se to (ten sloupec filtr nemá).
Dá se k tomu sloupci ve filtru nějak dostat?
Nebo jak to řešit systémově?
Díky :)
- Rampus
- Člen | 39
o5 napsal(a):
@Rampus: Grido generuje css classy k jednotlivým filtrům.
to vím, ale 1) nechci psát vlastní class pro jednotlivý sloupce filtrů,
když můžu použít z TWB „hidden-xs“ a 2) pokud sloupec filtr
neobsahuje, tak se vygeneruje jen <th></th> bez classů.
Ideální by bylo, kdyby se na to dalo nějak dostat stylem
$collumn->getFilterPrototype()…
Editoval Rampus (4. 12. 2014 10:28)
- o5
- Člen | 416
@Rampus: a $filter->getWrapperPrototype() nestačí?
Popř. přímo k formulářovému prvku se dostaneš přes
$grid['form']['filters']['<filter-name>']->controlPrototype->class[] = 'hidden-xs';
Editoval o5 (4. 12. 2014 10:40)
- Rampus
- Člen | 39
o5 napsal(a):
@Rampus: a $filter->getWrapperPrototype() nestačí?
Popř. přímo k formulářovému prvku se dostaneš přes
$grid['form']['filters']['<filter-name>']->controlPrototype->class[] = 'hidden-xs';
paráda, to je přesně ono. A protože v tom sloupci nechci žádné filtrování, musel jsem to udělat takhle, ale funguje to :)
<?php
$filter=$col->setFilterCustom(new \Nette\Forms\Controls\HiddenField());
$filter->getWrapperPrototype()->addAttributes(['class'=>'hidden-xs hidden-sm']);
?>
- oskarmaniak
- Člen | 29
Ahoj o5, v prvé řadě děkuji za super tool Grido.
Měl bych na přítomné prosbičku, řeším filtrování od do, našel jsem tu rok staré příspěvky, ale to již nefunguje, protože dle dokumentace API jsou použité funkce zastaralé.
Našel jsem, že by na to mohlo být asi „addFilterDateRange“. Ale v ať
jsem se to pokoušel nasadit jakkoli,
nepozřel jsem žádnou změnu z které by naznačovalo něco, jestli to
funguje. Nebo jak zadat parametry od do.
Mohl bych poprosit o example jak nasadit zmiňovaný „addFilterDateRange“ ?
Děkuji mockrát předem
- o5
- Člen | 416
oskarmaniak napsal(a):
našel jsem tu rok staré příspěvky, ale to již nefunguje, protože dle dokumentace API jsou použité funkce zastaralé.
mohl by jsi prosím poslat přesně odkazy co přesně myslíš?
Našel jsem, že by na to mohlo být asi „addFilterDateRange“. Ale v ať jsem se to pokoušel nasadit jakkoli,
nepozřel jsem žádnou změnu z které by naznačovalo něco, jestli to funguje. Nebo jak zadat parametry od do.Mohl bych poprosit o example jak nasadit zmiňovaný „addFilterDateRange“ ?
Date-range filtr je úplně prostý jeden text-input, kde jako vstup použiješ třeba tohle: 05.11.2014 – 04.12.2014, přičemž ten formát si můžeš nastavit dle libosti.
- kolsi
- Člen | 131
V rámci optimalizace naší aplikace se snažím vyřešit jeden problém. Dost často máme grido, které kromě sloupců z DB obsahuje ještě další dopočítané sloupce. Podle těchto sloupců potřebujeme samozřejmě i dál řadit, filtrovat, atd. Takže použít NDB model není možné (Grido pak při řazení/filtrování hlásí, že v DB daný sloupec není.). Do teď to řešíme jednoduchým překlopením do pole, doplnění dat a předáním jako ArraySource, např.:
$data = array();
foreach ($this->projectRepository->findAll() as $project) {
$projectdata = $project->toArray();
$projectdata['custom'] = spoctiData($project->id); // příklad vlastního sloupce
$data[] = $projectdata;
}
$grido->setModel($data);
Funguje to, ale samozřejmě to není úplně efektivní, už jenom to, že dopočítává pro všechny (takže i ty, co díky stránkování nejsou vidět). A tak se ptám, jestli někdo nemá nějaké vlastní lepší řešení?
- Foi
- Člen | 8
Mám problém s joinem u Doctrine. Vidíte někde chybu ?
// $this = Grido\Grid
// @return Grido\DataSources\Doctrine
$this->model = $this->doctrineResource(
$this->em->getRepository('Entity\User')->createQueryBuilder('a')
->addSelect('r')
->leftJoin('a.role', 'r'),
['rolename' => 'r.name']
);
$this->addColumnText('rolename', 'Pozice')
->setSortable()
->setFilterText();
Hláška
Cannot read an undeclared property Entity\User::$rolename
- oskarmaniak
- Člen | 29
o5 děkuji za rychlou odpověď.
1)
Ta první část tam žádná chyba není, jen že jsem tady na stránce
6 našel téma jak se to řeší.
A je tam například Filter::TYPE_DATE, a to dle dokumentace API jsem si našel
že už je zastaralé,
což vysvětluje proč to není vůbec v Grido knihovnách.
2)
*
Tak jak už to bývá, jakmile jsem to odeslal, tak mě to praštilo do
očí :)
$grid->addColumnDate('when', 'Checked in time', Grido\Components\Columns\Date::FORMAT_DATETIME)
->setSortable();
$grid->addFilterDateRange('when', 'Checked in time');
A už to funguje :)
Díky za inspiraci
Editoval oskarmaniak (4. 12. 2014 23:44)
- o5
- Člen | 416
@kolsi: pro tohle je tu událost $grid->onFetchData . Akorát si tam asi budeš muset přetypovat ActiveRow na array či ArrayHash.
@Foi: s Doctrine nedělám, ale nechybí ti tam relace v entitě? Úplně stejný příklad najdeš v grido-sandbox, tak se tam zkus třeba podívat.
@oskarmaniak: Filter::TYPE_DATE tam opravdu kdysi bylo :) Ono by se to chtělo možná trochu zamyslet nad tím co děláš, než bezmyšlenkovitě používat COPY/PASTE. Jak od $grid->addColumnDate chceš vidět input mi moc nejde do hlavy. Tím pouze říkáš, jakého typu daný sloupec je. $grid->addFilterDateRange ti přidá filtr (text input), který akceptuje formát vstupu co jsem napsal výše.
- oskarmaniak
- Člen | 29
@o5
Občas to tak opravdu vypadá :) I když v tomto případě to spíš bylo,
že to chtělo na pár hodin vypustit z hlavy :) Přitom to v příkladech
část toho je, jen stačilo přidat ten filter.
Tak jak jsem to poslal, tak mi to funguje k mé spokojenosti.
Každopádně děkuji
- kolsi
- Člen | 131
o5 napsal(a):
@kolsi: pro tohle je tu událost $grid->onFetchData . Akorát si tam asi budeš muset přetypovat ActiveRow na array či ArrayHash.
Tak s konverzí na array se tak nějak počítá, tomu se nevyhnu, když chci doplnit vlastní data (resp. v Nette 2.0 by to šlo rovnou do ActiveRow, ale ve 2.1 už ne). Spíš se pořád nemohu zbavit pocitu, že to stejně nebude fungovat – pokud někdo např. seřadí podle vlastního sloupce a já pak vytáhnu data (v onFetchData), tak to hodí výjimku, že sloupec v DB neexistuje (protože dotaz už bude obsahovat „ORDER BY custom_column“).
Spíš mě napadlo vytvořit vlastní model, který bude kombinovat NDBSource+ArraySource. Normálně se použije NDBSource, ale pokud se seřadí/filtruje podle vlastního sloupce, tak se překlopí do ArraySource. V getData() se pak zavolá callback, který doplní vlastní data.
- o5
- Člen | 416
Xethilos napsal(a):
@o5: Celkem mi tu chybí komponenta zvaná Boolean, neuvažoval jsi o tom? Při renderování by se z jedniček a nul stalo české slovo Ano (Zelené), ne (Červené) a v nabídce filtrování Ano, Ne, Nic.
Jo a myslíš, že by to někdo jiný kromě tebe využil? Tohle je totiž celkem custom věc a každý ji řeší jinak. Každý třeba nepoužívá 0/1, Ano/Ne, Červenou/Zelenou. Já ve svých projektech mám mnoho komponent pro Grido, ale jsou tak custom, že je použiju jen v rámci jednoho projektu a v dalším už třeba ne. Zrovna ale podobná komponenta je zveřejněná v sandboxu a viditelná v demu.
Editoval o5 (5. 12. 2014 23:27)
- Foose
- Člen | 12
Ahoj, taky chci nejprve poděkovat za super grid. Mám problém
s vyhledáváním, konktrétně s použitím ajaxu. Když vypnu js vše
funguje v pořádku. Řazení mi funguje i s ajaxem.
Můj kód:
public function createComponentArticleGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$grid->translator->lang = 'cs';
$grid->setModel($this->articleModel->getAll());
$grid->setPrimaryKey('articleId');
$grid->addFilterText('name', 'jméno');
$grid->addFilterSelect('active', 'aktivní', ArrayHelper::yesNo());
$grid->addColumnText('name', 'jméno')
->setSortable();
$grid->addColumnText('active', 'aktivní')
->setReplacement(ArrayHelper::noYes())->setSortable();
$grid->addActionHref('edit', 'Editovat')->setIcon('pencil');
$grid->setDefaultSort(array('name' => 'ASC'));
}
Ajaxový požadavek post se vytvoří, ale vrací se html celé stránky. Nesetkal se s tím někdo?
EDIT: nemůže být problém s tím, že se formulář odesílá přes POST? Ještě doplním, že mám nette v. 2.1.2 a grido verzi 1.0.6. a používám jquery.nette.js
Editoval Foose (8. 12. 2014 14:23)
- cujan
- Člen | 410
o5 napsal(a):
cujan napsal(a):
ako do addActionHref nastavim akciu z ineho presentera?
Přes třetí a čtvrtý parametr, viz API.
hmm…nato som uz natrafil ale akosi som to nerozluskol, potrebujem sa z vcelnica/detail dostat odkazom do ul/detail a ked som to nastavil takto
$grid->addActionHref(‚detail‘, ‚Detail‘,‚ul‘);
tak som sa dostal na vcelnica/ul :D
- o5
- Člen | 416
cujan napsal(a):
hmm…nato som uz natrafil ale akosi som to nerozluskol, potrebujem sa z vcelnica/detail dostat odkazom do ul/detail a ked som to nastavil takto
$grid->addActionHref(‚detail‘, ‚Detail‘,‚ul‘);
tak som sa dostal na vcelnica/ul :D
Ten argument $destination (popř. $args) nastav jako kdyby jsi ho předával
metodě $presenter->link($destination, $args)
, tedy v tvém
případě asi:
$grid->addActionHref('detail', 'Detail', 'Vcelnica:ul');
Editoval o5 (23. 12. 2014 0:30)
- cujan
- Člen | 410
o5 napsal(a):
cujan napsal(a):
hmm…nato som uz natrafil ale akosi som to nerozluskol, potrebujem sa z vcelnica/detail dostat odkazom do ul/detail a ked som to nastavil takto
$grid->addActionHref(‚detail‘, ‚Detail‘,‚ul‘);
tak som sa dostal na vcelnica/ul :DTen argument $destination (popř. $args) nastav jako kdyby jsi ho předával metodě
$presenter->link($destination, $args)
, tedy v tvém případě asi:$grid->addActionHref('detail', 'Detail', 'Vcelnica:ul');
vdaka pomohlo to zmenou tretieho parametra na
$grid->addActionHref('detail', 'Detail','Ul:detail');
- K0nias
- Člen | 10
Zdravim,
resim ted takovy nepeknou vec. Nacpal jsem grido jako sub komponentu do jine komponenty a zacalo tam zlobit filtrovani a reset filtru. Ajaxove nacteni dat se spravne provede az pri: opetovnem vyfiltrovani, zmene razeni a nebo zmene poctu zaznamu na stranku. Jinak data zustanou stejna. Zkousel jsem vypnout cachovani v metode getData a to vyresilo jen problem s filtrovanim. U resetu to dela porad. Nemate s tim nekdo podobne zkusenosti a nebo jeste lip reseni? :)
Moc dekuju
- o5
- Člen | 416
@K0nias: to „cachování“ v metodě getData() s tím nebude mít souvislost. Sleduj co za parametry je v URL a co za requesty chodí v network, ale takhle na dálku těžko říct. Jako mohl by to klidně dělat hashchange, který tam byl z historických důvodů. Před vánoci jsem to přepsal, aby to hashchange nevyužívalo. Tak můžeš zkusit, je to v masteru.
- Desttro
- Člen | 126
Zdravím,
omlouvám se za amatérský dotaz, ale jak nejjednodušeji přepnu, aby sandbox
nebral data z sqlite3 souboru, ale z mojí MySQL databáze, kde nadefinuju db,
jméno, heslo?
Pracuju s Nette/Database, ostatní jako Doctrine, Dibi, Array nepotřebuju.
Hraju si s config.neon ale neúspešně.
Děkuji
Editoval Desttro (7. 1. 2015 10:52)
- Oli
- Člen | 1215
Ahoj,
jde nějak navázat javascript na input? Ptám se proto, že když vyvolám
editační textbox, tak se vykoná ajaxový požadavek. Ten se ale nezavolá
prostřednictvím nette.ajax.js, takže mě nefunguje
$.nette.ext({
load: function() {
$('.mask').inputmask({mask: "99:99,99"});
}
});
$.nette.init();
Chtěl bych, aby se mě zobrazila maska pro inputy, který mají class
.mask
. Input se třídou mask jsem vytvořil, ale tím ajaxem se
„nepropojí“ s funkcí inputmask.
Co mě funguje, je vložení té funkce do initEditable v grido.js
.on('click.grido', function(event) {
if (helpers.isCtrl(event) && !$(this).hasClass('edit')) {
this.editable = new Grido.Editable(that).init($(this));
$('.mask').inputmask({mask: "99:99,99"});
}
});
To se mi ale vubec nelíbí.
Díky za nakopnutí
- K0nias
- Člen | 10
o5 napsal(a):
@K0nias: to „cachování“ v metodě getData() s tím nebude mít souvislost. Sleduj co za parametry je v URL a co za requesty chodí v network, ale takhle na dálku těžko říct. Jako mohl by to klidně dělat hashchange, který tam byl z historických důvodů. Před vánoci jsem to přepsal, aby to hashchange nevyužívalo. Tak můžeš zkusit, je to v masteru.
@o5: tak nakonec jsem zjistil kde byla chyba. V constructoru poddeneho datagridu jsem volal getData a nejspis to jeste nemelo incializovane vsechny procesy filtrovani atd. Pak se vysledek zacachoval a slo to do kytek. Takze moje chyba. :)
Ale i tak dekuju
- Pavel Kravčík
- Člen | 1195
Jen drobnost. Pokud si stáhnu sandbox – nefrčí client-side fičury.
Tohle mi hlásí 404:
<script src="https://rawgithub.com/o5/grido/master/client-side/grido.js"></script>
EDIT: Tak mi to nejde ani když dobře nalinkuji tento soubor z 1.0.6.
Editoval kzk_cz (7. 1. 2015 16:33)
- Pavel Kravčík
- Člen | 1195
@o5: Teď už mi to nejde vůbec. :D Respektive špatně se nalinkují i css. Asi je chyba v tomhle, ale nevím s čím to souvisí, jestli se špatně definovaným json nebo něčím jiným.
Instalace je jinak v pořádku. Ale nefungují tam js a css. Respektive špatně se nalinkují.
Zkoušel jsem sandbox protože jsem chtěl vidět, jak si to správně
nastavit. V aplikaci (Nette 2.2.7) mi nefunguje ajax Grido.
Nainstaluju Grido přes composer (~2.0)Nalinkuju soubory ze složky client-side (při rozkliknutí tam jsou)Ale ajax nefrčí, tak jsem se chtěl podívat do sandboxu, ale ten mi taky nejde
Povedlo se mi rozchodit v Aplikaci po chvíli testování.
P.S.: Edituju v 9:49 a je tu 8:49. :)
Editoval kzk_cz (8. 1. 2015 9:49)
- Martk
- Člen | 661
Je tohle bug a nebo takové chování má být ? (Doctrine source)
Tohle je jenom příklad sestavení gridu:
$grid->model(new Grido\DataSources\Doctrine(
$this->em->getRepository('Basket')->createQueryBuilder('a')
->leftJoin('a.list', 'l'),
['list.item' => 'l.item']
));
$grid->addColumnText('list.item', 'Položka')
->setSortable();
Po řazení to píše: list__item does not exist atd.
Vyřešení je jednoduché, přidání funkce unformatColumnName z helperů do doctrine resource, ale nevím zda je to opravdu chyba a nebo mám já špatné řešení.