Dependent form select with AJAX – Chyba: Please select a valid option
- flamengo
- Člen | 135
Vytvořil jsem formulář, v kterém se druhý select box plnil dle vybrané hodnoty z prvního selectboxu. Vycházel jsem z článku Dependent form select with AJAX.
Narazil jsem na problém s nastavením setPrompt()
.
Pokud použiji ->setPrompt('Select')
, v HTML se vytvoří
<option value="">Select</option>
.
Jenže já potřebuji mít value=0:
<option value="0">Select</option>
.
Pokusil jsem se to obejít tím, že nenastavím prompt, ale vložím to jako položku selectu.
public function handleFirstChange($value)
{
if ($value) {
$secondItems = [
0 => 'Select',
1 => 'First option ' . $value . ' - second option 1',
2 => 'First option ' . $value . ' - second option 2'
];
$this['selectForm']['second']->setItems($secondItems);
} else {
$this['selectForm']['second']->setItems([0 => 'Select from first']);
}
$this->redrawControl('wrapper');
$this->redrawControl('secondSnippet');
}
protected function createComponentSelectForm()
{
$firstItems = [
1 => 'First option 1',
2 => 'First option 2'
];
$form = new \Nette\Application\UI\Form;
$form->addSelect('first', 'First select:', $firstItems)
->setPrompt('Select');
$form->addSelect('second', 'Second select:')
->setItems([0 => 'Select from first']);
$form->addSubmit('send', 'Submit');
$form->onSuccess[] = [$this, 'processSelectForm'];
return $form;
}
// do latte doplním jen zobrazení chyb
{snippetArea wrapper}
{form selectForm}
{label first /} {input first}
{snippet secondSnippet}
{label second /} {input second}
{/snippet}
{input send}
<div class="alert alert-danger" n:if="$form->hasErrors()">
<p n:foreach="$form->errors as $error">
{$error|noescape}
</p>
</div>
{/form}
{/snippetArea}
Výsledek je chyba Please select a valid option.
Netušíte někdo proč to?
Editoval flamengo (26. 9. 2016 17:35)
- Barvoj
- Člen | 60
Předpokládám že je to tím, že při vytvoření formuláře nenastavíš možnosti do druhého selectboxu podle aktuální hodnoty prvního.
Vytvoříš totiž vždycky formulář s druhým selectboxem, kde je pouze možnost 0. Pokud tedy vybereš cokoliv jiného, tak formulář nebude validní.
Mělo by stačit změnit to cca takto:
protected function createComponentSelectForm($name)
{
$firstItems = [
1 => 'First option 1',
2 => 'First option 2'
];
// Je důležité předávat formuláři $this a $name jinak by nefungovalo níže použité $firstSelect->getValue()
$form = new \Nette\Application\UI\Form($this, $name);
$firstSelect = $form->addSelect('first', 'First select:', $firstItems)
->setPrompt('Select');
$secondItems = [0 => 'Select from first'];
if ($firstSelect->getValue()) {
$secondItems = [
0 => 'Select',
1 => 'First option ' . $value . ' - second option 1',
2 => 'First option ' . $value . ' - second option 2'
];
}
$form->addSelect('second', 'Second select:')
->setItems($secondItems);
$form->addSubmit('send', 'Submit');
$form->onSuccess[] = [$this, 'processSelectForm'];
return $form;
}
Celkem se mi na toto téma líbí článek http://zlml.cz/…t-select-box
Editoval Barvoj (26. 9. 2016 17:50)