Formulář neodešle pokud nevyberu soubor

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

Ahoj,
určitě to bude jenom nějaká hloupost a někdo jste se s tím už setkal. Mám komponentu, která vytváří formulář, nedávno jsem do ní přidal možnost uploadovat s odesílaným formulářem soubor (dle oprávnění uživatele). Pokud však soubor nevyberu, formulář nikdy neprovede akci definovanou při odeslání – prostě se pouze reloaduje stránka. Jakmile vyberu llibovolný soubor, provede se odeslání formuláře jako obvykle. Formulář je poměrně složitý, právě vzhledem k závislostem na roli uživatele, ale neodesílat začal až po přidání souboru.

Ve zkratce (pokud pomůže):

<?php
public function createComponentEditUserForm(){
  $this->form = new \Nette\Application\UI\Form;
  $this->form->addUpload("img", "Nahrát logo")
    ->addRule(Form::IMAGE, 'Obrázek musí být ve formátu JPEG, PNG nebo GIF.')
    ->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost souboru je 4MB.', 4000 * 1024);
  $this->form->addSubmit('submit', 'Změnit údaje');
  $this->form->onSuccess[] = array($this, 'formSucceeded');
}

public function formSucceeded(UI\Form $form,$values) {
    	$this->presenter->flashMessage("test");
}
?>

Nějaký nápad proč by tomu tak mělo být? Děkuji,Martin

Editoval argosovo (8. 4. 2016 11:00)

ali
Člen | 342
+
+1
-

Pridej si tam condition

$this->form->addUpload("img", "Nahrát logo")
	->addCondition(Form::FILLED)
	...
argosovo
Člen | 54
+
0
-

funguje děkuji, nicméně když na to koukám možná že jsem tam něco takového měl, ale říkal jsem si – no tady ten soubor nebude nutný, ale uživatel bude mít na výběr zda ho nahraje nebo ne.
Můžu poprosit vysvětlení? Proč „Form:FILLED“ u souboru zajistí odeslání při nevybraném souboru, zatímco bez této podmínky to nejde? Přitom podmínka samotná mi evokuje spíše opačnou situaci.

argosovo
Člen | 54
+
+2
-

Aha, už to asi mám – pokud se validační pravidla řetězí, tak je nejprve třeba zkontrolovat zda je vyplněn soubor, pokud je, přicházejí na řadu další pravidla. Pokud já jsem tam neměl tuto první kontrolu, tak formulář bez souboru nemohl projít, protože žádný soubor nebyl typu Image. :)

ali
Člen | 342
+
+2
-

Docilis tim, ze pokud uzivatel nevybere soubor, nebudou na tento formularovy prvek aplikovana pravidla, ktera mas definovane pod timto zapisem. Coz byl duvod, proc ti formular nevolal onSuccess metodu.

Šaman
Člen | 2666
+
0
-

Je to tím, že v původní verzi máš input a pravidlo, že tam musí být obrázek. Takže když nic nevybereš, není splněná podmínka.

Když tomu předřadíš to addCondition, pak se celá následující větev podmínek testuje jen je-li splněná podmínka. Tedy je-li vybrán soubor, musí to být obrázek maximálně 4MB.

Je to popsané v dokumentaci.

Edit: Aha, tu už jsi to poměrně přesně posal o dva příspěvky výše. Jen bych zdůraznil, že je potřeba předřadt podmínku (addCondition), nikoliv pravidlo (addRule). Pokud bys přiřadil pravidlo Form::FILLED, samozřejmě by to ten soubor vyžadovalo (i bez dalších pravidel).

Editoval Šaman (8. 4. 2016 11:46)