Zaregistrování / zpracování formulářových prvků přidaných javascriptem

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

Ahoj, řeším takový problém. Mám formulář pro vytváření otázek a odpovědí (tedy například otázka a mnoho odpovědí), kde si uživatel může libovolně naklikat pomocí tlačítek přidat/ubrat otázky/odpovědi. Obsluha přidání/ubrání prvků je řešena javascriptem (natvrdo se přidává do stránky HTML kód s formulářovými prvky). Defaultně je nastaveno pět otázek každá má dvě odpovědi. Toto skvěle funguje. Problémem je, že když například přidám další odpovědi/otázky, tak nette stále „vidí“ jen ty defaultní a nedokáže zpracovat ony nově přidané.

Jak bych to mohl vyřešit? Potřebuju dynamicky dle uživatelovi libosti přidávat/ubírat formulářové prvky bez znovunačtení stránky a bez odeslání formuláře na server. Je třeba tyto prvky nějak zaregistrovat do nette formuláře? Pokud ne, jak mohu tyto nové prvky zpracovat. Vypadá to, že nette prostě také odešle jen ty defaultní …

Díky za pomoc.

Lukeluha
Člen | 130
+
+1
-

Mrkni na kdyby\forms-replicator, ten slouží přesně k tvému problému.

dyamon
Člen | 11
+
+1
-

Nette formuláře kvůli bezpečnosti automaticky hlídají jestli při odeslání získali pouze požadované prvky, to jsou prvky, které k formuláři připojíš na straně serveru (takové to $form->addText()). Všechno co nebylo předem nadefinováno se do události nepředává (Potencionální útočník by mohl podsouvat neočekávaná data).

Dynamické přidávání prvků řeší například Kdyby/Replicator.
Druhá možnost jak se k těmto prvkům dostat, když je vytváříš na úrovni klienta je pomocí metody Nette\Forms\Form::getHttpData o které se píše například zde.

ali
Člen | 342
+
0
-

K ziskani dat z pridanych formularovych prvku slouzi metoda getHttpData()

Doc: https://doc.nette.org/cs/forms#…

Mooore
Člen | 13
+
0
-

Ten Kdyby/Replicator mi nejde ani nalinkovat v bootstrap.php … I přesto, že to rozbalím do /vendor a do bootstrapu přidám onen řádek pro registrování …

Udělal jsem to přes ty low-level formy a getHttpData() … Ale pořád se to chová jako by elementy přidané do formuláře například takto:

<script>
			var radku = document.getElementById('questions_form_' + question).rows.length;
            var radek = document.getElementById('questions_form_' + question).insertRow(radku);
            var th = document.createElement('th');
            th.innerHTML = 'Odpověď ' + answer;
            radek.appendChild(th);
            var textarea = radek.insertCell(1);
            var radio = radek.insertCell(2);

            textarea.innerHTML = '<textarea name=\"answer_' + question
                               + '_' + answer + '\" id=\"frm-createQuestionsForm-answer_'
                               + question + '_' + answer + '\"></textarea>';
            radio.innerHTML = '<input type=\"radio\" name=\"correct_' + question
                            + '\" id=\"frm-createQuestionsForm-correct_' + question
                            + '-' + answer + '\" value=\"' + answer + '\">';
</script>

prostě při odeslání formuláře vůbec nevidí a stále odesílá pouze ty původní …

Dělám to už čtvrtý den a už toho mám docela dost :D Prosím o radu …

ali
Člen | 342
+
0
-

Mooore napsal(a):

Udělal jsem to přes ty low-level formy a getHttpData() … Ale pořád se to chová jako by elementy přidané do formuláře například takto:

Moc jsem tu vetu nepobral, ale jestli ma byt za slovem formuláře jeste slovo nebyli, tak timpadem chybu budes mit v javascriptu, ktery ti nepridava prvky do toho konkretniho formu, ale nekde vedle..

Mooore
Člen | 13
+
0
-

ali napsal(a):

Mooore napsal(a):

Udělal jsem to přes ty low-level formy a getHttpData() … Ale pořád se to chová jako by elementy přidané do formuláře například takto:

Moc jsem tu vetu nepobral, ale jestli ma byt za slovem formuláře jeste slovo nebyli, tak timpadem chybu budes mit v javascriptu, ktery ti nepridava prvky do toho konkretniho formu, ale nekde vedle..

Myslel jsem to tak, že pomocí javascriptu v ukázce přidám do formuláře další prvky. Odešlu formulář a snažím se si „vyzvednout“ hodnoty z javascriptem přidaných prvků pomocí getHttpData(). Jenže nette se chová jako by formulářové prvky přidané javascriptem vůbec neobsahoval …