Nefunguje mi ajaxový formulář s addUpload(), ale funguje bez ajaxu

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

Zdravím vás,
dostal jsem se do problému při vývoji ajaxového formuláře s možnosti uploadnout fotografii.

Pokud v presenteru z funkce createComponentRegistrationForm() odstraním $form->addUpload(„picture“), tak mi formulář funguje. Funguje mi i včetně uploadu fotografie, ale to pouze v případě, kdy odstraním třídu „ajax“ z form elementu.

Každopádně když chci, aby byl formulář ajaxový a zároveň uploadoval fotografii, tak se po odeslání nestane vůbec nic, ani se nezavolá metoda registrationFormSucceeded(). Nevypisuje to žádný error a do složky log se rovněž nic neuloží.

Tušíte v čem by mohl být problém?

		{snippet registrationForm}
                <form n:name=registrationForm class="ajax" enctype="multipart/form-data">
					...
                    <input n:name=picture id="file-input" accept="image/*" type="file">
                  	<input n:name=register type="submit" value="Zaregistrovat">
                	...
				</form>
		{/snippet}
		protected function createComponentRegistrationForm()
        {
                $form = new UI\Form;
                $form->addText("name")
                        ->setRequired("Zadejte prosím křestní jméno a příjmení.");
                $labels = array(
                    "male" => "Muž",
                    "female" => "Žena",
                );
                $form->addRadioList("sex", "", $labels)
                    ->getSeparatorPrototype()->setName(NULL);
                $form->addText("age")
                        ->addRule(UI\Form::INTEGER, "Věk musí být číslo.")
                        ->addRule(UI\Form::RANGE, "Věk musí být od %d do %d let.", array(15, 120))
                        ->setRequired("Zadejte prosím věk.");
                $form->addUpload("picture", "Profilová fotka:")
                        ->addRule(UI\Form::IMAGE, "Profilová fotka musí být JPEG, PNG nebo GIF.")
                        ->setRequired("Vyberte prosím profilovou fotku.");
                $form->addHidden("email")
                        ->addRule(UI\Form::EMAIL, "Zadejte prosím platný e-mail.")
                        ->setRequired("Zadejte prosím email");
                $form->addHidden("password")
                        ->addRule(UI\Form::MIN_LENGTH, "Heslo musí mít alespoň %d znaků.", 6)
                        ->setRequired("Zadejte prosím heslo.");
                $form->addHidden("imageEditorOffset");
                $form->addHidden("imageEditorZoom");
                $form->addSubmit("register");
                $form->onSuccess[] = array($this, "registrationFormSucceeded");
                return $form;
        }

Děkuji všem za odpovědi :)

Majkl578
Moderator | 1364
+
+1
-

Soubory standardním způsobem ajaxem nahrávat nelze.

F.Vesely
Člen | 369
+
0
-

Majkl578 napsal(a):

Soubory standardním způsobem ajaxem nahrávat nelze.

To neni pravda, normalne to jde, zkus si to.

U tohohle je problem, ze tam mas toto:

$form->addHidden("email")
	->addRule(UI\Form::EMAIL, "Zadejte prosím platný e-mail.")
	->setRequired("Zadejte prosím email");
$form->addHidden("password")
	->addRule(UI\Form::MIN_LENGTH, "Heslo musí mít alespoň %d znaků.", 6)
	->setRequired("Zadejte prosím heslo.");

Ten formular se ti odesle, ale neni validni, takze se ti do onSuccess callbacku nedostane.

crassus
Backer | 78
+
0
-

F.Vesely napsal(a):

Majkl578 napsal(a):

Soubory standardním způsobem ajaxem nahrávat nelze.

To neni pravda, normalne to jde, zkus si to.

U tohohle je problem, ze tam mas toto:

$form->addHidden("email")
	->addRule(UI\Form::EMAIL, "Zadejte prosím platný e-mail.")
	->setRequired("Zadejte prosím email");
$form->addHidden("password")
	->addRule(UI\Form::MIN_LENGTH, "Heslo musí mít alespoň %d znaků.", 6)
	->setRequired("Zadejte prosím heslo.");

Ten formular se ti odesle, ale neni validni, takze se ti do onSuccess callbacku nedostane.

Tím to není. Formulář bez AJAXU funguje dobře. Funguje i s AJAXEM, ale bez addUpload. A i když jsem vyzkoušel smazat: ->addRule a ->setRequired z těch hidden inputů, tak to stejně nepomohlo.

F.Vesely
Člen | 369
+
0
-

Pokud tvuj formular vezmu a zkopiruju do sandboxu + prilinkuju nette.ajax.js, tak mi to funguje. Podivej se v prohlizeci, jestli ti to nehlasi nejakou chybu do console a jestli se posle pozadavek na server.

crassus
Backer | 78
+
0
-

F.Vesely napsal(a):

Pokud tvuj formular vezmu a zkopiruju do sandboxu + prilinkuju nette.ajax.js, tak mi to funguje. Podivej se v prohlizeci, jestli ti to nehlasi nejakou chybu do console a jestli se posle pozadavek na server.

V konzoli se zobrazuje:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

Ale to se tam zobrazí ještě před tím, než formulář submitnu. Po tom co submitnu formulář, se v konzoli neobjeví nic. Požadavek na server proběhne, alespoň podle toho co mi říká screen níže:

Screen ze síťového přenosu

F.Vesely
Člen | 369
+
0
-

Tak vidis, problem neni ten, ze to s Ajaxem nebeha. Kdyz si kliknes na ten Request v Chrome, tak ti to ukaze i Response, kterej vraci server. Podle me ti to vyhodi html, protoze ten formular nebude validni.

crassus
Backer | 78
+
0
-

F.Vesely napsal(a):

Tak vidis, problem neni ten, ze to s Ajaxem nebeha. Kdyz si kliknes na ten Request v Chrome, tak ti to ukaze i Response, kterej vraci server. Podle me ti to vyhodi html, protoze ten formular nebude validni.

Ano máš pravdu, vyhodilo mi to html ve kterém je navíc hláška: „Vyberte prosím profilovou fotku“, kterou mám nastavenou v ->setRequired(„Vyberte prosím profilovou fotku.“) u toho $form->addUpload.

Každopádně i když odeberu všechny hidden inputy z templatu i z presenteru, tak to pořád nefunguje.

Takže vypíše to errorovou hlášku, že chybí fotka, přitom fotku tam nahrávám. (Errová hláška se ale zobrazuje jenom v té html odpovědi, místo toho, aby se ajaxově vykreslila.) No a když tam tu fotku nedám, tak se mi ozve javascriptová kontrola s hláškou, abych tam tu fotku vložil.

premek_k
Člen | 172
+
0
-

Jen tip: příponu máš správnou?

crassus
Backer | 78
+
0
-

premek_k napsal(a):

Jen tip: příponu máš správnou?

Ano, zkoušel jsem .PNG i .JPEG a bohužel nic.

neoweb
Člen | 3
+
0
-

Podla mojich skusenosti sa subor cez ajaxovy formular neodosle, respektive vo vysledku ziskas prazdny fileUpload objekt. Ak je input required, tak sa ti formular nespracuje.

Editoval neoweb (28. 2. 2016 21:16)

crassus
Backer | 78
+
0
-

F.Vesely napsal(a):

Pokud tvuj formular vezmu a zkopiruju do sandboxu + prilinkuju nette.ajax.js, tak mi to funguje. Podivej se v prohlizeci, jestli ti to nehlasi nejakou chybu do console a jestli se posle pozadavek na server.

Poslal bys mi prosím ten tvůj sandbox? Chtěl bych se na to podívat :)

crassus
Backer | 78
+
0
-

Majkl578 napsal(a):

Soubory standardním způsobem ajaxem nahrávat nelze.

Ahoj Majkle,
a jde to udělat nějakým nestandardním způsobem? Chtěl bych docílit toho, aby se mi ve formuláři vypisovaly errorové hlášky ajaxově, ale zároveň aby bylo možné přes něj nahrát fotografii.

Co kdybych ten uploadovací input pro nahrání fotografie úplně oddělil od registračního formuláře, a jakmile by uživatel přes něj vložil daný soubor, tak se do hiddenInputu registračího formu vloží cesta k temp souboru? Tím pádem bych po odeslání registrace měl cestu k souboru a zároveň by formulář fungoval ajaxově.

F.Vesely
Člen | 369
+
0
-

crassus napsal(a):

F.Vesely napsal(a):

Pokud tvuj formular vezmu a zkopiruju do sandboxu + prilinkuju nette.ajax.js, tak mi to funguje. Podivej se v prohlizeci, jestli ti to nehlasi nejakou chybu do console a jestli se posle pozadavek na server.

Poslal bys mi prosím ten tvůj sandbox? Chtěl bych se na to podívat :)

Mas to v mailu.