Event onSuccess se neprovede pokud prvek není vykreslený

Lukas99
Člen | 8
+
0
-

Ahoj,
měl bych dotaz, proč mi při odeslání formuláře nenastane event onSuccess, když v šabloně nevykreslím prvek select.

Tohle je komponenta pro vytvoření formuláře a výpis kontrolního textu

	public function createComponentMyForm(): Form
	{
		$form = new Form();
		$form->addSelect('my_select', '', ['value1' => 'Value1', 'value2' => 'Value2']);
		$form->addSubmit('save', 'Save');

		$form->onSuccess[] = [$this, 'formSucceeded'];
		return $form;
	}

	public function formSucceeded(Form $form, $data): void
	{
		bdump('ok');
	}

a tohle šablona která ho vykreslí

{block content}

{form myForm}
    <select n:name="my_select"></select>
    <input n:name="save">
{/form}

Pokud formulář odešlu v tomhle stavu vypíše se text „ok“. Pokud ale z šablony odstraním „<select n:name="my_select“></select>" vůbec se do funkce „formSucceeded“ nedostanu. Zkoušel jsem to i s jinými prvky jako „$form->addText(‚my_input‘)“ ten když v šabloně nevykreslím tak se do funkce „formSucceeded“ dostanu.

Když si v šabloně vypíšu {dump ($form->getErrors())} dostanu ‚Please select a valid option.‘ i když select není povinný.

Děkuji za vysvětlení, a případné rady jak docílit aby nastal event onSuccess i když nebude select vykreslený.

Editoval Lukas99 (12. 4. 2023 21:15)

m.brecher
Generous Backer | 765
+
+2
-

Ahoj,

Nette formuláře kontrolují zda hodnoty které vrací po submitu formuláře prvek select/radio odpovídají hodnotám, které jsou v prvku zadány, pokud ne, dojde k chybě. Takže když prvek nevykreslíš, tak se nevrací žádná hodnota a i když není prvek required, ve výchozí sadě hodnot pro option položky selectu nemáš prázdný prvek a proto dojde k chybě při validaci. Pokud prázdnou položku do selectu přidáš (setPrompt('')) tak už by měl být formulář validní a odpálí se event success.

Editoval m.brecher (13. 4. 2023 15:53)

Lukas99
Člen | 8
+
0
-

m.brecher napsal(a):

Ahoj,

Nette formuláře kontrolují zda hodnoty které vrací po submitu formuláře prvek select/radio odpovídají hodnotám, které jsou v prvku zadány, pokud ne, dojde k chybě. Takže když prvek nevykreslíš, tak se nevrací žádná hodnota a i když není prvek required, ve výchozí sadě hodnot pro option položky selectu nemáš prázdný prvek a proto dojde k chybě při validaci. Pokud prázdnou položku do selectu přidáš (setPrompt('')) tak už by měl být formulář validní a odpálí se event success.

Ahoj,
děkuji za vysvětlení. Funguje přesně jak říkáš.