Formulář generovaný na základě hodnoty ze Select boxu

Shoxy
Člen | 37
+
0
-

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
+
0
-

ahoj,
mrkni form replicator, třeba tohle extension https://componette.org/…-multiplier/

Shoxy
Člen | 37
+
0
-

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.