Jak nastavit submit:disabled po validním odeslání formuláře?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

Chci odeslat formulář, kde je nějaké pravidlo (např. Form::FILLED), a nastavit submit:disabled v případě úspěšné validace. Už jsem to trochu probíral s Vojtou Dobešem a došli jsme k něčemu takovému:

// my notes

$.nette.ext('disable-submit', {
  	start: function (xhr, settings) {
		console.log(this); // nothing
		if (settings.nette.isForm) {
			this.submit = settings.nette.el.find('input[type="submit"]:disabled');
		} else if (settings.nette.isSubmit) {
			if (settings.nette.el.is(':disabled')) {
				this.submit = settings.nette.el;
			}
		}
	},
	complete: function () {
		console.log(this); // nothing
		if (this.submit) {
			this.submit.attr('disabled', false);
		}
	},
	load: function () {
		$('input[type="submit"]').on('click', function () {
			if (Nette.validateForm(this) == true) { // alerts errors :(
				$(this).attr('disabled', true);
			}
			// no form submit on success :(
		});
	}
});

Případně gist

Což bohužel nejde a nevím, kde sehnat patřičnou proměnnou form byl validně odeslán a poté formulář odeslat. Odesílání by mělo probíhat normálně (bez ajaxu).

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Snad vyřešeno :) – https://gist.github.com/…obes/4727143. Využívám triku s data-ajax-pass, kterým lze potlačit, aby nette.ajax.js automaticky zabil událost, která vyvolala request. V tomto případě potlačuji zabití submit, které si pak sám ještě doobsloužím – disabluju tlačítko a sám událost zabíjím (jinak by pokračovalo standardní odeslání formuláře).

Aby to fungovalo, a různé callbacky se nebyly a vyvolaly se ve správném pořadí, musel jsem zjednodušit inicializaci. Pokud by to někdo protestoval, zařadil bych ji takto zjednodušenou rovnou do masteru, protože pokud to neovlivní zjištění odesílacího tlačítka ani třeba posílání souřadnic z input[type=image], přijde mi to jako košer.

Ta část v complete s oddisablováním tlačítka tam pochopitelně být nemusí :). Zato delete this.submit by tam zůstat mělo.