Formulář generovaný na základě hodnoty ze Select boxu
- Shoxy
- Člen | 37
Dobrý den,
chtěl bych se zeptat jak vytvořit formulář, který nebude předem vědět
kolik bude mít inputů.
Mám jeden select box, v kterém je n-hodnot, ty hodnoty jsou generovány
z databáze. Na základě zvolené hodnoty se vygeneruje formulář, který
bude mít n-TextInputů na základě toho zvoleného select boxu.
Pro příklad, řekněme že v selectu budu mít cesty a ta cesta bude mít
třeba x autobusů. Zvolím si cestu a na základě toho zvolení se vygenerují
její autobusy a ke každému autobusu se vytvoří jeho vlastní textInput do
kterého budu moc zapsat hodnotu a poté celý formulář odeslat.
Děkuji.
- Ondřej Kubíček
- Člen | 494
ahoj,
mrkni form replicator, třeba tohle extension https://componette.org/…-multiplier/
- Shoxy
- Člen | 37
Nakonec jsem to udělal nějak takto:
public function createComponentMainForm(){
$form = new Form();
$form->addDynamic("dodavatele", function(Nette\Forms\Container $container) {
$container->addText("testInput");
$container->addHidden("dodavateleId");
});
$form->addSubmit("Odeslat","Odeslat");
// dynamické přidávání inputů
$dodavatele = $this->database->table("dodavatele")->where("DodavateleDeleted",0);
foreach ($dodavatele as $i => $dodavatel) {
$form["dodavatele"][$i]->setDefaults(array(
"dodavateleId" => $dodavatel->DodavateleID,
"testInput" => $dodavatel->DodavateleNazev
));
}
return $form;
}
Už mám tedy vyřešeno to jak vytvořit n-inputů na základě databáze.
Nyní však musím nějak vyřešit to aby se to překreslovalo pomocí snippetu
a na základě zvolené cesty.
Napadlo mě si vytvořit ajax s eventem na select. Po změně hodnoty
v selectu se odešle ajax s handlerem:
$( "select[name='cesty']" ).change(function() {
CestaID = $(this).val();
$.nette.ajax({
'url': {link showDodavatele!},
'data': {
Cesta:CestaID
},
success:function(data) {
}
});
});
V presenteru si vytvořím proměnnou (hasPath) s kterou budu kontrolovat
to zda byl handler zavolán. Při startu stránky je na flase a formulář se
vygeneruje s default hodnotama, po zavolání handleru se jeho hodnota změní
a zavolá se znova //$this->createComponentMainForm();
a nakonec
se to celé překreslí $this->redrawControl('mainSnippet');
Celý formulář s handlerem poté vypadá nějak takto:
Handler:
public function handleShowDodavatele($ID_path){
$t = $this->dodavatel->test2($ID_path);
$this->hasPath = $t;
$this->createComponentMainForm();
$this->redrawControl('mainSnippet');
}
Formulář:
public function createComponentMainForm(){
$vari = $this->dodavatel->test("1");
if(isset($this->hasValue)){ // Nevím proč ale stále vrací false
bdump("jsem tu");
$vari = $hasValue;
}
$form = new Form();
$form->addSelect('cesty', 'Cesta:', $this->cesty->getAllActivePaths()->fetchPairs('CestyNazev', 'CestyNazev'))
->setRequired('Zvolte cestu');
$form->addText("naves","naves:");
$form->addDynamic("dodavatele", function(Nette\Forms\Container $container) {
$container->addText("testInput");
$container->addHidden("dodavateleId");
});
// dynamické přidávání inputů
$dodavatele = $vari;
foreach ($dodavatele as $i => $dodavatel) {
$form["dodavatele"][$i]->setDefaults(array(
"dodavateleId" => $dodavatel->DodavateleID,
"testInput" => $dodavatel->DodavateleNazev
));
}
$form->addSubmit("odeslat","Odeslat");
return $form;
}
Toto řešení však nefunguje ani není pravděpodobně programátorsky správně. Jak se to tedy dělá? Jinak nyní mi podmínka ve formuláři ( isset($this->hasPath()) ) vrací stále false.