Dynamický input (jednou text, podruhé select)
- nanuqcz
- Člen | 822
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
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)
- Tomáš Votruba
- Moderator | 1114
@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
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
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
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.