Podpora objektů jako položek u SelectBoxu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Uvítal bych, kdyby měl SelectBox podporu pro objekty předem stanoveného rozhraní. Téměř vždy, pokud chci použít SelectBox, musím nejprve iterovat nějakou kolekcí objektů jen proto, abych vytvořil pole „klíč ⇒ hodnota“. Kdyby měla Nettí komponenta podporu pro nějaké rozhraní, díky kterému by z objektu tyto údaje mohla vytáhnout, daly by se jí předávat přímo kolekce např. z databáze/ORM/jakékoliv jiné modelové vrstvy.

Nebo namísto rozhraní mít podporu pro nastavitelný callback, kterého by se komponenta na klíč a hodnotu ptala. Poté by se daly využívat i třídy jako TableRow, které není možné přepsat – callback by ji dostal a vrátil by pole třeba ze sloupečků id a name.

David Grudl
Nette Core | 8218
+
0
-

Callback se dá použít takto addSelect('name', 'Label:', array_map($table, $callback))

Patrik Votoček
Člen | 2221
+
0
-

Ale pouze za předpokladu, že je v $table pole. Pokud je to ArrayAccess, Iterator nebo jakékoli jiné Traversable, tak jsme v !@#$%^&*.

Ani
Člen | 226
+
0
-

A nestačilo by pak zavolat iterator_to_array?

_Martin_
Generous Backer | 679
+
0
-

@David Grudl: Kromě toho, co psal Patrik, tak bych pořád dělal iterace nejméně 2. Měl jsem na mysli něco na způsob:

$form->addSelect('name', 'Label:', $items, function($item) {
	return array($item->id => $item->name);
});

P.S. Teď mě napadá, že by stačila podpora tříd implementující např. ArrayAccess. Tato třída by pak sloužila jako iterátor nad původním zdrojem dat.

@Ani: To by asi v případě třídy TableRow nefungovalo.

Editoval _Martin_ (3. 2. 2012 1:17)