AJAXové odeslání formuláře po provedení změny ve formulářovém prvku (Nette 2.1)

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

Zdravím,

lze nějakým způsobem provést odeslání formuláře prostřednictvím ajaxového požadavku. Mám vytvořenou továrnu na vytvoření formuláře:

public function createComponentLimit()
{
	$form = new Form();

	$limits = array(
		'100' => '100',
		'200' => '200',
		'300' => '300',
        );

	$form->addSelect('limit', 'Limit:' ,$limits)
		->setAttribute('class', 'ajax')
		->getControlPrototype()->onchange('submit();');

	// call method limitFormSucceeded() on success
	$form->onSuccess[] = $this->limitFormSucceeded;
	return $form;
}

kde jsem pomocí getControlPrototype() nastavil danému prvku při změně automatické odeslání formuláře. Nevím jestli se běžně tento způsob používá.

Teď ale k samotnému zAJAXování formuláře. Mám nalinkovaný do layoutu script od Vojtěcha Dobeše

Ve vlastním JS souboru provedenou inicializaci tohoho skriptu

$(function () {
    $.nette.init();
});

Prvku ve formuláři přiřazenu třídu ajax nevím jestli nemusí být třída ajax už v samotném formuláři.

Poté jsem se v obsluze odeslaného formuláře pokusil tímto způsobem zjistit jakým způsobem se požadavek provedl.

public function limitFormSucceeded($form)
{
	$values = $form->getValues();

	if($this->isAjax()) {
		dump('AJAX');
	} else {
		dump('HTTP');
	}
}

A nemůžu docílit toho, aby odeslání formuláře proběhlo ajaxově.

Děkuji za všechny rady.

Editoval James (10. 2. 2014 9:42)

Mysteria
Člen | 797
+
0
-

Třídu ajax musí mít celej formulář, ne jenom input.

James
Člen | 54
+
0
-

Mysteria napsal(a):

Třídu ajax musí mít celej formulář, ne jenom input.

Třída přidána celému formuláři, ale zdá se, že jsem stále nedosáhl touženého výsledku.

akadlec
Člen | 1326
+
0
-

Bohužel nikdo z nás tu nemá věšteckou kouli abychom věděli co ti to po změně vrací a co od toho očekáváš.

Jan Suchánek
Člen | 404
+
0
-

Proč to děláš tak složitě? Dej to submit() pryč a použíj tohle:

<script>

	// před init nebo za ale podle dokumentace :)

	$.nette.ext('onChange', {
	    	load: function (rh) {
			$("form.ajax").on("change", function(event){
				event.preventDefault();
				// a tady si dopiš lumpárny
				// ? $.nette.ajax(this.action);
			});
		}
	});
</script>

Nebo je to blbě?

Edit: Myslim, že to jde ještě jednodušeji: např. nečím takovým?

Ještě bacha někdy mi blblo v Safari odesílání v load (odesilalo se několikrát) a on(„change“ … jsem musel přesunout do init().

Editoval jenicek (10. 2. 2014 18:39)

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

Třídu ajax může mít formulář nebo i tlačítko, je to jedno. Pro tvé případy to ale musí být na formuláři, protože pokud je třída pouze na tlačítku, tak se naváže přes událost click, kterou ty obcházíš ručním vyvoláním submit().