Problém s uploadem – nefunguje setRequired

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

Ahoj, narazil jsem na zvláštní problém s uploadem.

Ve formuláři mám pole pro upload a dva radiobuttony. Pole pro upload je povinné. Problém je, že když ve formuláři nevyberu soubor pro upload a odešlu form, tak se provede odeslání, ale ani se nezobrazí JS alert, že je soubor povinný, a ani nedojde ke zpracování formu – nevypíše se form->adderror();

Když dám prázdnou metodu pro zpracování formuláře a do ní dám jen form->adderror(), tak se také nic nevypíše. Když zruším v továrničce setRequired(), tak se alespoň vypíše ten form->adderror. Co s tím? Díky…

Továrnička:

public function createComponentImportForm() {
        $charset = array(
            "Windows-1250" => "WINDOWS-1250",
            "utf8" => "UTF-8"
        );
        $form = new Form();
        $form->addProtection();
        $form->addUpload('importFile')
                ->setAttribute('class', 'form-required')
                ->setRequired('Musíte vybrat soubor, který se má importovat.')
                ->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost souboru je 20KB.', $this->context->parameters['importMaxFileSize']);
        $form->addRadioList('charset', NULL, $charset)
                ->setDefaultValue('Windows-1250')
                ->getSeparatorPrototype()->setName(NULL); //pro zobrazeni na jednom radku
        $form->addSubmit('uploadImportFile', 'POKRAČOVAT')
                ->setAttribute('class', 'btn btn-snd btn-lg btn-block');
        return $form;
    }

Zobrazení v latte (zkrácený příklad):

{form importTeachersForm}
        {if $form->hasErrors()}
            <div n:foreach="$form->errors as $flash" class="alert alert-danger">
                <button type="button" class="close" data-dismiss="alert">&times;</button>
                {$flash}
            </div>
        {/if}

                        {input importFile}

                        {foreach $form[charset]->items as $key => $label}
                            {input charset:$key}{label charset:$key/}
                        {/foreach}


                {input uploadImportFile}

    {/form}

Zpracování:

public function processImportTeachersFile(Form $form) {
	$values = $form->getValues();
        if ($values['importFile']->isOK()) {
		....
		....
	}else{
		$form->addError("Soubor se nepodařilo nahrát - zkuste to prosím znovu.");
	}
}

P.S.: U formuláře mám ještě kontrolu velikosti – ta funguje a JS Alert se vypíše…Když dám upload souboru, který splňuje podmínky, tak vše proběhne ok…

Editoval n.u.r.v. (18. 12. 2013 13:45)

llook
Člen | 407
+
0
-

Zkus $form->allErrors místo $form->errors. Je to takový zákeřný BC break v Nette 2.1, že stejně se jmenující metoda vrací něco jiného, než dřív…

n.u.r.v.
Člen | 485
+
0
-

llook napsal(a):

Zkus $form->allErrors místo $form->errors. Je to takový zákeřný BC break v Nette 2.1, že stejně se jmenující metoda vrací něco jiného, než dřív…

Ahoj, díky za info…ale:

  1. spíš řeším problém, proč se vůbec form odesílá, když je pole povinné a já do něj nic nedám
  2. tu metodu vykreslení pro error používám všude a všude funguje…ale vyzkouším…

díky

Edit: $form->allErrors také nic… Zkoušeno v Opeře a v IE…

Editoval n.u.r.v. (18. 12. 2013 14:09)

David Grudl
Nette Core | 8228
+
0
-

llook napsal(a):

Zkus $form->allErrors místo $form->errors. Je to takový zákeřný BC break v Nette 2.1, že stejně se jmenující metoda vrací něco jiného, než dřív…

Během testování 2.1 jsem zjistil, že tohle je fakt zákeřný problém, takže to revertnu a getErrors() bude opět vracet všechny chyby.