Vracení pole nebo objektu v metodě getValue()
- Nutelac
- Člen | 58
Zdravím. Pokouším se upravavovat formuláře (konkrétně select box control) a chtěl bych, aby funkce getValue() mohla vracet pole nebo objekt. To ale asi není možné, protože v metodě getControl() se volá funkce array_flip(), která povoluje jako argument jen string nebo integer. Je to možné nějak vyřešit? Díky
- Nutelac
- Člen | 58
Koukám, že jsem to špatně popsal. Chtěl bych po zavolání metody getValue() z třídy MySelectBox (která dědí od Nette/Forms/Controls/SelectBox) vrátit vybranou doctrine entitu. Entity přidávám pomocí metody setItems(). Vše funguje až do odeslání formuláře, než se zavolá metoda getControl() a v ní funkce array_flip(). Existuje nějaká možnost jak to obejít?
- Nutelac
- Člen | 58
Zrovna úpravy této metody jsem se snažil vyhnout. Pokud odstraním array_flip() z řádku 207, tak vše funguje perfektně. Přijde mi ovšem jako strašná prasárna přepsat takto tuhle metodu.
Editoval Nutelac (25. 10. 2012 18:22)
- studna
- Člen | 181
Pokud ti její funkčnost nevyhovuje, tak to nejspíš nijak neobejdeš. Prasárna by byla, kdyby sis tu metodu prasácky upravil.
Ideální řešení je neposílat tam objekt, ale pole, získané např.
// NotORM, Nette\Database to umí
$result->fetchPairs('id', 'name');
tudíž neohýbat SelectBox, ale rozšířit tvůj mapper.
Editoval studna (25. 10. 2012 18:35)
- Nutelac
- Člen | 58
Myslím, že nic zajímavého nenajdete.
public function getValue()
{
$entities = array();
foreach(parent::getValue() as $value)
{
$entities[] = $this->entities[$value]);
}
return $entities;
}
Snažím se jen o to, aby mi metoda getValue() vracela vybranou entitu ze select boxu, což mi usnadní práci s Doctrine. On jediný problém od toho aby to fungovalo je ta funkce array_flip, která se zapíše do proměnné $selected (a navíc se tato proměnná nakonec nepoužije). Asi se nepočítalo s tím, že někdo bude chtít vracet vícerozměrné pole (a nebo je to tím, že to o co se snažím je špatně).
- studna
- Člen | 181
Mně to prostě nechutí. Obecně od formulářů očekáváš skalární hodnoty, které zadá uživatel. Konkrétně od obyč. selectu čekáš jen jednu.
Hezky by to šlo vidět na editaci, kdyby např. ID vracelo přímo entitu (při nějaké editaci).
$values = $form->values;
$entity = $values['id'];
$entity->name = $values['name'];
$rep->save($entity);
// vs. čitelnější
$values = $form->values;
$entity = $rep->find($values['id']);
$entity->name = $values['name'];
$rep->save($entity);
Určitě se to dá řešit i jinak, mimo formulář. :)