Podpora objektů jako položek u SelectBoxu
- _Martin_
- Generous Backer | 679
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
Callback se dá použít takto
addSelect('name', 'Label:', array_map($table, $callback))
- Patrik Votoček
- Člen | 2221
Ale pouze za předpokladu, že je v $table
pole. Pokud je to ArrayAccess, Iterator nebo
jakékoli jiné Traversable, tak jsme v !@#$%^&*.
- _Martin_
- Generous Backer | 679
@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)