DataGrid – onActionRender

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

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
+
0
-

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)

jasir
Člen | 746
+
0
-

Nepomůže ti $signal = $this->getPresenter()->getSignal() ?

Nette\Application\Presenter#methodgetSignal ?

vazbik
Člen | 6
+
0
-

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
+
0
-

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)

despiq
Člen | 320
+
0
-

ted moc nechapu ale neni nahodou v $action vse co potrebujes?

vazbik
Člen | 6
+
0
-

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)

despiq
Člen | 320
+
0
-

noa tak je v nem href ne? a tam mas tu svoji akci tak preg_match a hotovo, sice to neni idealni uz kvuli rychlosti ale melo by to jit

vazbik
Člen | 6
+
0
-

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.

Honza Marek
Člen | 1664
+
0
-

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.

vazbik
Člen | 6
+
0
-

Diky za info.

mlha
Člen | 58
+
0
-

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)