Grido – DataGrid pro Nette
- Pavel Kouřil
- Člen | 128
Funguje někomu z vás filtrování nad sloupcem Date? Datasource Doctrine, nejnovější master.
Osobně dostávám chybu na v „Grido\Components\Filters\Condition.php Line: 67“.
- Lord Dave
- Člen | 7
Pri verzií nette 2.1 sa stretávam so sériou problémov.
Skušal som eliminovat problemy sposobene na mojej strane tym, že som proste
copy&paste nette 2.1 do sandboxu ale stale nekompatibilne. Po zmazani
nieakych veci v šablonach čo to vyhadzovalo to už fungovalo. ALE
A v mojej aplikácií hlási:
Nette\InvalidArgumentException Component name must be integer or string, NULL
given.
A to aj ked opät len copy&paste demo presenter aj šablony aj potrebné
.js subory nalinkujem
V nette po trojročnej prestavke robim okolo 7 dni :D ale prudko rýchlo sa
učím. Ale tuto som prikrátky.
Aplikáciu mám rozdelenu na Admin a Front module … kde môže byt chyba?
Edit: Zistil som, že client-side problemy (ktore sa mi tiež vyskytovali) vyplvali z nekompatibility jQuery 2.0.x s prilozenou jquery 1.8.x
Editoval Lord Dave (6. 1. 2014 21:04)
- juklicek
- Člen | 12
Ahoj,
nevíte prosím někdo jak nejlépe zpracovávat „operations“.
Hlavně v tom symslu co dělat po zpracování operations:
1/ Abych si neresetoval aktuálně nastavené filtry gridu
2/ Aby se operations neprovedli znovu v případě „refreshe“ stránky
Neřešil jste někdo tento problém?
Díky
- Pavel Kouřil
- Člen | 128
o5 napsal(a):
Pajka napsal(a):
Funguje někomu z vás filtrování nad sloupcem Date? Datasource Doctrine, nejnovější master.
Osobně dostávám chybu na v „Grido\Components\Filters\Condition.php Line: 67“.
Divný, můžeš to prosím více rozvést?
Tady posílám tu exception: https://dl.dropboxusercontent.com/…0-grido.html
Grid vytvářím následovně:
protected function createComponentGrid()
{
$grid = new Grid();
$grid->setTranslator($this->translator);
$queryBuilder = $this->ordersDao->createQueryBuilder('e')->where('e.branch = :branch')->andWhere('e.isDeleted = false')->setParameter('branch',
$this->selectedBranch);
$grid->setDefaultSort(array('code' => 'desc'));
$grid->setModel(new Doctrine($queryBuilder));
$grid->addColumnText('code', 'CODE')->setSortable()->setFilterText();
$grid->addColumnDate('takeoverDate', 'DATE')->setSortable()->setFilterDate();
// pár dalších $grid->addColumnText()
// pár $grid->addActionHref()
return $grid;
}
Verze gridu je 1.0.4, třída Grid je \Grido\Grid
, třída
Doctrine je \Grido\DataSources\Doctrine
.
PS: Filtrování nad sloupcem „text“ funguje OK.
EDIT: Ok, takže chyba byla v tom, že jsem měl jiný formát data než
Grid chtěl (šlo nastavit přes
Filters\Date::setDateFormatInput
).
Nicméně i teďka to stále nejede, ale už to aspoň vrací prázdné pole místo výjimky. IMHO bude chyba v tom, že to porovnává datetime sloupec vůči stringu s Y-m-d formátem; což ale teďka nevím jak narychlo řešit?
Editoval Pajka (10. 1. 2014 11:38)
- Pavel Kouřil
- Člen | 128
Střelím od boku, ale nemůže to prostě být tím, že moje políčko je typu datetime a ne date v databázi?
Schválně si zkusím někdy navečer/o víkendu pustit ty DQLka napřímo, jak se to zachová.
- o5
- Člen | 416
@Pajka: tak máš pravdu. S datetime to opravdu nefunguje, protože se to porovnává přímo. Opravím to, jen tedy nevím zda to udělat přes like (prej je to v mysql rychlejší než přes DATE(column) = ‚<date>‘). Ale nevím jak v ostatních databází, ví někdo?
Než to opravím, použij vlastní podmínku. Takto to vypadá pro Nette database.
$grid->addColumnDate('created', 'Created', Date::FORMAT_DATETIME)
->setFilterDate()
->setWhere(function($value, $selection) {
$date = \DateTime::createFromFormat('d.m.Y', $value)->format('Y-m-d%');
$selection->where('created LIKE ?', $date);
});
Jak to funguje v Doctrine, lze vyčíst z testů.
Editoval o5 (10. 1. 2014 13:57)
- Pavel Kouřil
- Člen | 128
Ok, vlastní podmínku prozatím použiju, díky za tip.
Co se týče toho porovnávání, tak popravdě netuším.
- webdata
- Člen | 153
No tu palikaci upravuji po jinem programatoru ten se na to jaksi vyto no.
$customers[''] = ' VŠE ';
$customers[0] = 'Nová';
$customers[1] = 'Vyřízená';
$grid->addColumnNumber("is_offer", "Stav")
->setReplacement($customers)
->setSortable()
->setFilter(Filter::TYPE_SELECT, $customers);
// Tohle jsem dopsal ja - podle dokumentace - tak nevim
$grid->setDefaultFilter(array('is_offer' => 0));
No a ted jde o to ze pokud vlitnu na tu stranku po prve, tak se vypisou polozky ze stavem NOVA. Pri vyberu Vyrizena to take funguje. Ale kdyz zvolim VSE tak to vypise polozky ze stavem NOVA, pritom je nastaveno na VSE.
SQL pro filtr vse je:
SELECT COUNT(*) FROM `requests` WHERE ((`is_offer` = "" ))
Pokud vyhodim to setDefaultFilter tak to generuje SQL pro VSE
SELECT COUNT(*) FROM `requests`
Editoval webdata (13. 1. 2014 0:04)
- o5
- Člen | 416
@webdata: jo jasně, Grido si myslí, že nemá nastaveno nic a tak použije default filter.. Vzpomínám si, že tohle byl bug v nějaké (ranné) verzi a soudě dle „Filter::TYPE_SELECT“ používáš nějakou 0.* verzi.
Nejlepší by byl upgrade na nejnovější verzi Grida, ale nebude to bezbolestné (BC BREAKY = setFilter() v tomhle případě bys musel zaměnit za setFilterSelect()). Méně bolestný by mohl být update na 0.9.2.
Editoval o5 (13. 1. 2014 0:18)
- webdata
- Člen | 153
Takze upgrade na 0.9.2 nepomohl. A udelat upgrade na novou verzi je nepripustne, protoze aplikace je dost robusni. Takze jsem se bohuzel musel uchylit k prasarne ze jsem v grid.php
upravil metodu
protected function applyFiltering()
{
$conditions = $this->_applyFiltering($this->getActualFilter());
foreach ($conditions as $condition) {
$this->model->filter($condition);
}
}
na
protected function applyFiltering()
{
$conditions = $this->_applyFiltering($this->getActualFilter());
foreach ($conditions as $condition) {
if (strlen($condition[1]) > 0) {
$this->model->filter($condition);
}
}
}
A uz to funguje. Prosim nekamenovat, vazne si nemohu dovolit upgrade.
Editoval webdata (13. 1. 2014 1:22)
- Pavel Kouřil
- Člen | 128
o5 napsal(a):
Pajka napsal(a):
Ok, vlastní podmínku prozatím použiju, díky za tip.
Co se týče toho porovnávání, tak popravdě netuším.
Hodil jsem do masteru opravu, mohl bys to pls testnout?
Omlouvám se za zdržení, dostal jsem se k tomu až dneska… ale odzkoušeno a vypadá to, že to funguje už OK. Moc díky za opravu! :)
- dj.kure
- Člen | 70
Dobrý den,
jak mám vyřešit následující?
Předávám data z databáze (dibi):
$grid = new \Grido\Grid($this, $name);
$grid->translator->lang = 'cs';
$grid->setModel($this->cars->getUserCarsData($this->user->getIdentity()->getId()));
$grid->addColumnText('kw', 'Výkon')->setSortable();
....
A potřeboval bych nějak doplnit do políčka s Výkonem ještě jednotku
(tj. „kW“). Aby to bylo třeba 88 kW.
Jak? Nechci upravovat SQL dotaz (doplňovat to CONCATem), umí to Grido?
- dj.kure
- Člen | 70
kudlajz napsal(a):
Nejde to pres metodu setCustomRender() u toho sloupce? Tam si pridas anonymni funkci, ktera Ti vrati ten text v pozadovanem formatu.
Díky, přesně tak jsem to vyřešil :-) super!
$grid->addColumnText('kw', 'Výkon')->setCustomRender(function($v) { return $v->kw . ' kW'; })->setSortable();
- kralik
- Člen | 230
Ahoj,
hraju si s touto věcičkou a je to skvělý.
Opravdu super GRID, uctivá poklona.
Měl bych prosbičku.
Mohu vložit do buňky tabulky <span> myslím tím:
<?php
// NYNÍ
<td class="grid-cell-oddeleni"> Konec</td>
// NOVĚ
<td class="grid-cell-oddeleni"> <span class="label label-warning">Konec</span> </td>
?>
způsobem: ->setCustomRender(…);
Je možné dle obsahu z DB např. sloupec cid → měnit class spanu?
např.
<?php
// CID=1
<td class="grid-cell-oddeleni"> <span class="label label-success">OK</span> </td>
// CID=2
<td class="grid-cell-oddeleni"> <span class="label label-warning">Konec</span> </td>
?>
Předem mooc díky
- o5
- Člen | 416
@kralik: nerozumím přesně moc dotazu, zkusím odpovědět bodově
- setCustomRender() ovlivňuje výpis buňky přičemž parametr callbacku jsou data celého řádku
- je to callback, takže si tam můžeš provést cokoli
- místo callbacku lze použít cestu k šabloně, příklad v testech tady a tady.
- pokud stejnou věc použiješ ve více gridech, bylo by asi vhodné si vytvořit vlastní column componentu, příklad
- kralik
- Člen | 230
o5 napsal(a):
@kralik: nerozumím přesně moc dotazu, zkusím odpovědět bodově
- setCustomRender() ovlivňuje výpis buňky přičemž parametr callbacku jsou data celého řádku
- je to callback, takže si tam můžeš provést cokoli
- místo callbacku lze použít cestu k šabloně, příklad v testech tady a tady.
- pokud stejnou věc použiješ ve více gridech, bylo by asi vhodné si vytvořit vlastní column componentu, příklad
prosím ještě o jednu pomoc.
mohu v Action přidat vlastní <span>?
Tak abych obdržel mezi <a> nadefinovaný <span>.
<?php
<a href="/doc/docman/detail?did=9">
<span class="icon icon-blue icon-info" title="Detail"></span>
</a>
?>
mooc díky
- kraklin
- Člen | 12
Ahoj,
koukám, že do Grido přibyl filtr DateRange, jenom nikde nemůžu najít, jak se používá/nastavuje nebo jak by měl fungovat. Z testů se dá akorát vyčíst, že se tam přidá, ale jinak nic. Nějaký malý sample by se hodil :)
Grid vytvářím takto:
protected function createComponentEventsGrid($name) {
$grid = new Grido\Grid($this, $name);
$grid->setModel($this->context->eventsRepository->findAllWithTags());
$grid->addColumnDate("eventdate", "Datum", 'd.m.Y')->setSortable()->setFilterDateRange();
$grid->addColumnDate("eventtime", "Čas", 'H:i:s')->setSortable();
$grid->addColumnNumber("channel", "Kanál")->setSortable()->setFilterNumber();
$grid->addColumnNumber("channel_name", "Název kanálu")->setSortable()->setFilterNumber();
$grid->addColumnText("dtmf", "DTMF")->setSortable()->setFilterText();
$grid->addColumnText("clip", "CLIP")->setSortable()->setFilterText();
$grid->addColumnText("all_tags", "Tagy")->setSortable()->setFilterText();
$grid->addActionHref("play", "Přehrát", "Events:Detail");
$grid->translator->lang = 'cs';
$grid->setDefaultSort(array('eventdatetime' => 'DESC'));
$operations = array('print' => 'Vytisknout');
$grid->setOperation($operations, $this->gridOperationsHandler);
$grid->setExport();
$grid->setFilterRenderType(Grido\Components\Filters\Filter::RENDER_INNER);
}
ale stejně je tam pro datum pouze jedno políčko.
- kralik
- Člen | 230
o5 napsal(a):
@kralik: projeď si dokumentaci
@kraklin: vstupem je jedno políčko, protože dvě jsou zbytečné.
V testech to lze zjistit tady (vstup ‚21.12.2012 – 22.12.2012‘). Na tobě pak je si vybrat nějaký klientský datepicker, třeba tenhle.
hledám v dokumentaci zde
v příkladech, které jsi uvedl výše a bohužel jsem neměl štěstí to
zatím najít.
jdu dále hlouběji hledat.
díky za tvůj čas
Edit
Tak se mi to podařilo najít. Třeba to někomu dalšímu pomůže.
$presenter = $this->getPresenter();
$grid->addActionHref('detail','Detail')
->setCustomRender(function($row) use ($presenter) {
$spn = \Nette\Utils\Html::el('span')->class("icon icon-blue icon-info");
$a = Html::el('a')->href($presenter->link('Docman:detail',$row->did))->setHtml($spn);
return $a;
});
Editoval kralik (17. 1. 2014 13:26)
- lunak83
- Člen | 47
Jsem asi slepý, ale můžete mi prosím někdo poradit kde nastavím aby se mi ID přidaná pomocí addColumnNumber nebormátovala „americky“ jako 20,560 ale vypsalo se proste 20560? Po update na dev/master se m ito změnilo u všech gridů. Děkuji
--
Edit:
Přitom koukám že default je NULL a při null se nevolá number
format.
Edit 2:
Aha, on je to asi default number format.
Edit 3:
A už jsem si vzpomněl že jsem to vlastně minule musel měnit ve zdroji.
Je to možné nějak ovlivnit obecně abych nemusel měnit zdroj a zároveň nemusel všem addComumnNumber předávat parametry?
Editoval lunak83 (17. 1. 2014 14:06)
- Lord Dave
- Člen | 7
Mám bohužial takýto problém :(
Vo svojom projekte som použil HTML šablonu ktorá vo sovjich črevách
používa jQuery 2.0.3 verziu.
Dlho som hladal príčinu prečo mi datagrid nefungoval (ajax neposlúchal) a aj
som tu o tom písal, ale zistil som že problem bol v tejto verzií
knižnice.
V demo skeletone moj grid krásne fungoval len v tom mojom projekte to
nefungovalo. A v deme bola praveže verzia jQ 1.8 A tak som pri tabulkach vo
sovjom projekte striedal 1.8 verziu s 2.0
Problem ale nastáva teraz, ked sa mi na stránke stretne niekolko widgetov,
ktoré na svoj beh potrebuju 2.0 a zároven datagrid, ktorý mi funguje len
v 1.8 :( :(
Šablonu nemožem degradovat na 1.8, rovnako ako datagrid nefunguje na 2.0 …
čo teraz?
- Pavel Kouřil
- Člen | 128
https://github.com/…ery-migrate/#…
Co zkusit todle? Třeba ti to problém vyřeší… :)
- sasule
- Člen | 18
Zdravím,
hraju si s Gridem v 1.0.4, zkusil jsem zapamatování stavu.
Narazil jsem na problém, že když mám sloupec a filtr select:
<?php
$grid->addColumnNumber('invoiceState', "sloupec")
->setSortable()
->setCustomRender(...)
->setFilterSelect(array(
NULL => 'Vyberte si...',
1=>"a",
2=>"b",
...
52=>"n",
));
?>
dám filtrovat dle tohoto sloupce/selectu, tak se mi sice správně uloží stav jak do session, tak do linku.
Poté zvolím ve filtru v selectu první možnost, tj. „Vyberte si“, tak
toto už se mi do session neuloží a nezapamatuje, patrně proto, protože to
má „index“ NULL.
Když pole pro select filtr sestavím takto:
<?php
array(
'' => 'Vyberte si...',
1=>"a",
2=>"b",
...
52=>"n",
)
?>
Tak se to zase převede na hodnotu „0“ a to zase nic nevybere.
Nakonec jsem došel k tomu, že jsem si upravil metodu Gridu
saveRememberState
do tohoto stavu a tento funguje>
<?php
protected function saveRememberState() {
if ($this->rememberState) {
$session = $this->getRememberSession();
$session->params = $this->params;
$session->params['filter'] = $this->getActualFilter();
}
}
?>
Setkal se někdo s něčím podobným?
- o5
- Člen | 416
@sasule: Díky za vzorový use-case report! V masteru by to mělo být opraveno tímto commitem. Můžeš to pls testnout?
Jinak tohle
->setFilterSelect(array(
NULL => 'Vyberte si...',
....
));
nebo tohle
->setFilterSelect(array(
'' => 'Vyberte si...',
....
));
je ve výsledku stejné, NULL se v GETu neposílá, takže je z toho ve finále taky prázdný string.
Mohl by jsi znovu zkusit tohle?
sasule napsal(a):
Tak se to zase převede na hodnotu „0“ a to zase nic nevybere.
To se mi totiž nezdá..
- ZbysekLipka
- Člen | 19
Ahoj, nechce mi fungovat jednoducha vec – priklad: mam dve tabulky, kde v obou je sloupec pojmenovany „name“. V dibi fluent mam v selectu(„a.name AS first_name, b.name AS last_name“). Zobrazeni $grid->addColumnText(‚first_name‘, ‚First Name‘)->setSortable(true) funguje vyborne i pri pouziti first_name a last_name soucasne. Ale vyhledavani $grid->addFilterText(‚first_name‘, … nefunguje s tim, ze v error.log mam hlasku: Unknown column ‚first_name‘ in ‚where clause‘. A ted otazka, celkem zrejma – da se nejak vyporadat s touto situaci nebo musim prestavet tabulky k obrazu Gridu? :)
- ZbysekLipka
- Člen | 19
o5 napsal(a):
@ZbysekLipka: Tabulky přestavovat k obrazu Gridu opravdu nemusíš :) Problém je jinde. Jinak doporučuju pro ladění nepoužívat ajax, vidíš pak snadno laděnku.
Tohle jsem pochopil jiz drive, jenze jak to tedy zadat? pokud zadam napr. addFilterText(„a.name“, … vyhodi mi to vyjimku: „Component name must be non-empty alphanumeric string, ‚d.name‘ given.“. Tudiz se vracim k dotazu, a ne co mam spatne ;) protoze tohle jiz v MySQL projde ;) Jak pouzit vyhledavani v Grid, pokud mam dotaz nad dvema tabulkama, kde v obou tabulkach je sloupec name a nad obema sloupcema chci vyhledavat? Je tohle mozne bez prestavovani tabulky k obrazu Gridu? :)
- cubic
- Člen | 45
Ahoj,
zkouším rozchodit Grido, krom jiného se mi nedaří nastavit odkaz na signál
místo na akci.
Když použiju
<?php
$grid->addActionHref('delete!', 'Smazat');
?>
vyhodí to chybu Nette\InvalidArgumentException / Component name must be non-empty alphanumeric string, ‚delete!‘ given.
Je to chyba v komponentě a nebo v mém zápisu (který by měl být ok
podle API dokumentace)?
Díky předem za případnou radu.
- Petr Bugyík
- Člen | 4
@ZbysekLipka: použij metodu setColumn()
@cubic: do jaké dokumentace si si díval?
citace addActionHref:
Parametry jsou $destination a $args které se předají metodě $presenter->link(), pokud se nenastaví, jako $destination se použije první parametr.
- ZbysekLipka
- Člen | 19
Petr Bugyík napsal(a):
@ZbysekLipka: použij metodu setColumn()
@cubic: do jaké dokumentace si si díval?
citace addActionHref:
Parametry jsou $destination a $args které se předají metodě $presenter->link(), pokud se nenastaví, jako $destination se použije první parametr.
diky, pomohlo :)
- sasule
- Člen | 18
@o5
Ahoj,
omouvám se za delší reakční dobu – víkend, práce…
První popisovaný problém, tj. neukládání prázdného filtru do session, to se zdá být v pořádku.
Druhá věc, tj. NULL a prázdný řetězec, to se zdá být taky OK.
Vyskytla se ale další věc, a to, že když vyberu filtrem (zkoušel jsem jen select), tak se to uloží do linku, ale do session, až když klepnu na „Vyhledat“ nebo vyfiltruju selectem podruhé. Při testování jsem smazal všechny sessions, cache, takže se začínalo na „čistém“.
Editoval sasule (29. 1. 2014 11:12)