Grido – DataGrid pro Nette

pepakriz
Člen | 246
+
0
-

ladan: Zatím taková možnost, pokuď vím, není, ale napsat driver není nic těžkého (interface: https://github.com/…taSource.php). Nechceš autorovi poslat pull request? Driver bych ocenil i já ;)

hrach
Člen | 1838
+
0
-

Kdybys pouzil nextras\datagrid, tak vcelku jednoduse :)

o5
Člen | 416
+
0
-

hrach napsal(a):

Kdybys pouzil nextras\datagrid, tak vcelku jednoduse :)

:D

Editoval o5 (24. 4. 2013 16:01)

hrach
Člen | 1838
+
0
-

@o5 :D promin, musim stale hrat svou polivcicku… ale asi bych to mel smazat…

o5
Člen | 416
+
0
-

hrach napsal(a):

@o5 :D promin, musim stale hrat svou polivcicku… ale asi bych to mel smazat…

mně to fakt neva :)

Editoval o5 (24. 4. 2013 16:01)

ladan
Člen | 4
+
0
-

pepakriz napsal(a):

ladan: Zatím taková možnost, pokuď vím, není, ale napsat driver není nic těžkého (interface: https://github.com/…taSource.php). Nechceš autorovi poslat pull request? Driver bych ocenil i já ;)

Pokud by se někdo našel kdo by to tam dodělal, tak bych to opravdu docenil i já. Jelikož již mám komponentu provázanou v kódu a nechci přecházet k jiné. Proč to neudělám já? Nevěřím si natolik, že by s tím byly všichni spokojeni :)
Děkuji tomu, který tuto výzvu přijme :)

pepakriz
Člen | 246
+
0
-

ladan: Spokojeni být všichni nemusí, ale dostaneš zpětnou odezvu a případně chyby můžeš opravit.

Každopádně jelikož driver také potřebuji, asi se do toho pustím.

ladan
Člen | 4
+
0
-

pepakriz napsal(a):

ladan: Spokojeni být všichni nemusí, ale dostaneš zpětnou odezvu a případně chyby můžeš opravit.

Každopádně jelikož driver také potřebuji, asi se do toho pustím.

Budu rád, když se do toho pustíš. Prosím pak o případné echo až to dáš dohromady. Dík moc!

pepakriz
Člen | 246
+
0
-

ladan: Podpora čeká ve formě pull requestu (https://github.com/…rido/pull/37). Funkčnost ověřena na demu: (https://github.com/…ndbox/pull/3)

o5
Člen | 416
+
0
-

Changelog:

Pro ty, co nesledují GitHub se pokusím shrnout nějaké ty novinky :)

  • „Delší názvy metod komponent“. př.: addColumnDate() – původní addColumn() zachováno
  • Property Accessors [THX pepakriz] – Nyní by se už nemělo stávat „Cannot use object of type **** as array
  • ArraySource [THX pepakriz] – new DataSource driver
  • Action\Href [THX pepakriz] – pomocí setCustomRender() callbacku lze nyní druhým parametrem přijmout Html $element
  • Přidal jsem „prostředníka“ mezi Grido a DataSource a vzniknul tak BC BREAK (místo původního $grid->model->proxy[] je $grid->model->callback[])
  • Vylepšil jsem js confirm u operací
  • Demo nyní obsahuje příklady na všechny DataSource a najdete tam i použití výše uvedeného

Enjoy :)

Editoval o5 (5. 5. 2013 15:36)

ladan
Člen | 4
+
0
-

pepakriz: děkuji moc za Tvůj čas! Myslím, že bych to elegantněji nedal:)

xxxmisko
Člen | 140
+
0
-

je možné funkciu getCount v dibiFluent.php zmeniť na:

public function getCount()
{
    $fluent = clone $this->fluent;
	return $fluent->removeClause('ORDER BY')->count();
}

Pri použítí order by a MSSQL vypluje zlý dotaz. Ďakujem

o5
Člen | 416
+
0
-

xxxmisko napsal(a):

je možné funkciu getCount v dibiFluent.php zmeniť na:

public function getCount()
{
    $fluent = clone $this->fluent;
	return $fluent->removeClause('ORDER BY')->count();
}

Pri použítí order by a MSSQL vypluje zlý dotaz. Ďakujem

Dokumentace.

xxxmisko
Člen | 140
+
0
-

@o5:

Klobúk dole, som chuj, že som to nevidel.

Ešte taká vec. Ako viem naformátovať odkaz pri použití addColumnHref, resp. TYPE_HREF tak, aby odkazoval na úplne inú stránku, resp. mnou manuálne zadanú stránku?
Príklad:
Mám view okresy, kde je grid. V gride mám Meno okresu, veľkosť, atď… . Kliknem napríklad na okres Bratislava v gride, chcem sa prekliknúť na view detail_okresu, v ktorom je ďalší grid, pričom sú v ňom zobrazené mestá daného okresu. Teda druhý grid by som chcel zobraziť s podmienkou:
?grid-filter[okres]=Bratislava. Je možné niečo takéto jednoducho spraviť?

Ďakujem za pomoc

o5
Člen | 416
+
0
-

xxxmisko napsal(a):

@o5:

Klobúk dole, som chuj, že som to nevidel.

Ešte taká vec. Ako viem naformátovať odkaz pri použití addColumnHref, resp. TYPE_HREF tak, aby odkazoval na úplne inú stránku, resp. mnou manuálne zadanú stránku?
Príklad:
Mám view okresy, kde je grid. V gride mám Meno okresu, veľkosť, atď… . Kliknem napríklad na okres Bratislava v gride, chcem sa prekliknúť na view detail_okresu, v ktorom je ďalší grid, pričom sú v ňom zobrazené mestá daného okresu. Teda druhý grid by som chcel zobraziť s podmienkou:
?grid-filter[okres]=Bratislava. Je možné niečo takéto jednoducho spraviť?

Ďakujem za pomoc

setCustomHref() ?

xxxmisko
Člen | 140
+
0
-

áno, to som videl v dokumentácii. Len som sa nedozvedel, ako tam mám spraviť ten callback :(, resp. volanie s potrebnými parametrami.
Ďakujem za pomoc

o5
Člen | 416
+
0
-

xxxmisko napsal(a):

áno, to som videl v dokumentácii. Len som sa nedozvedel, ako tam mám spraviť ten callback :(, resp. volanie s potrebnými parametrami.
Ďakujem za pomoc

Jo kdyz sem to sem posilal tak jsem si vsimnul ze tam ten priklad v dokumentaci jaksi neni (doplnim), ale tak zkus hadat co by se tam asi tak mohlo predavat za parametr, kdyz u tech zbylych (action callbacku) se jako prvni predava $item ??? :))

Editoval o5 (9. 5. 2013 14:58)

xxxmisko
Člen | 140
+
0
-

@o5:

keby som to vedel, tak sa nepýtam :(
Akosi ešte v nette stále tápam :(

o5
Člen | 416
+
0
-

xxxmisko napsal(a):

@o5:

keby som to vedel, tak sa nepýtam :(
Akosi ešte v nette stále tápam :(

Koukni do dokumentace, pridal jsem to tam.

xxxmisko
Člen | 140
+
0
-

@o5:

Ďakujem, ale asi som úplne mimo, lebo mi to nejde. Pridávam kolónku takto:

        $grid->addColumnHref('pocet_poloziek', 'Počet položiek')
                ->setSortable()
                ->setCustomHref(function($item)
{return "/edit/{$item->id}";});

No a v tomto prípade mi to vypíše hlášku:

Call to undefined method Grido\Components\Columns\Href::setCustomHref(). search►

setCustomHref sa nachádza pre ActionHref. Prosím daj mi vedieť, ako sa z tohto vysomáriť, lebo ja som asi úplne mimo :D

Ďakujem

o5
Člen | 416
+
0
-

@xxxmisko: Nedokazu ti poradit, promin. Tohle bude problem mezi klavesnici a zidli :))

xxxmisko
Člen | 140
+
0
-

@o5

no isto to tak je, nie je o tom pochýb :D
akože principiálne by to takto malo fungovať, alebo nie? Proste nejde tá funkcia setCustomHref a neviem, či som to zle vyčítal, alebo čo som vlastne stvoril :D

xxxmisko
Člen | 140
+
0
-

alebo opýtam sa takto:
Pochopil si, čo som sa pýtal? :D

Mám 5 stĺpcov, potom stĺpec AKCIE.
V dvoch zo stĺpcov chcem zobraziť hodnoty, ktoré sú odkazom do iného gridu. Nejedná sa o tlačítka v akciách, ale celú bunku, ktorá bude odkazom niekde.

Toto bola aj pôvodná otázka, ale či to funguje, neviem :D Mne to nefunguje :D

pepakriz
Člen | 246
+
0
-

@xxxmisko & @o5: Mám takový dojem, že se jeden baví o koze (Column) a druhý o voze (Action).

xxxmisko
Člen | 140
+
0
-

@pepakriz

máš asi recht, ja chcem odkaz v column. Moja otázka naďalej platí

o5
Člen | 416
+
0
-

@xxxmisko: Ano, celou dobu se bavim o Action :) Kazdopadne se na me nezlob, ale tyhle dotazy jsou uz fakt hodne low level. Preci kdyz se podivas na example tak tam uvidis sloupec „Country“ a vykresluje se tam navic i vlajecka k statu. Analogicky tak preci musis dojit k tomu, ze se stejnou metodou necha vypsat i odkaz ne??

EDIT: Dneska je to se mnou marny :) Odpoved zni teda: V soucasne chvili to jinak nez pres setCustomRender() nevyresis.

Editoval o5 (9. 5. 2013 20:29)

xxxmisko
Člen | 140
+
0
-

@o5

myslím, že cez setCustomRender to dám :D
Ja som si celý čas myslel, že ten setCustomHref(), resp addColumnHref bude fungovať tak, ako som písal predtým :D

Nevadí, v každom prípade cez customRender to zvládnem, len som chcel to chcel rozchodiť jednoduchšie :D

pjoter
Člen | 118
+
0
-

Ahoj, po kratke pauze se opet hlasim. Datagrid je moc dobre udelany. Premyslim ted jak vyresit hover efekt pro radky, ktera maji stejnou hodnotu v konkretnim sloupci. Napr mam tabulku uzivatelu a ti maji svou skupinu. Kdyz v tabulce uzivatelu najedu mysi na radek podbarvi se mi radky vsech uzivatelu, kteri maji stejnou skupinu.

Jak to řešit přes jquery a grido?

o5
Člen | 416
+
0
-

@pjoter: to by mohlo jít nějak takto:

//pridas si kazdemu <tr> classu podle skupiny
$grid->rowCallback = function($item, \Nette\Utils\Html $tr) {
    $tr->class[] = $item->group;
    return $tr;
};

a javascript už tam nějak doplichtíš ne? :)

xxxmisko
Člen | 140
+
0
-

@o5

ešte znova som tu :D
Teraz mám trošku inú otázku.

Pri pridávaní $grid->setOperations robíš vo vzorovom sandboxe presmerovanie na funkciu gridOperationsHandler.

Ďalej sa v tejto funkcii robí to, že sa spustí nejaká akcia. Ja by som potreboval namiesto nejakej akcie zobraziť iný view, resp. presmerovať na iný view. Problémom však sú parametre id, ktoré neviem, ako jednoducho preniesť. Dá sa to cez persistent parameter, ale to sa mi moc nepáči.

Takže mám 2 otázky:

  1. Dá sa nejako pri pridávaní $grid->setOperations nastaviť callback na každú akciu zvlášť? Ak áno, ako?
  2. Ak sa nedá aplikovať otázka 1., ako vo funkcii gridOperationsHandler môžem urobiť presmerovanie tak, aby som nemusel použiť persistent parameter?

Ďakujem, hádam som napísal všetko jasne :D

Kód:

//tu v gride nastaviť viac callbackov. Neviem, či by pomohlo

        $operations = array('edit' => 'Hromadná zmena', 'delete' => 'Zmazať');
        $grid->setOperations($operations, callback($this, 'gridOperationsHandler'))
            ->setConfirm('delete', 'Chcete zmazať %i položiek?');


    public function gridOperationsHandler($operation, $id)
    {
        if ($id) {
            $row = implode(', ', $id);
            $this->flashMessage("Process operation '$operation' for row with id: $row...", 'info');
        } else {
            $this->flashMessage('No rows selected.', 'error');
        }
	switch($operation){
	    case 'edit':
			//persistent
		$this->EditId = $id;
		$this->redirect('Test:massedit');
		break;
//toto presmerovanie nejako lepšie vyriešiť
	}
}

    public function renderMassEdit(){
	$this->template->test = $this->EditId;
    }
pjoter
Člen | 118
+
0
-

@o5 diky za tip

tsusanka
Člen | 23
+
0
-

Ahoj, díky moc za pěknej grid, mám dotaz na visuální část grido :). Chápu to dobře, že při použití jquery.grido.js bych měl docílit stejnýho vzhledu, jako máš v demu? U mě to bohužel vypadá takto:

tabulka rozhozená

Mám vložené:

  • bootstrap.min.css
  • jquery-1.8.3.min.js
  • jquery.grido.js
  • jquery.ba-hashchange.min.js

Vše by mělo být vložené správně – console nehlásí žádné chyby. Když v libce přidám do Grid.latte k tabulce třídu table, bootstrap si to chytí a už to vypádá lépe:

tabulka bootstrap

Měnit libku se mi ale samozřejmě nechce. Pokud jsem to blbě pochopil a stylování už je na mě nikoliv součást Grido, tak se omlouvám a dej mi vědět ;).

Díky

Editoval tsusanka (11. 5. 2013 14:58)

o5
Člen | 416
+
0
-

@tsusanka: chybi ti tam jeste grido.css.. Doporučuju ti (i všem ostatním) si nainstalovat na localhostu sandbox – s composerem je to pouho pouhy 1 (slovy jeden) prikaz:

composer create-project o5/grido-sandbox

Editoval o5 (21. 10. 2013 16:29)

tsusanka
Člen | 23
+
0
-

Paráda, díky.

Editoval tsusanka (11. 5. 2013 15:13)

marek.dusek
Člen | 99
+
0
-

Mozna uz se to tu nekde resilo, ale pokud mam hodnotu nejakeho sloupce NULL a pouziju NDB, metoda „hasProperty“ v „ArrayObjectAccessor“ mi vrati false a vyleti vyjimka (protoze nad ActiveRow isset/key_exist vzdy vrati false) – je na to nejaky spravny postup? :-)

o5
Člen | 416
+
0
-

@marek.dusek fixed

pepakriz
Člen | 246
+
0
-

o5 napsal(a):

@marek.dusek fixed

Poslední oprava řeší něco jiného než myslí @marek.dusek.

@marek.dusek: Můžeš sem poslat opravu metody hasProperty, která bude spolupracovat s NDB?

o5
Člen | 416
+
0
-

@pepakriz: zkousel jsem si to a vyskocilo na me to co jsem odstranil, nemam tedka moc casu to resit :/

@marek.dusek: mohl by jsi sem poslat co to vyhodilo za vyjimku?

Editoval o5 (13. 5. 2013 12:52)

martin.knor
Člen | 17
+
0
-

matej21 napsal(a):

tak jsem si hral a upravil Grido k obrazu svemu :) az bude cas na doladeni, tak to asi i zverejnim…
Co jsem upravil/predelal/pridal:

  • psr0 kompatibilni struktura
  • ve filtrech prepsany skladani filtru (uz ne jako retezec, ale jako objekty a datasource si to sestavi sam)
  • doctrine datasource
  • upraveny exporty – co export to jedna trida, takze neni potreba dedit atd.
  • razeni dle vice sloupcu
  • pro datum novy filtr datarange (od – do)
  • sumarizace – treba nad sloupeckem ‚cena‘ zapnu sumarizaci a dole pod tabulkou vyjede tabulka se souctem hodnot :)

Co jeste zbyva

  • zatim jsem zrusil nejaky vlastnosti – vlastni filtry nebo co to tam bylo :)
  • datasource pro nette\database a dibi

Máš to někde přístupné? Docela by se to hodilo, hlavně ty sumarizace…

marek.dusek
Člen | 99
+
0
-

pepakriz napsal(a):

Poslední oprava řeší něco jiného než myslí @marek.dusek.

Ahoj, myslel jsem presne ten „bug“, ktery je nyni opraven „F***G Nette\Database“ radkem ;) Cili diky moc!

factor
Člen | 28
+
0
-

Dobré odpledne vespolek,
Jelikož pracuji pro nadnárodní společnost která uznává old fashion windows (XP) only a IT kterým hýbe abulíe narazil jsem při používání IE8 na problém s COOKIE a HEADERS:

Cannot set cookie after HTTP headers have been sent ... bla bla bla

549:     protected function loadRememberState(array &$params)
550:     {
551:         $session = $this->getRememberSession();
552:         if ($this->presenter->isSignalReceiver($this)) {
553:             $session->remove();
554:         } elseif (!$params && $session->params) {
555:             $params = (array) $session->params;
556:         }
557:     }

Problém je na řádku 554 → $session->params
Nejsem si jistej jestli je to bug nebo ne, ale řekl jsem si že by bylo dobré kdyby jste o tom věděli.

Fix:

549:     protected function loadRememberState(array &$params)
550:     {
551:         $session = $this->getRememberSession();
552:         if ($this->presenter->isSignalReceiver($this)) {
553:             $session->remove();
554:         } elseif (!$params && isset($session->params)) {
555:             $params = (array) $session->params;
556:         }
557:     }

s pozdravem,
Ondra

o5
Člen | 416
+
0
-

@factor: teďka jsem to zkoušel na IE 8.0.6001.18702 WinXP PRO SP3 a tu chybu jsem nedostal. Každopádně ta chybová hláška mi k tomu moc nesedí… Můžeš více popsat „narazil jsem při používání IE8“? Dík

BTW: přišel jsem na jinou chybu s ukládáním stavu a opravil :)

Editoval o5 (16. 5. 2013 19:40)

xxxmisko
Člen | 140
+
0
-

o5:

stiahol som novú verziu, nefunguje v nej našepkávanie? Funkcia handleSuggest a handleExport akosi zmizla z Grid.php :D

pepakriz
Člen | 246
+
0
-

xxxmisko: Stáhl sis nový javascript? Metody byly přesunuty do filtrů, kam ostatně patří.

Editoval pepakriz (17. 5. 2013 11:30)

xxxmisko
Člen | 140
+
0
-

nie, nestiahol, idem skúsiť, ďakujem za info

factor
Člen | 28
+
0
-

@o5: Konfiguraci máme uplně stejnou. Bohužel není moc co vysvětlovat, chyba se objevovala už když se mělo grido zobrazit. Problém přetrvával ikdyž jsem použil čerstvý sandbox.
Nezajímavější na tom je (ikdyž né moc překvapující), že tento problém se neukázal v žádném jiném prohlížeči.
Zachvilku ti pošlu celý výstup z laděnky.

o5
Člen | 416
+
0
-

@factor: ta laděnka je dobrej nápad

xxxmisko
Člen | 140
+
0
-

Ahojte!

Chcem sa opýtať ešte ohľadom našepkávača. Vo firebugu v konzole mi pri našepkávaní stále vyskakuje chyba:

TypeError: e.toLowerCase is not a function

je to v skripte bootstrap.min, Version 2.3.1. Jquery mám verziu v1.8.2.

Všimol som si toho vtedy, keď som mal textový column, pričom je tam taký mix dát, napríklad k20, zm500, 100,…

Zrovna, keď som dal našepkávať 1, tak mi nič nevyskočilo. Asi našepkávač nevie správne pracovať s takýmto bordelom, teda int medzi text atď, ale tá chybka ma celkom jeduje. Nestretli ste sa s tým niekto?

Ďakujem

sinner
Člen | 20
+
0
-

Ahoj,
je možné u filtrů v podmínce

$grid->addFilterSelect(..)
		->setCondition(...)

tvořit dotaz pomocí Nette\Database\Connection nebo něčeho podobného (DiBi atd)?

Tvoření dotazů ručně není příliš pohodlné.

Snažím se vytvořit komplikovaný dotaz přes více tabulek (left join) a nejde mi takový dotaz zkonstruovat.

Nevíte jak by to bylo možné?

Díky

Editoval sinner (18. 5. 2013 19:30)

pjoter
Člen | 118
+
0
-

Jelikoz se mi stale nepovedlo nahradit, javascriptovy confirm vlastnim bootstrap dialogem, chci se zeptat zda to jiz nekdo neresil ? Pripadne jak by to resil ?

Ja to zkousel tak ze jsem nahradil v jquery.grido.js funkci confirm(message) vlastni funkci ktera zobrazila bootstrapovy dialog, jenze tato funkce nevraci true po kliknuti na tlacitko OK v dialogu. Jedna se spis o javascriptovy dotaz nez o grido i presto prosim o shovivavost a budu vdecny za jakoukoli radu.

Diky