Vracení pole nebo objektu v metodě getValue()

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

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

enumag
Člen | 2118
+
0
-

Co si ten Select podědit?

Nutelac
Člen | 58
+
0
-

Select jsem podědil, ale jak jsem psal výše, nedaří se mi v metodě getValue() vrátit pole nebo objekt.

Editoval Nutelac (23. 10. 2012 22:00)

Nutelac
Člen | 58
+
0
-

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?

studna
Člen | 181
+
0
-

Jak bys to chtěl obcházet? Třídu sis podědil, tak si uprav i onu metodu dle svého.

Nutelac
Člen | 58
+
0
-

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

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

To ale neřeší vracení entit metodou getValue(). Tudíž musím SelectBox tak či tak ohnout.

studna
Člen | 181
+
0
-

Dej tu kód tvé metody getValue. Mně se to teda nějak nezdá, chtít po getValue aby (z)vracela objekty..

Nutelac
Člen | 58
+
0
-

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

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ář. :)