Nefunguje AJAX odeslání po invalidaci formuláře
- Magnus
- Člen | 65
Ahoj,
udělal jsem si primitivní funkci na odeslání formuláře AJAXem, abych
měl kontrolu nad tím, co se stane před a po odeslání (jelikož se
u jiného formuláře může stát něco jiného, nechtěl jsem to dávat jako
extension).
Když odešlu formulář poprvé, tak je to OK. Když ale formulář invaliduji
($this->redrawControl(‚form‘)), tak se znovu neodešle AJAXem, ale
klasicky s obnovením stránky.
Presenter
public function createComponentTestForm()
{
$form = new Form;
$form->addText("text", "Text")
->setRequired("text musí být vyplněn")
->addRule(Form::MAX_LENGTH, "špatná délka", 2);
$form->addSubmit("send", "Odeslat");
$form->addProtection("csrf token expired");
$form->onSuccess[] = $this->testFormSubmitted;
return $form;
}
public function testFormSubmitted(Form $form)
{
$this->flashMessage($form->values->text);
$form->addError("some error");
if ($this->isAjax()) {
$form->setValues(array("text" => ""));
$this->redrawControl("form");
} else {
$this->redirect("this");
}
}
JS
<script type="text/javascript">
function formValuesToObject(form)
{
var arr = $(form).serializeArray();
var x = {};
for (var i in arr) {
x[arr[i]["name"]] = arr[i]["value"];
}
return x;
}
$("#frm-testForm").submit(function() {
var spinner = new AjaxSpinner("spin", "#spinnerContainer", "loading...");
$.nette.ajax({
method: "POST",
url: $(this).attr("action"),
data: formValuesToObject($(this)),
beforeSend: function() {
spinner.show();
}
}).done(function(data) {
}).always(function() {
spinner.hide();
});
return false;
});
</script>
Neví někdo, v čem by mohl být problém?
Pozn.: Používám nette.ajax.js
- Jiří Nápravník
- Člen | 710
Je to pochopitelne, protoze se vrati jen ten prekresleny formular a ne uz ten callback submit.
Reseni:
udelej z toho javascriptu nette ajax extension a dej to do load, tim se to po
kazdem pozadavku pres nette.ajax nabinduje jak potrebujes
Jeste lepsi reseni:
proc takhle slozite, pokud pouzivas nette.ajax.js, tak staci dat formulari tridu
ajax, a automaticky se posle pres ajax. A pokud ti jde o ten spinner, tak ten
je v nette.ajax.js tusim implementovany, pripadne mas extension tady: https://gist.github.com/duskohu/7591174
- Magnus
- Člen | 65
Vím o tom, že to pomocí nette.ajax.js jde jednoduše, ale u každého
formuláře můžu chtít udělat něco jiného (zobrazit spinner, deaktivovat
tlačítko apod.), takže mám radši, když si to napíšu ručně.
Nicméně i to asi půjde udělat, např. pomocí data- atributů. Ještě nad
tím zapřemýšlím, děkuji za odpověď.
- Jiří Nápravník
- Člen | 710
Pokud si chces tyhle obsluyh resit samostatne, tak je clekem potom nesmysl pouzivat nette.ajax a staci klasicky jquery… Ale prijde mi lepsi pouzit nette.ajax tohle co chces tady, tak to je v podstate default chovani. Kdyz budes chtit pak nekde nezobrazovat snippet, tak jej zakazes data atribut, coz taky nettte.ajax odporuje. Pokud budes chtit deaktivovat tlacitko udelas si v extension pro zmenu zase v before metode, at se eaktivuje tlacitko apod…