Jaký datagrid pro Doctrine?

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

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

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

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

Pozor! Pouzil jsi columGetter, to je callback na neco jineho, nez na ziskani dat. Mrkni do manualu:

hrach
Člen | 1838
+
0
-

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

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

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)

Filip111
Člen | 244
+
0
-

rozumim, díky
(ještě jsem narazil na další problém, ale to už dávám jinam )

uestla
Backer | 799
+
0
-

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…