Dynamické formuláře s manuálním vykreslováním

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Rudolf247
Člen | 38
+
0
-

Zdravím, mám takový problém a už si nevím rady, tak to zkusím zde.
Na začátek asi řeknu, že formulář vykresluji manuálně, protože je složitější.

Ve formuláři mám dva multiselecty, vždy když se v multiselectu vybere položka přidá se do formuláře další input, takže na straně šablony to mám vyřešené, problém nastává v presenteru, v komponentě kde mám formulář. Potřeboval bych, aby když se přidá na šabloně nový input se v presenteru do komponenty přidal také. Našel jsem Kdyby/Replicator, ale tam jak jsem pochopil musím kliknout na button aby se přidal další container, ale to mi nevyhovuje. Jde to nějak vyřešit? Děkuji.

Kori
Člen | 73
+
0
-

https://phpfashion.com/…-v-nette-2-1

Kapitola Low-level formuláře

Editoval Kori (9. 5. 2016 14:50)

Rudolf247
Člen | 38
+
0
-

Děkuji za rychlou odpověď, ale asi jsme si nerozuměli. Tak půjdu do podrobna.

V šabloně mám multiselect:

<div class="form-group required">
	<label n:name=involved_employees class="col-md-12">Zapojení zaměstnanci:
    	<select n:name=involved_employees class="employee employees form-control" multiple>
    	</select>
	</label>
</div>

A vždy když v tom multiselectu něco vyberu, tak se mi javascriptem vytvoří nový input v šabloně:

<input name="subtask[emp][0][task]" id="subtask[emp][0][task]" class="form-control" type="text" autocomplete="on" placeholder="Zadání podúkolu..." maxlength="15000">

Tady mám v presenteru ten multiselect, ale to je asi nepodstatný:

$form->addMultiSelect('involved_employees', NULL, $emp_option)
    ->setRequired('Vyplňte prosím toto pole');

A potřeboval bych aby když se mi v šabloně vytvoří ten nový input aby se do presenteru přidalo něco jako

$form->addText('subtask[emp][0][task]')

To číslo se samozřejmě bude přibývat, ale to už bych asi vyřešil.

Kori
Člen | 73
+
0
-

To, samozrejme, bez requestu na server (coz resi Kdyby/Replicator) neudelas. Proto si muzes vytvorit v sablone kolik inputu chces a pres ten „low level pristup“ si na ty inputy / hodnoty sahnout po odeslani.

Rudolf247
Člen | 38
+
0
-

Dobře prostuduju to podrobněji, děkuju.

David Matějka
Moderator | 6445
+
0
-

S kdyby replicatorem request na server nemusis provadet. Staci javascriptem vytvorit ty inputy tak, jak by je vytvoril kdyby replicator. On se po odeslani postara o to, ze se vytvori spravny pocet containeru a naplni se daty.

Rudolf247
Člen | 38
+
0
-

To rád slyším a toto řešení sem i velice líbí. Není někde podrobný návod? Udělal jsem to že jsem v komponentě měl toto:

$form->addDynamic('subtask', function (Container $subtask){
	$subtask->addText('task');
}, 1);

a když jsem dumpoval výsledek vylezlo mi pouze tohle:

subtask => Nette\Utils\ArrayHash #96de
	emp => Nette\Utils\ArrayHash #725f
		task => ""

i když jsem tam inputů měl víc a navíc se tam neodešle value toho inputu…

David Matějka
Moderator | 6445
+
+3
-

ten input by se mel jmenovat treba subtask[0][task].. pod tim indexem 0 to pak bude ve values

Rudolf247
Člen | 38
+
0
-

Skvělé, funguje to! :) Děkuju milionkrát. Ani nevíte jak moc jste mi pomohl :)