#1 22. 2. 2010 14:35
- vazbik
- Nový člen
- Registrovaný: 26. 1. 2010
- Příspěvky: 8
DataGrid – onActionRender
Dá se nějak poznat, ze zrovna generuji určitou akci? Mám víc akcí, např. Edit a Delete a chtěl bych si upravit renderování Delete. Handler onActionRender se mi vyvolá dvakrát (jednou pro Edit podruhé pro Delete), ale já uvnitř handleru nevím, o kterou akci se jedná!
Navrhuji přidání ještě jednoho argumentu handleru onActionRender
a to $destination. Podle toho pak budu moct rozpoznat, o kterou akci
jde (porovnáním např. if ($destination == 'delete!')).
Změna se týká DataGridRenderer.php řádku 549 (u verze 0.9.2):
// originální
$this->onActionRender($html, $data);
// nový
$this->onActionRender($html, $data, $action->destination);
a nezapomenout změnit deklaraci na řádku 112.
Prosíííím.
Offline
#2 22. 2. 2010 15:18
- despiq
- Nette guru

- Registrovaný: 24. 11. 2009
- Příspěvky: 287
Re: DataGrid – onActionRender
moc tomu nerozumim, pokud se jedna o akce nad jednim radkem tak tam je to
jasne
$grid->addAction(‚Nový‘, ‚Customer:new‘ …
tam si snad nastavis handler co chces
a pokud se jedna o vice radku pak je to taky jasne
„Zbývá zajistit zpracování handlerem gridOperationHandler(), jehož
parametrem je tlačítko, kterým byla operace odeslána.“
a opatrne s tim hrr hrr hned neco menit, trosku skromnosti
Editoval despiq (22. 2. 2010 15:19)
Offline
#3 22. 2. 2010 15:26
- jasir
- Nette guru

- Místo: Praha
- Registrovaný: 4. 12. 2008
- Příspěvky: 626
Re: DataGrid – onActionRender
Nepomůže ti $signal = $this->getPresenter()->getSignal()
?
Offline
#4 22. 2. 2010 16:08
- vazbik
- Nový člen
- Registrovaný: 26. 1. 2010
- Příspěvky: 8
Re: DataGrid – onActionRender
Asi jsem to špatně popsal, ale mám pocit, že mě nechápete. Jde o to, že přizpůsobuji vzhled action ikonek. Konkretně mi jde o to, abych např. disabloval Delete ikonku, pokud vím, že záznam nelze smazat, protože jsou na něj třeba jiné vazby v databázi. To se dělá tak, že se navěsím na onActionRender handler. Tento handler se zavolá pokaždé, když se má vykreslit ikonka nějaké akce. A já mám možnost si vzhled té ikonky změnit (ikonkou myslím Html element, který vykreslí odkaz). Potuď je to OK.
Ale nyní, když chci teda ten vzhled přizpůsobit, tak nevím, pro kterou akci se handler vyvolal (vím jen pro jaký řádek se handler vyvolal).
Snad jsem to už lépe vysvětlil. Přečtěte si kdyžtak prosím znovu první příspěvek.
Editoval vazbik (22. 2. 2010 16:50)
Offline
#5 22. 2. 2010 17:46
- vazbik
- Nový člen
- Registrovaný: 26. 1. 2010
- Příspěvky: 8
Re: DataGrid – onActionRender
Tady je ukázka, jak by vypadala obsluha handleru. Chci vykreslit ikonku pro akci delete group pouze v případě, že group nemá žádné itemy.
// při vytváření gridu se navážu na událost
$grid->renderer->onActionRender[] = array($this, 'gridOnActionRendered');
// handler události
public function gridOnActionRendered(Html $action, DibiRow $data, $destination)
{
if ($destination == 'deleteGroup!' && $data['items_count'] > 0) {
// nezobrazit ikonku (neumožnit Delete)
$action->setName('span', TRUE); // změň <a> na prázdný <span> (TRUE jako prázdný)
} else {
// zobrazit ikonku
$action->setName('a', FALSE); // výchozí html element je <a>
}
return $action;
}
Bohužel $destination v DataGridu standartně není.
Editoval vazbik (22. 2. 2010 17:57)
Offline
#7 22. 2. 2010 19:33
- vazbik
- Nový člen
- Registrovaný: 26. 1. 2010
- Příspěvky: 8
Re: DataGrid – onActionRender
V $action bohužel není vše co potřebuju, protože to není
DataGridAction, ale Html objekt.
Tak jak u události onCellRender dostaneš informaci, pro
který sloupec se handler vyvolal v argumentu $column, tak
podobně by to chtělo umět rozlišit, pro jakou akci se hadler vyvolal (např.
argumentem $destination).
$renderer->onCellRender[] = callback(Html $cell, string $column, mixed $value);
$renderer->onActionRender[] = callback(Html $action, DibiRow $data); // nyní
$renderer->onActionRender[] = callback(Html $action, DibiRow $data, $destination); // lepší?
Editoval vazbik (22. 2. 2010 19:47)
Offline
#9 22. 2. 2010 19:47
- vazbik
- Nový člen
- Registrovaný: 26. 1. 2010
- Příspěvky: 8
Re: DataGrid – onActionRender
Tak to máš samozřejmě pravdu, ale to není moc hezké řešení. Lepší by byla podpora přímo v DataGridu, zvlašť když je to uprava jednoho řádku.
Offline
#10 22. 2. 2010 21:46
- Honza Marek
- Moderator

- Místo: Kladno
- Registrovaný: 31. 3. 2007
- Příspěvky: 1281
- Web
Re: DataGrid – onActionRender
vazbik napsal(a):
Tak to máš samozřejmě pravdu, ale to není moc hezké řešení. Lepší by byla podpora přímo v DataGridu, zvlašť když je to uprava jednoho řádku.
Tak si to uprav sám. Na githubu můžeš vyrobit fork jedním kliknutím, pokud chceš, aby ta změna byla veřejná. Roman každopádně tvojí prosbu asi nevyslyší vzhledem k tomu, že aktuálně zanevřel na php a hraje si s ruby.
Offline
#11 22. 2. 2010 21:51
- vazbik
- Nový člen
- Registrovaný: 26. 1. 2010
- Příspěvky: 8
Re: DataGrid – onActionRender
Diky za info.
Offline
#12 26. 5. 2010 13:30
- mlha
- Člen
- Místo: Příbram
- Registrovaný: 31. 3. 2010
- Příspěvky: 17
Re: DataGrid – onActionRender
Ja jsem si upravil DataGridRenderer.php na radku cca 550 nasledovne
<?php
foreach ($this->dataGrid->getActions() as $action) {
$action->generateLink(array($primary => $data[$primary]));
$html = clone $action->getHtml();
$title = $html->title;
$html->title($this->dataGrid->translate($title));
$this->onActionRender($html, $title, $data);
$value .= $html->render() . ' ';
}
?>
Do callbacku predavam puvodni Title akce $title a navic cely Radek $data.
<?php
$renderer->onActionRender[] = callback(Html $action, $title, DibiRow $data);
?>
Editoval mlha (26. 5. 2010 16:01)
Offline


