Jaký datagrid pro Doctrine?
- Filip111
- Člen | 244
Ahoj, hledám datagrid který by pracoval s doctrine, ale nejlépe abych mohl v řádku pracovat s entitami, nikoliv jen s array.
Zkoušel jsem NiftyGrid, ale přijde mi to s Doctrine hrozně neohrabaný. S řádky musím pracovaj jako s polem, takže veškeré výhody práce s celou entitou jsou pryč.
Poradili byste?
- uestla
- Backer | 799
Doporučil bych ti hrachův Nextras/Datagrid, který ti umožňuje nastavit callback pro získávání hodnot z řádku/záznamu.
Můj (který z hrachova vychází) to sice taky umí, ale ten zatím nepoužívej, dost se teď mění…
- Filip111
- Člen | 244
Nextras/Datagrid by měl umět přesně to co potřebuji – navíc se mi hrozně líbím, že je takový malý, hezký, přehledný. Naprosto super.
Nicméně po počátečním wow jsem narazil na problém: nedaří se mi
zprovoznit callback právě na vrácení hodnoty sloupce
setColumnGetterCallback. Co má vlastně funkce volaná tímhle
callbackem vracet – komponentu nebo jen text?
Zkoušel jsem následující:
$grid->setColumnGetterCallback($this->getColumnData);
...
public function getColumnData($row, $column) {
switch($column) {
case 'categoryId':
return 'AAAAA';
break;
}
}
Nicméně je úplně jedno co funkce vrací – jakmile nastavím callback
columnGetterCallback, tak to začne padat na zdánlivě nesouvisející
chybu,
Component with name ‚edit‘ does not exist.
viz laděnka
Pokud callback nenastavuji, vše funguje.
Díky za pomoc.
@uestla:
Začíná mi tam pár věcí chybět – nenašel jsem možnost jak přidat
tlačítko s vlastními akcemi apod. zatímco tvůj twingrid poskytuje další
užitečný funkce. Ale upřímně, už neni takovej, malej, hezkej :)
Zkusím twingrid.
Editoval Filip111 (9. 1. 2013 16:32)
- hrach
- Člen | 1838
Pozor! Pouzil jsi columGetter, to je callback na neco jineho, nez na ziskani dat. Mrkni do manualu:
- hrach
- Člen | 1838
Tlačítko s vlastními akcemi přidáš jednoduše – do šablony vložíš definici blocku:
{define col-actions}
<a href="{link edit! $primary}" data-datagrid-edit class="ajax btn btn-small btn-primary">Edit</a>
<a href="{plink akce! $primary}"> class="btn btn-small btn-info">Info</a>
{/define}
- Filip111
- Člen | 244
@hrach:
Vracím se zpátky k wow a díky.
V diskusi jsem našel už i řešení
takže nepotřebuji používat columnGetter (utekla mi hlavní idea, že se vše
řeší v šablonách a nikoliv v php).
Stejně bych se ale rád zeptal, k čemu vlastně slouží – pořád si
myslím že jsem se ho snažil použít ke správnému účelu. Měl jsem
ukázat celý příklad. Věc se má tak – používám Doctrine, v řádku
pracuji s entitou, která má hodnoty id, title, category, přičemž category
je relace ManyToOne a já potřebuju zobrazit něco jako
$entity->category->id.
V dokumentaci o tomhle nic neni.
public function createComponentListGrid() {
$grid = new \Nextras\Datagrid\Datagrid;
$grid->addColumn('id');
$grid->addColumn('title');
$grid->addColumn('category');
$grid->setDataSourceCallback($this->getListData);
$grid->setColumnGetterCallback($this->getColumnData);
$grid->setCellsTemplate('...');
return $grid;
}
public function getListData($filter, $order) {
// zatim neresim filtry a sortovani
return $this->context->food->foodFacade->findAll();
}
public function getColumnData($row, $column) {
switch($column) {
case 'category':
return $row->category->title;
break;
}
}
- hrach
- Člen | 1838
Pokud chces delat neco jako je $row->category->title, tak by si to
primarne mel delat pre sablonu. Samozrejme mohlo by to jit i pres
columnDataGetter, nicmene to by si ho musel udelat univerzalni, tzn. chybi ti
tady vetev default $row->$column
; ani to tady radej nebudu cele
psat, tak bych to totiz nedelal. ColumnGetter byl primarne zamyslen k tomu, ze
treba potrebujes array access a ne property access. Tedy k univerzalnimu
reseni.
ArrayAccess
$grid->setColumnGetterCallback(function($row, $column, $need) {
if ($need && !isset($row[$column]))
throw new \InvalidArgumentException("Undefined column '$column'");
return isset($row[$column]) ? $row[$column] : NULL;
});
Editoval hrach (10. 1. 2013 11:37)
- uestla
- Backer | 799
Filip111 napsal(a):
@uestla:
Začíná mi tam pár věcí chybět – nenašel jsem možnost jak přidat tlačítko s vlastními akcemi apod. zatímco tvůj twingrid poskytuje další užitečný funkce. Ale upřímně, už neni takovej, malej, hezkej :)
Jasně – ono totiž každá další funkčnost vyžaduje řádky navíc. To samé v šabloně – chci-li to mít robustní a upravitelné, rozčlením to na bloky tak, aby v poděděné šabloně mohly být přepsány dle libosti… I přes podporu multi-column primary, glob. akcí, aj. stále uvažuji, jestli to celé raději nezahodit…