Nefunguje mi ajaxový formulář s addUpload(), ale funguje bez ajaxu
- crassus
- Backer | 78
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 :)
- F.Vesely
- Člen | 369
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
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.
- crassus
- Backer | 78
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:
- crassus
- Backer | 78
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.
- crassus
- Backer | 78
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
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
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.