[addon datagrid] DataGrid
- PetrP
- Člen | 587
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
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 jakoDataGrid::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
_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
Zdravím začínám do toho trochu pronikat a mám pár otázek/námětů:
- bere
DateColumn
i time stamp nebo pouze date time? - 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
- Převod času obstarává ta samá funkce jako template helper date, takže ano, měl by.
- Akce se neváží k žádnému datovému sloupci a jsou globální pro
celou tabulku. Pro tenhle případ máš dvě možnosti:
- úprava rendereru v místech kde se vytváří akce při generování řádku
- 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 | 8218
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
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
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
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
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
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
- romansklenar
- Člen | 655
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
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
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
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
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
No sice to mám na SVNce (jako external). Tak si to holt budu tahat z archivu mno.
- Oggy
- Člen | 306
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
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
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?
- PetrP
- Člen | 587
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
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
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)
- Ondřej Mirtes
- Člen | 1536
No té komponenty, ve které máš ten kód
public function handleZakazkyDelete($key) { ...
. (Asi
Datagridu?)
Editoval LastHunter (3. 7. 2009 20:31)
- mancze
- Člen | 58
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.
- romansklenar
- Člen | 655
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
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 parametrukey
).
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
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
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)
- romansklenar
- Člen | 655
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
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
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
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
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)
- Pari
- Člen | 15
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?