Dynamický input (jednou text, podruhé select)

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

Ahoj,
mám takovýto form (zjednodušeně):

$form = new Form();
$form->addText('name', 'Jméno');
$form->addText('city', 'Město');
$form->addSubmit('send', 'Odeslat');

V určitých případech po odeslání bych chtěl, aby se mi pole city změnilo na SelectBox. Například když uživatel vyplní do tohoto pole řetězec „Pr“ (pak se mu nabídne select s možnostmi „Praha“, „Pričice“, …).

Jak toho ale docílit? Pokud prvek city z formuláře odstraním a znovu ho přidám jako SelectBox, ocitne se na konci formuláře, až za tlačítkem send:

public function processForm(Form $form) {
	$values = $vorm->values;
	if (!$this->cityModel->find($values->city)) {
		$form->removeComponent($form['city']);
		$form->addSelect('city', 'Město', $this->cityModel->getSimilarPairs($values->city));
	}

	...
}

Pokud se pokusím tento input nahradit, Nette zařve:

$form['city'] = new SelectBox('city', 'Město', $this->cityModel->getSimilarPairs($values->city));  // InvalidStateException: Component with name 'city' already exists.

Jak tento problém vyřešit?

P.S. Opravdu chci zaměňovat text za select. Takže prosím žádné návrhy ať použiju našeptávač :-) Díky

Editoval nanuqcz (10. 10. 2012 10:03)

Felix
Nette Core | 1245
+
0
-

Co zkusit addComponent( $component, $name, $insertBefore = NULL ) $insertBefore parametr? Nikde jsem to nezkousel..

Ale co treba

public function processForm(Form $form) {
    $values = $vorm->values;
    if (!$this->cityModel->find($values->city)) {
        $form->removeComponent($form['city']);
		$selectbox = new SelectBox('city', 'Město', $this->cityModel->getSimilarPairs($values->city));
        $form->addComponent($form, $selectbox, "send");
    }

    ...
}

Editoval Felix (10. 10. 2012 12:00)

mkoubik
Člen | 728
+
0
-

Nebylo by lepší použít nějaký javascriptový našeptávač?

Aurielle
Člen | 1281
+
0
-

nanuqcz napsal(a):

P.S. Opravdu chci zaměňovat text za select. Takže prosím žádné návrhy ať použiju našeptávač :-) Díky

Tomáš Votruba
Moderator | 1114
+
0
-

@nanuqcz: Jdeš na to dobře. Umístění prvku na správné místo jsem sám (vy)řešil

Felix
Nette Core | 1245
+
0
-

Schmutzka napsal(a):

@nanuqcz: Jdeš na to dobře. Umístění prvku na správné místo jsem sám (vy)řešil

Je to to same co jsem radil ja..

Tomáš Votruba
Moderator | 1114
+
0
-

Felix napsal(a):

Schmutzka napsal(a):

@nanuqcz: Jdeš na to dobře. Umístění prvku na správné místo jsem sám (vy)řešil

Je to to same co jsem radil ja..

Sry, vidím.

nanuqcz
Člen | 822
+
0
-

Díky všem, funguje to skvěle.

Bohužel jen do chvíle, než ve formuláři použiji addGroup() (že by bug v Nette?). Kód:

$form = new Form();
$form->addGroup('Testovací grupa');  // comment this line to get addComponent's insertBefore work
$form->addText('name', 'Jméno');
$form->addText('city', 'Město');
$form->addSubmit('send', 'Odeslat');

$form->removeComponent($form['city']);
$form->addComponent(new SelectBox('Město', array('Foo', 'Bar')), 'city', 'send');

$form->render();

zobrazí toto.

Ukázka bugu taky ke stažení (nasimulovaná v sandboxu) zde.