DataGrid – onActionRender
- vazbik
- Člen | 6
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.
- despiq
- Člen | 320
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)
- vazbik
- Člen | 6
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)
- vazbik
- Člen | 6
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)
- vazbik
- Člen | 6
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)
- Honza Marek
- Člen | 1664
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.
- mlha
- Člen | 58
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)