Nefunguje AJAX odeslání po invalidaci formuláře

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

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

Magnus
Člen | 65
+
0
-

Pomohlo mi hodit do snippetu formulář včetně toho javascriptu. Nezdá se mi to ale jako dobré řešení.

Jiří Nápravník
Člen | 710
+
0
-

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
+
0
-

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
+
0
-

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…