[addon datagrid] DataGrid

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
PetrP
Člen | 587
+
0
-

Diskuse ke stránce DataGrid


Ahoj, je to radost z datagridem pracovat ;] Jen mám pár ale.

1] upravit distribuci, abych mohl snadno komponentu vzít a použít a nemusel řešit co je součásti examples a podobně (je to všechno na jedné hromadě).

2] solidně to zprovoznit i bez RobotLoaderu.
Já ho nepoužívám (mám rád jasno v tom co requiruju) a musím př vytváření componenty zavolat cca 15 souborů (DataGridRenderer.php , Columns/TextColumn.php, Filters/TextFilter.php atak dále).
Bylo by lepší tyto souboru _once volat v továrničkách jako DataGrid::addColumn().

3] více ActionColumn, třeba nějak podobně jako Groupu u Forms tedy:

$grid->addActionColumn('Edit');
$grid->addAction('Editovat', 'something', Html::el('span')->class('icon icon-edit'));

$grid->addActionColumn('Další blbosti');
$grid->addAction('Bafnout', 'something!', Html::el('span','Bafnout'));
$grid->addAction('Kouknout', 'something!', Html::el('span','Kouknout'));

$grid->addActionColumn('Del');
$grid->addAction('Vymazat', 'something!', Html::el('span')->class('icon icon-del'));

4] DataGrid::addAction() aby jako 3 parametr přijímal i string, tedy

$grid->addAction('Editovat', 'something!', 'edit');
// až teď jsem zjistil že funguje toto:
$grid->addAction('Editovat', 'something!');
// takže tento bod beru zpět, zajímavé je že to není nikde napsané ;]

5] Ve formatCallback mít možnost se dostat i k dalším datům z načteného řádku z db, nejčastěji potřebuju id

	public function callbackUrl($value,$row)

6] Případně mít i možnost vytvořit Column bez návaznosti na záznam v db, a obsah buňky si udělat dle formatCallbacku. (souvisí s bodem 5)

// Momentálně mám třeba toto ošklivé:
$dataSource = 'SELECT id as url ....';
$grid->addColumn('url', 'Url')->formatCallback[] = array($this,'callbackUrl');
public function callbackUrl($id)
{
	return Html::el('a','odkaz')->href($this->link(':Neco:',array('id'=>(int) $id));
}

// Představoval bych si třeba něco takovéhleho
$grid->addBlankColumn('Url')->formatCallback[] = array($this,'callbackUrl');
public function callbackUrl($row)
{
	return Html::el('a','odkaz')->href($this->link(':Neco:',array('id'=>(int) $row->id));
}

// I když zrovna tohle by šlo mnohem lépe řešit přes více ActionColumn (viz bod 3)
$grid->addActionColumn('Url');
$grid->addAction('odkaz', ':Neco:');

7] nefunguje mi $grid->multiOrder = false;. Tedy představuji si že si pak budu moci vybrat jen jeden sloupec při řazení.

8] a taky bych potřeboval někdy úplně zrušit možnost změnit řazení něco jako $grid->order = false;
Sice to jde vyřešit vlastním vykreslováním, ale tohle by to mohlo umět v defaultu.

Díky moc za skvělou komponentu, a za to že je skoro všechno public nebo protected, a můžu si to dle libosti upravovat ;]

romansklenar
Člen | 655
+
0
-

PetrP napsal(a):

1] upravit distribuci, abych mohl snadno komponentu vzít a použít a nemusel řešit co je součásti examples a podobně (je to všechno na jedné hromadě).

Určitě nějaký ten archív přidám (snad i minified/compact verzi), ale až při dalším vydání archívu (který bude až to odladím na PHP 5.3), do SVN bych to necpal.
Mělo by stačit vzít celý obsah složky s komponentou, pak soubor se styly a JS a defakto všechny obrázky. Zbytek (styly ikonek, modely, …) je na uživateli a může si to udělat jak je libo.

2] solidně to zprovoznit i bez RobotLoaderu.
Já ho nepoužívám (mám rád jasno v tom co requiruju) a musím při vytváření componenty zavolat cca 15 souborů (DataGridRenderer.php , Columns/TextColumn.php, Filters/TextFilter.php atak dále).
Bylo by lepší tyto souboru _once volat v továrničkách jako DataGrid::addColumn().

Všechny requiry jsem v jisté fázi odstranil, protože je to cesta kompromisu (půjde tak datagrid použít jak s minified verzí Nette tak i s normální právě za pomoci RobotLoaderu).

3] více ActionColumn, třeba nějak podobně jako Groupu u Forms tedy:

$grid->addActionColumn('Edit');
$grid->addAction('Editovat', 'something', Html::el('span')->class('icon icon-edit'));

$grid->addActionColumn('Další blbosti');
$grid->addAction('Bafnout', 'something!', Html::el('span','Bafnout'));
$grid->addAction('Kouknout', 'something!', Html::el('span','Kouknout'));

$grid->addActionColumn('Del');
$grid->addAction('Vymazat', 'something!', Html::el('span')->class('icon icon-del'));

Tohle by byla větší úprava a zrovna zde by se chtělo zamyslet, jestli by si ActionColumn neměl držet své akce u sebe. Teď si jejich manipulaci obstarává sám DataGrid, protože jsem při návrhu nepočítal s tím, že by tuto funkčnost mohl někdo potřebovat. Dokonce metoda addActionColumn byla přidána až skoro nakonec, kdy bylo třeba mít možnost jí nastavovat vlastnosti jako ostatním sloupcům.

To samé se týká filtrů, které jsou nyní uchovány globálně v DataGrid-u, protože se mi zdálo přehlednější držet si vše v jedné komponentě a nemuset přemýšlet, v jakém objektu je co uložené.

S odstupem času se na to ale dívám jinak a to tak, že podkomponenty, které spolu logicky souvisí (sloupce → filtr, sloupec akcí → akce, zaškrtávací sloupec → jednotlivé Checkboxy), by měly být spolu provázány. Pokud by někdo tyto důvody neznal a pokoušel by si napsat vlastní vykreslovač, mohl by u toho narazit a tápat.

Třeba taková interní komponenta checker, která se ve výsledku jeví jako zaškrtávací sloupec, není interně uložena jako DataGridColumn a při vykreslování je přistupováno přímo k formuláři, který checkboxy obsahuje, což taky může být matoucí.

Jelikož se jedná jen o interní změny a spíš jde o čistotu návrhu a lepší čitelnost kódu, nechal bych to k diskusi. Jediná změna v API by byla, že by se akce přidávaly nad konkrétním sloupcem či k poslednímu přidanému jak píšeš, otázka je co by bylo vhodnější.

$grid->addActionColumn('nazev', 'Popisek')->addAction('Popisek', 'signal');

// či alternativně
$grid->addActionColumn('nazev', 'Popisek');
$grid['nazev']->addAction('Popisek', 'signal');

EDIT: od r36 implementováno.

4] DataGrid::addAction() aby jako 3 parametr přijímal i string, tedy

$grid->addAction('Editovat', 'something!', 'edit');
// až teď jsem zjistil že funguje toto:
$grid->addAction('Editovat', 'something!');
// takže tento bod beru zpět, zajímavé je že to není nikde napsané ;]

Ano, povinné parametry jsou pouze první dva, pokud se 3. neuvede, vygeneruje se obyčejný odkaz s textem, který je zadán v prvním parametru.

5] Ve formatCallback mít možnost se dostat i k dalším datům z načteného řádku z db, nejčastěji potřebuju id

	public function callbackUrl($value,$row)

6] Případně mít i možnost vytvořit Column bez návaznosti na záznam v db, a obsah buňky si udělat dle formatCallbacku. (souvisí s bodem 5)

// Momentálně mám třeba toto ošklivé:
$dataSource = 'SELECT id as url ....';
$grid->addColumn('url', 'Url')->formatCallback[] = array($this,'callbackUrl');
public function callbackUrl($id)
{
	return Html::el('a','odkaz')->href($this->link(':Neco:',array('id'=>(int) $id));
}

// Představoval bych si třeba něco takovéhleho
$grid->addBlankColumn('Url')->formatCallback[] = array($this,'callbackUrl');
public function callbackUrl($row)
{
	return Html::el('a','odkaz')->href($this->link(':Neco:',array('id'=>(int) $row->id));
}

// I když zrovna tohle by šlo mnohem lépe řešit přes více ActionColumn (viz bod 3)
$grid->addActionColumn('Url');
$grid->addAction('odkaz', ':Neco:');

Nad takto umělým sloupcem by jsi ale ztratil možnosti řadit a filtrovat, proto bych toto řešil úplně stejně jako píšeš – aliasem. V jedné z prvních implementací byl jako druhý parametr právě celý řádek, ale nenašel důvod ho tam nechávat. Spíše naopak, jako důvod proč ho odstranit posloužila úvaha, že se můžu dostat k datům, ke kterým by se komponenta dostat neměla – stačí předat datasource s výběrem všech sloupců tabulky uživatelů a můžu přistupovat třeba k heslům.

Úprava je to ale jednoduchá, stačí si ve vykreslovači v metodě pro generování řádku gridu přidat do volání formatContent nad sloupcem jako druhý parametr proměnnou $data.

EDIT: Od revize 34 přijímá callback jako druhý parametr aktuální řádek DibiRow z DB pro lepší vazbu:

$grid['name']->formatCallback[] = function($value, DibiRow $data) { ... };

7] nefunguje mi $grid->multiOrder = false;. Tedy představuji si že si pak budu moci vybrat jen jeden sloupec při řazení.

Nepozoruju žádný problém, když si stáhneš demo aplikaci, tak vše šlape? (3. grid má zaplé řazení podle jednoho sloupce).

8] a taky bych potřeboval někdy úplně zrušit možnost změnit řazení něco jako $grid->order = false;
Sice to jde vyřešit vlastním vykreslováním, ale tohle by to mohlo umět v defaultu.

To je fakt, zatím má každý DataGridColumn členskou proměnnou $orderable, kde se dá nastavit, jestli se podle něj může řadit.

EDIT: Od revize 35 má DataGrid možnost řazení globálně vypnout:

$grid->disableOrder = TRUE;

Díky moc za skvělou komponentu, a za to že je skoro všechno public nebo protected, a můžu si to dle libosti upravovat ;]

Díky za první věcný report ;)

Editoval romansklenar (17. 7. 2009 23:45)

Inza
Člen | 330
+
0
-

I love DataGrid prostě – hele Romane, víš ty vlastně, žes byl oceněn?;-)

romansklenar
Člen | 655
+
0
-

Kým čím? :)

Honza Marek
Člen | 1664
+
0
-

Inzou, diplomem. Z toho si nic nedělej :-D

Inza
Člen | 330
+
0
-

Honza M. napsal(a):

Inzou, diplomem. Z toho si nic nedělej :-D

Neocenil tě Inza, ale ocenila tě Nette Foundation. Diplom dostaneš na první PS které se budeš opět účastnit – IMHO ho má u sebe David. Ti jej pak předáme;-)

_Martin_
Generous Backer | 679
+
0
-

Inza napsal(a):

…IMHO ho má u sebe David.

Neexistuje tu, byť jen nekonečně malá pravděpodobnost, že onen diplom se nacházel v tašce, o kterou David přišel na autobusovém nádraží…?

Inza
Člen | 330
+
0
-

_Martin_ napsal(a):

Inza napsal(a):

…IMHO ho má u sebe David.

Neexistuje tu, byť jen nekonečně malá pravděpodobnost, že onen diplom se nacházel v tašce, o kterou David přišel na autobusovém nádraží…?

Cože!!!:-) Peklíčko… kdyžtak Ti Nette Foundation vydá nový;-)… ale doufejme že byl někde jinde, co Davide?;-)..

Patrik Votoček
Člen | 2221
+
0
-

Zdravím začínám do toho trochu pronikat a mám pár otázek/námětů:

  1. bere DateColumn i time stamp nebo pouze date time?
  2. mám půjčovnu aut (id, značka, typ, stav) a sloupeček akcí (půjčít, vrátit, servis, atd.) dá se nastavit aby u jednotlivích položek byly zobrazeny pouze akce které jsou aktivní? (asi těžko budu půjčovat auto které už má někdo půjčené) aneb podmíněné akce?

Když mě napadne něco dalšího tak doplním.

romansklenar
Člen | 655
+
0
-
  1. Převod času obstarává ta samá funkce jako template helper date, takže ano, měl by.
  2. Akce se neváží k žádnému datovému sloupci a jsou globální pro celou tabulku. Pro tenhle případ máš dvě možnosti:
    1. úprava rendereru v místech kde se vytváří akce při generování řádku
    2. nebo jednodušeji stejně jako v příkladu upravit dotaz datasourcu, tak abys měl nějaké sloupce, kterých se ta akce týká a mohl s těmi sloupci dál pracovat a vytvořit ten odkaz nahrazením:
$el = Html::el('span')->style('margin: 0 auto');

$grid->addColumn('pujceno', 'Status'); // 0 = auto máme k dispozici, 1 = auto má někdo půjčeno
$grid['pujceno']->replacement[0] = Html::el('a')->setHtml(clone $el->class("icon icon-pujcit")->title("Půjčit"))->href(...);
$grid['pujceno']->replacement[1] = Html::el('a')->setHtml(clone $el->class("icon icon-vratit")->title("Vrátit"))->href(...);

$grid->addColumn('servis', 'Servis');
$grid['servis']->replacement[''] = Html::el('a')->setHtml(clone $el->class("icon icon-servis")->title("Servisovat"))->href(...);

Editoval romansklenar (9. 6. 2009 8:50)

David Grudl
Nette Core | 8082
+
0
-

Inza napsal(a):

Cože!!!:-) Peklíčko… kdyžtak Ti Nette Foundation vydá nový;-)… ale doufejme že byl někde jinde, co Davide?;-)..

bohužel :-((

Patrik Votoček
Člen | 2221
+
0
-

romansklenar napsal(a):

1. Převod času obstarává ta samá funkce jako template helper date, takže ano, měl by.

Super a dá se použít i u DateColumn callback? Mám totiž v DB uloženy data jako timestamp v UTC a pak k němu přičítam (int)date("Z") podle toho v jakem pasmu je uzivatel.

2. Akce se neváží k žádnému datovému sloupci a jsou globální pro celou tabulku. Pro tenhle případ máš dvě možnosti:
a) úprava rendereru v místech kde se vytváří akce při generování řádku
b) nebo jednodušeji stejně jako v příkladu upravit dotaz datasourcu, tak abys měl nějaké sloupce, kterých se ta akce týká a mohl s těmi sloupci dál pracovat a vytvořit ten odkaz nahrazením:

Možnost za b se zda na prvni pohled super ale chci mít akce nad sloupečky „pohromadě“ ve sloupečku s akcemi a sloupeček status zobrazovat klasicky (půjčeno, servis…). A tak budu muset sáhnout po možnosti a a trochu to rozpitvat. Podědit DataGridAction rozšířit o addRule a v rendereru na to brát ohled. Btw nešlo by hodit renderování akcí do samostatné metody?

A ještě me při pátrání nedošlo jak docílit klasikého paginatorou (první předchozí 1 2 3 4 … n další poslední)

romansklenar
Člen | 655
+
0
-

Super a dá se použít i u DateColumn callback?

Samože dá, ale netestoval jsem to zatím. Doporučuju se podívat do metod formatContent() u jednotlivých typů sloupců pro bližší info.

Btw nešlo by hodit renderování akcí do samostatné metody?

Zdá se mi to kvůli 8 řádků zbytečné a moc by to nepomohlo přehlednosti, protože mětody generate***() se týkají řádků.

A ještě me při pátrání nedošlo jak docílit klasikého paginatorou (první předchozí 1 2 3 4 … n další poslední)

Třída DataGrid má metodu getSteps() přesně pro tyhle účely, takže přepsat ve vykreslovači renderPaginator() třeba podle quick startu.

Editoval romansklenar (20. 6. 2009 15:23)

ales.kafka
Člen | 34
+
0
-

DataGrid je skvělá věc, která mi ulehčila mnoho práce. Přikládám jeden nápad na rozšíření, v praxi velmi dobře využitelný.

Příkladem je databázová tabulka, kde jsou umístěné články, které chci následně vypsat. Problém je, že je chci vypsat od nejnovějšího.

Momentální je stav takový, že je musím seřadit v dibi::dataSource() a tudíž toto řazení je uplatněno vždy, takže nemůžou být seřazeny podle titulku či podle autora manuálně v DataGridu. Stačilo by vložit jednu funkci pro definici defaultního řazení (->setOrder($column,DESC/ASC)).

V případě, že by uživatel řadil výsledky dle sebe, tak by se defaultní řazení nepoužilo (použilo by se jen v případě, kdy není uplatněno manuální řazení).

romansklenar
Člen | 655
+
0
-

Taky jsem se už s tím setkal a mám v plánu takovou funkci přidat ;)

Inza
Člen | 330
+
0
-

David Grudl napsal(a):

Inza napsal(a):

Cože!!!:-) Peklíčko… kdyžtak Ti Nette Foundation vydá nový;-)… ale doufejme že byl někde jinde, co Davide?;-)..

bohužel :-((

Epic peklíčko…:-((( – Nevadí Nette Foundation vydá nový;-)…

romansklenar
Člen | 655
+
0
-

Přesměrováno z jiného vlákna:

Balvan napsal(a):

Zdravim

zase som narazil na jeden problemik, akonahle zobrazujem na jednej stranke datagrid a from prestane mi fungovat filtracia dat, ked odstanim zo stranky form (dalsi) ide vsetko korektne tak ako ma,

radenie stlpcov som vyriesil
DataGridColumn::$ajaxClass = '';

ale ten filter nie a nie ho prinutit aby prestal pouzivat ajax :D

dik za radu

a este jedna malickost, nidke v manulai som nenasiel ako sa da automaticky ukladat do session stavy filtra a ich opatovne automaticke nacitanie a tiez resetFilter aby to zmazalo aj zo session, cital som v changelogu ze by to malo podporovat ale reverseing sa mi velmi nechce

dik za kazdu radu

Jednoduše mázni v datagrid.js část kódu kde se formuláře datagridu zajaxovávají. To samé s odkazy u řazení a stránkování, to by snad mělo stačit.

Filtry jsou trošku níže.

Automatické zapamatování stavů datagridů se dá zapnout takto:

$grid->rememberState = TRUE;

Do gridu se pak sám přidá i prvek na vynulování stavu ze session.

Automatické ukládání stavů a další nové featury nejsou v dokumentaci, protože dokumentace na stránkách se váže vždy k verzi, která je v archívu ke stažení (v svn je momentálně pod tagem beta).

Do vydání další verze (beta2 nebo RC?) datagridu mi zbývá zapracovat ještě pár úprav včetně aktualizace dema a použití v komponentách s ukázkou jak se dá tvořit ajaxově popupová administrace. Nemůžu ji ale vydat dokud se nevyřeší pár problémů.

Jinak datagrid z svn od revize r23 a vyšší potřebují poslední revizi dibi (r222).

Balvan
Člen | 30
+
0
-

parada testol som to a zda sa ze to korektne funguje, este malickost , ked stlacim reset state do zobrazenych poloziek na stranku mi to hodi all, co nie je pozadovany stav, malo vy to hodit nastavnu polozku z
$grid->itemsPerPage

a dalsia malickost zakazat polozku all, mam v tbaulke 7000 a viac zaznamov cize nechcem aby nahodou user si dal listnut vsetky :D

Balvan
Člen | 30
+
0
-

a este posledna vec

Prednastavene hodnoty filtra, nie tie ulozene ale pri prvom zobrazeni aby mi rovno odfiltroval pozadovany stav

priklad datepicker → defvalue nastavim dnesny datum a aby user ked tam pride rovno mal vybrane zaznami za dnes

ale to su uz len malickosti

romansklenar
Člen | 655
+
0
-

Balvan napsal(a):

parada testol som to a zda sa ze to korektne funguje, este malickost , ked stlacim reset state do zobrazenych poloziek na stranku mi to hodi all, co nie je pozadovany stav, malo vy to hodit nastavnu polozku z $grid->itemsPerPage

Jo blbne to. A vypadá to, že jen když člověk nezmění výchozí hodnotu (nenastavím sám $grid->itemsPerPage) :) takže zatím takový malý workaround než to fixnu.

a dalsia malickost zakazat polozku all, mam v tbaulke 7000 a viac zaznamov cize nechcem aby nahodou user si dal listnut vsetky :D

Jde nastavovat dle libosti:

$grid->displayedItems = array(5, 15, 50);

Prednastavene hodnoty filtra, nie tie ulozene ale pri prvom zobrazeni aby mi rovno odfiltroval pozadovany stav

priklad datepicker → defvalue nastavim dnesny datum a aby user ked tam pride rovno mal vybrane zaznami za dnes

ale to su uz len malickosti

Jo to je pěkná feature, zkusím zapracovat.

Editoval romansklenar (22. 6. 2009 17:50)

Balvan
Člen | 30
+
0
-

skusim s tym pomoct ak bude cas prave uvazujem este nad dalsou vecou co mi tam chyba a to je datum od do :D a tiez ak nahodou (ako nechepm co na tom unixtimestape vidia) me niekto prebratu datovu struktru a nemoze ju menit (prene moj pripad) a datum ma ulozeny ako int :D aby to datumovnitko aj od to islo nad int <> stlpcom

PetrP
Člen | 587
+
0
-

Takovej malinkatej bugreportik k stable verzi (tedy jestli to je ta která je ke stažení v extras):

// DataGridRenderer::getWrapper()
$pattern = '/(?<attr>[\w]+)="(?<value>[\w|\s|_| |-]+)"/i';
// vyhazuje v php 5.2.1 tuto chybu (neděje se v novějších verzích php)
// Warning:  preg_match_all() [function.preg-match-all]: Compilation failed: unrecognized character after (?< at offset 3 in ...

// když přidáp za ? Péčka tak funguje jak má
$pattern = '/(?P<attr>[\w]+)="(?P<value>[\w|\s|_| |-]+)"/i';

Týká se jenom stable verze, na google code bylo v revizi 26 předěláno na nové Nette\Html

Nevím jestli to budeš předělávat nebo raději vydáš tu betu ;] Nicméně to sem píšu, případně i pro někoho cizího.

Honza Kuchař
Člen | 1662
+
0
-

Já mám ještě dotaz k tomu překladači. Protože budu používat čistě českou verzi, dá se to nějak jedoduše převést i bez Translatoru? Ale do kódu knihovny nechci sahat. (kvůli novým verzím)

romansklenar
Člen | 655
+
0
-

PetrP napsal(a):

Nette\Web\Html podporuje už více tříd v továrničce el nativně, takže tato část kódu z rendereru úplně zmizí.

honzakuchar napsal(a):

Je tam několik řetězců, které jsou přímo zadrátované v rendereru, chybové hlášky zase v samotné tříde DataGrid. Ale ty nové verze nevycházejí tak často pokud se nebavíme o svn, ale o archívu v extras. Takže bych to neviděl zase jako problém to občas počeštit :)

Honza Kuchař
Člen | 1662
+
0
-

No sice to mám na SVNce (jako external). Tak si to holt budu tahat z archivu mno.

Oggy
Člen | 306
+
0
-

Pokoušel jste se někdo o implementaci ImageColumn? .. jde mi např. o načítání obrázku z databáze..
Jak byste řešili toto:

<?php

$grid->addImageColumn('nahled_foto', 'Náhled' );
 ?>

a v ImageColumn něco takového:

<?php

public function formatContent($value)
	{
		$image = Image::fromString($value);

		return $image;
?>

Editoval Oggy (29. 6. 2009 23:01)

Jakub Šulák
Člen | 222
+
0
-

Pokud by se něco takového implementovalo, tak by to mohlo ale také umět načíst ten obrázek ne z DB, ale jen načíst odkaz v DB na filesystém a load obrázku z filesystému. Ukládání do DB má svá úskalí…

dotTwelve
Člen | 167
+
0
-

Jak vypisu do datagridu sloupec z databaze, kde mam ulozeny odkazy napr http://www.google.com aj. tak aby ve vykreslene tabulce byly odkazy klikaci s danym url?

Oggy
Člen | 306
+
0
-

Já bych si asi udělal nový LinkColumn a potom pomocí format content bych ho převedl na link.. ale nejsem zatím v nette moc doma

PetrP
Člen | 587
+
0
-

dotTwelve napsal(a):

Jak vypisu do datagridu sloupec z databaze, kde mam ulozeny odkazy napr http://www.google.com aj. tak aby ve vykreslene tabulce byly odkazy klikaci s danym url?

$grid['odkaz']->formatCallback[] = 'nejakaFunkce';

function nejakaFunkce($value)
{
	return Html->el('a','odkázek')->href($value);
}
Oggy
Člen | 306
+
0
-

Mám trošku problém s handlery.. neznají hodnotu klíče záznamu..

<?php
$operations = array('delete' => 'smazat', 'edit' => 'upravit');
$grid->keyName = 'id_zakazka';
...
$grid->addAction('Delete', 'zakazkyDelete!', clone $icon->class('icon icon-del'), $useAjax = TRUE);

?>
<?php
public function handleZakazkyDelete($key)
	{
		$model  = new ZakazkyModel('zakazka', 'id_zakazka');

		$del = $model->delete($key);

		if ($del =='0' ) {$this->getComponent('zakazkyGrid')->flashMessage('Nepodařilo se záznam smazat.', 'error');}
		else {$this->getComponent('zakazkyGrid')->flashMessage('Succesfully delete.', 'success');}
		$this->getComponent('zakazkyGrid')->invalidateControl();
		if (!$this->presenter->isAjax()) $this->presenter->redirect('this');
	}
?>

ale do handleru nedorazí hodnota key ..
jakto že hodnota klíče k handleru nedorazí?
jde mi spíše o osvětlení principu volání signálu..a předávání mu klíče..

jinak adresa volané akce je : …/?id_zakazka=22&do=zakazkaDelete

Ondřej Mirtes
Člen | 1536
+
0
-

Přepisuješ konstruktor Controlu a nevoláš ho :) Teda aspoň přesně takhle se to u mě projevuje, pokud toto neudělám…

public function __construct($parametry) {
  parent::__construct();
  ...
}

BTW: Neměl by být ten link spíš ?key=22&do=zakazkaDelete ? Ale nevím, s datagridem jsem ještě nedělal.

Editoval LastHunter (3. 7. 2009 8:20)

Oggy
Člen | 306
+
0
-

jaký konstrutor máš na mysli?

Ondřej Mirtes
Člen | 1536
+
0
-

No té komponenty, ve které máš ten kód public function handleZakazkyDelete($key) { .... (Asi Datagridu?)

Editoval LastHunter (3. 7. 2009 20:31)

Oggy
Člen | 306
+
0
-

já ho mám v presenteru.. stejně tak jako je v example datagridu např. positionMove

Oggy
Člen | 306
+
0
-

jak to řešítě vy?

mancze
Člen | 58
+
0
-

DataGrid je super, ale myslím, že se s aktuální verzí jQuery a ajaxového Datagridu projevuje nepříjemná chyba.

Problém

Uživatel chce provést akci. Intuitivně nejprve vybere řádky, kterého zajímají a posléze vybírá ze seznamu operací. Při výběru jiné, než předzvolené operace, dojde k reloadu položek v datagridu a tím k jejich odškrtnutí. Uživatel musí znovu políčka procházet a podruhé zaškrtávat.

Chyba

Zdá se, že chyba je v použité verzi jQuery. Konkrétně v selektorech, ještě přesněji:

<script>
// datagrid.js, line 136:
$("form.datagrid table.datagrid tr.filters").find("input:checkbox, select").livequery("change", function (e) {
	...
}
</script>

Workaround

Podle mne funkční workaround je nepoužívat find:

// datagrid.js, line 136:
$("form.datagrid table.datagrid tr.filters select, form.datagrid table.datagrid tr.filters input:checkbox").livequery("change", function (e) {
	...
}

Takto upravené kód pro mne funguje stejně, jako původní, s tím rozdílem, že nedochází k znovunačítání dat při změně operace.

timbulko
Člen | 85
+
0
-

Plánuje sa v blízkej dobe robiť aj verzia pre php 5.3? Dosť by sa mi to zišlo, keďže všetky nové projekty už väčšinou robím len v tejto verzii.

romansklenar
Člen | 655
+
0
-

honzakuchar napsal(a):

No sice to mám na SVNce (jako external). Tak si to holt budu tahat z archivu mno.

Můžeš to tahat jako jako external z svn pod tagem beta

http://nette-datagrid.googlecode.com/svn/tags/beta/

Oggy napsal(a):

Pokoušel jste se někdo o implementaci ImageColumn?

Konkrétní věci vznikají až když je někde potřebuju, tenhle jsme ještě nepotřeboval, ale bude se potřeba u něj zamyslet jak to udělat flexibilně jak pro načítání obrázků z db tak pro načítání z FS.

Oggy napsal(a):

Mám trošku problém s handlery.. neznají hodnotu klíče záznamu…

KeyName co zadáš se pak musí použít i v handle metodě, takže:

$grid->keyName = 'id_zakazka';
...
public function handleZakazkyDelete($id_zakazka) { ... }

Což není moc košér vůči MVC tahat název atributu z db do presenteru nebo controlu, takže doporučuju si dotaz připravit už v modelu a atributu, který použiješ jako keyName dát alias (třeba onen univerzální název parametru key).

mancze napsal(a):

Zdá se, že chyba je v použité verzi jQuery. Konkrétně v selektorech, ještě přesněji:

<script>
// datagrid.js, line 136:
$("form.datagrid table.datagrid tr.filters").find("input:checkbox, select").livequery("change", function (e) {
	...
}
</script>

Takto upravené kód pro mne funguje stejně, jako původní, s tím rozdílem, že nedochází k znovunačítání dat při změně operace.

Jo, přesně tam k tomu docházelo, je to nějaké wft v jquery (nevidím nic co by na tom bylo špatně) a v SVN je to už nějakou dobu opravené.

timbulko napsal(a):

Plánuje sa v blízkej dobe robiť aj verzia pre php 5.3? Dosť by sa mi to zišlo, keďže všetky nové projekty už väčšinou robím len v tejto verzii.

Odpovídal jsem v jiném vlákně.

Momentálně ještě budu dost věcí pře/dopisovat takže až to bude a až se to časem odladí lidmi a nebudou bugreporty (nechal bych čas tak do konce července/začátku srpna), tak dopíšu i podporu pro PHP 5.3 (nejspíše tím stylem jako jsou psány články na zdrojáku, takže odkomentováním use vznikne verze pro PHP 5.3).

Editoval romansklenar (20. 7. 2009 3:49)

insider
Člen | 31
+
0
-

Což není moc košér vůči MVC tahat název atributu z db do presenteru nebo controlu, takže doporučuju si dotaz připravit už v modelu a atributu, který použiješ jako keyName dát alias (třeba onen univerzální název parametru key).

Ted nevim, jak to vypada v datagridu, ale nebylo by jednodussi uz v datagridu si to prepsat jako key s tim, ze keyName by se nastavovalo porad stejne?

<?php
$grid->keyName = 'id_record';
/*
 ... uprava v datagridu ...
generovani odkazu -> link($destination,array('key' => $this->keyName));
*/
function handleSomething($key){..}
?>

Me se to zda jako jednodussi zasah, nez v modelu prepisovat SELECT *,id_record as key .... Jediny problem je se zpetnou kompatibilitou :(

romansklenar
Člen | 655
+
0
-

To už je otázka k diskusi a je to asi jen věc názoru.

Hodí se to právě jen na signály. Když bude někdo mít datagrid, kde akce povedou na jiný presenter (třeba stejně jako je to v demu v posledním příkladě), tak mu tím už diktuješ, že jeho parametr se musí jmenovat key a už se vnucuje nějaký tvar URL, který se musí dodržovat. Což se mi nelíbí. Takhle vnucuju jen název paremtru v metodě handleXyz, což je jen v kódu a není to narozdíl od URL vidět. Raději bych tedy měl customer/delete/?customerNumber=103 než customer/delete/?key=103. Samozřejmě na to můžeš namítnout, že se to dá řešit routama… ale pořád se mi zdá jako menší zlo momentální způsob, protože se jím dá dosáhnout obojího a člověk si může vybrat co bude používat.

EDIT: v r40 bude nová nepovinná property DataGridAction::$key, kde půjde nastavit jaký název parametru se má použít při generování odkazu akce – pokud nebude žádný zadán, použije se DataGrid::$keyName.

Editoval romansklenar (20. 7. 2009 4:06)

insider
Člen | 31
+
0
-

Pravda, je to subjektivni, pouzivam totiz v administraci routu primo s id, takze ja jsem si metodu generovani odkazu v akcich prepsal.
Mozna by to slo snadno vyresit pomoci napr

<?php
$grid->oneKey = TRUE;
// popr
$grid->renameKey = 'key';
?>

nebo nejaky jiny vhodnejsi nazev, ktery by menil chovani gridu na generovani jednotneho klice.

A samozrejme taky ti chci podekovat za zverejneni tehle skvele komponenty :)

Editoval insider (6. 7. 2009 17:05)

timbulko
Člen | 85
+
0
-

Dá sa nejako zmeniť text pri tlačítku operácií? Ak som sa snažil v presenteri volať $grid->getForm() prípadne $grid->getComponent(„form“), vždy to skončí výnimkou, takže sa nemám ako dostať k tomu tlačítku.

romansklenar
Člen | 655
+
0
-

Když to voláš, tak ještě není asi formulář datagridu vytvořen (ten se vytváří až při vykreslování), takže změnit se dá přes katalogový soubor gettextu a jeho překompilováním.

timbulko
Člen | 85
+
0
-

Aha, a čo ak by som potreboval zmeniť nejakú inú vlastnosť toho tlačítka. Napríklad pridať nejaký class, style, onclick, atď. ? Myslím, že by bolo dobré, keby sa dali komponenty volať z presenteru neobmedzený počet krát, aby sa dalo pred renderovaním ešte všetko poupravovať a veci, čo sa majú vykonať iba jeden krát sa robili až vo fázi render.

romansklenar
Člen | 655
+
0
-

Má to svůj důvod (pokud by se ti to chtělo zkoumat tak to souvisí s detekcí signálů a odeslání formuláře), ale chápu, že by to tak být nemělo a snažím se přijít na nějaké řešení.

timbulko
Člen | 85
+
0
-

Ak by niekto potreboval verziu DataGridu pre php 5.3 (tak ako som potreboval ja pre jeden web :-)), môže si ju stiahnuť tu: http://mineto.sk/…-php-5.3.zip

romansklenar
Člen | 655
+
0
-

Díky, určitě se u toho inspiruji při přepisování do PHP 5.3. Můžu dát link na stažení i na stránku dokumentace?

Vrátil jsem se ještě k tomu problému, který popisuješ výše:

$form = $grid->getForm();
$form['operationSubmit']->getControlPrototype()->style("color: red");

A funguje to, jen to musíš použít nejlépe až těsně před voláním addComponent() v továrničce, protože jinak opravdu můžeš přistupovat ke komponentě, která neexistuje (uživatelská chyba). Nejspíše jsi to zavolal před $grid->allowOperations(), kdy ještě nemusí být ani formulář ani tlačítko vytvořeno (záleží na pořadí volání příkazů v továrničce).

Proto nejlépe až před voláním addComponent() což by měl být poslední řádek definice datagridu v továrničce – v tu chvíli už jsou vnitřní komponenty (filtry, zaškrtávací pole, tlačítka) formuláře vytvořeny.

Editoval romansklenar (8. 7. 2009 11:17)

timbulko
Člen | 85
+
0
-

Jasne, môžeš to hodiť na stránku s dokumentáciou, ale môžu tam byť ešte nejaké chyby – do php 5.3 som to prepisoval ručne a možno som kde-tu nejaké volanie triedy prehliadol.

S tým poradím príkazov to funguje. Díky.

Editoval timbulko (8. 7. 2009 13:26)

Pari
Člen | 15
+
0
-

PetrP napsal(a):

dotTwelve napsal(a):

Jak vypisu do datagridu sloupec z databaze, kde mam ulozeny odkazy napr http://www.google.com aj. tak aby ve vykreslene tabulce byly odkazy klikaci s danym url?

$grid['odkaz']->formatCallback[] = 'nejakaFunkce';

function nejakaFunkce($value)
{
	return Html->el('a','odkázek')->href($value);
}

Klikaci odkazy mi to negeneruje, zkoušel jsem kod:

function nejakaFunkce($value)
{
        return Html::el('a','odkaz')->href($value);
}

$grid->addColumn('www', 'URL');
$grid['www']->formatCallback[] = 'nejakaFunkce';

Funguje vam to?