Formular – uprava selectu podla predchadzajuceho selectu
- Sator
- Člen | 15
Mam formular, kde mam viacero selectov a potrebujem aby sa moznosti jedneho selectu upravili podla toho aku moznost si zvolime v tom prednim. Da sa to spravit jednoducho v php, onclick() alebo nejako refreshnut len ten jeden select alebo mi treba si nastudovat java a spravit cez to?
$Typ=array('Typ1'=>'Typ1', 'Typ2'=>'Typ2');
$form->addSelect('Typ', 'Typ:', $Typ);
Podla toho aky typ si vybere, tak len triedy ku nemu priradene sa zobrazia
v dalsom selecte.
Samozrejem toto mi nefunguje kedze na zaciatku nema select hodnotu, ale keby sa
dalo refreshnut len to pole nejako tak som myslel ci by to neslo.
if ($form['Typ']=="Typ1") {
$Triedy=array('TriedaA1'=>'TriedaA1', 'TriedaA2'=>'TriedaA2');
$form->addSelect('Trieda', 'Trieda:', $Triedy);
} else {
$Triedy=array('TriedaB1'=>'TriedaB1','TriedaB2'=>'TriedaB2');
$form->addSelect('Trieda','Trieda:', $Triedy);
};
Ma este napadlo spravit funkciu, ktora by sa pustila na onlick(), ale aj keby ta prebehla, tak neviem ako vykreslit len jeden select znovu. Rad by som vedel ci sa to da nejak jednoducho spravit, kym budem muset zas stravit vela casu v dokumentaciach.
- uestla
- Backer | 799
Osobně jsem nutnost použít DependentSelectBox doplněk nikdy nepocítil, zatím jsem vše dokázal vyřešit prostým postupným sestavováním formuláře.
Příklad (psaný z paty):
protected function createComponentDynamicForm()
{
$form = new UI\Form();
$form->addSelect('choice', 'Zvolte', array(
'first' => 'První',
'second' => 'Druhá',
);
$form->addSubmit('load', 'Načíst')->setValidationScope(FALSE);
$form->addSubmit('send', 'Odeslat celý formulář');
$form->onSuccess[] = callback($this, 'processDynamicForm');
$this->loadDynamicFormBody($form);
return $form;
}
function processDynamicForm(UI\Form $form)
{
if ($form['load']->submittedBy) {
$this->loadDynamicFormBody($form);
} else {
// zpracování kompletního formuláře
}
}
private function loadDynamicFormBody(UI\Form $form)
{
if ($form['choice']->value === 'first') {
$form->addText('name', 'Jméno')->setRequired();
} elseif ($form['choice']->value === 'second') {
$form->addTextarea('message', 'Zpráva')->setRequired();
}
}
Takto se (stejně asi jako s DSB add-onem) dá sestavovat formulář libovolně zanořitelně, doplňek jsem nestudoval podrobně, ale myslím, že je omezen jen na select boxy, kdežto tímto způsobem je možné sestavovat formulář de-facto libovolný.
Editoval uestla (13. 10. 2012 20:28)
- Sator
- Člen | 15
Tak ten DependentSelectBox sa mi podarilo spravit, ale funguje mi len v tej forme co maju v deme bez JS. Som skusal rozne moznosti, teraz mam presne okopcene to co je v deme a date to do mojho projektu. V deme to ide bez problemov, u mna v projekte mi to zobrazuje Load tlacitko, to ked pouzijem tak mi invaliduje Form, ale nejde mi to tak aby tam to tlacitko nebolo a Form sa mi invalidoval ked zmenim v selecte vyber. Je nieco co by som mohol pozret ci mam v poriadku? Zda sa mi ako keby mi JS neslo.
- darkwalker
- Člen | 2
uestla: Toto řešení se mi líbí, když jsem ho však zkoušel a vyplnil následně přidaná pole, formulář po submitu odeslal pouze hodnotu původního výběrového selectboxu. Resp. místo komentu „// zpracování kompletního formuláře“ jsem vložil
$val = $form->getValues();
print_r($val);
a to mi vypsalo pouze
Nette\ArrayHash Object ( [choice] => 1 )
Nevíte někdo, v čem by mohla být chyba?