[Best practise] Ajax ve formularich

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
+1
-

Zdravim, ve vetsi mire v posledni dobe pracuji s ajaxem ve formularich a nevim jestli par veci resim uplne spravne.

Pouzivam nette.ajax.js od Vojtecha Dobese (diky ti za skvelou praci). Nemuzu se rozhodnout mezi tim, co pouzivat, co je lepsi, cistejsi apod..

  1. Invalidovat snippety primo v komponente s formularem pomoci $this->presenter->invalidateControl()
  2. Invalidovat snippety v presenteru po odeslani formulare
  3. Invalidovat pomoci upravene extension na redirect

Nasleduji ukazky:

1)

// Content of RandomForm.php
public function process($form)
{
	// Logic

	$this->presenter->flashMessage("Abcd");
	if ($this->presenter->isAjax()) {
		$this->presenter->invalidateControl();
	} else {
		$this->presenter->redirect("this");
	}
}

2)

// Content of RandomPresenter.php
protected function createComponentRandomForm()
{
	$presenter = $this; // for php < 5.4
	$form = new RandomForm();
	$form->onSuccess[] = function() use ($presenter) {
		if ($presenter->isAjax()) {
			$presenter->invalidateControl();
		} else {
			$presenter->redirect("this");
		}
	}
	return $form;
}

3)

// Content of RandomForm.php
public function process($form)
{
	// Logic

	$this->presenter->flashMessage("Abcd");
	$this->presenter->redirect("this");
}
/* Content of Random.js */
$.nette.ext('redirect', {
	success: function (payload) {
		if (payload.redirect) {
			$.nette.ajax(payload.redirect);
		}
	}
});

Nevyhody:

  1. Vadi mi trosku ta netransparentnost (pokud budu invalidovat vsechny snippety, nevim kolik jich na strance je, jeden konkretni snippet me nuti drzet se stejneho nazvu v cele aplikaci) kazdopadne toto je dle me asi nejcistejsi zpusob a nejvhodnejsi
  2. Zde mi vadi hodne psani v presenteru, opakovani stejneho kodu napric celou aplikaci, cast logiky formulare v presenteru – nelibi se mi
  3. Toto reseni znamena nejmene psani, jednoduchy prehledny kod, zadne IF/ELSE direktivy, ale co je velka nevyhoda, 2 ajaxove requesty na misto jednoho, 1. odeslani formulare, 2. redirect a request na presenter

Myslim si ze 1. reseni je opravdu nejcistejsi a nejvhodnejsi, rad bych se ale ujistil o tom, ze tomu tak opravdu je, pripadne se inspiroval u nekoho zkusenejsiho.

Prosim pokud se rozhodnete komentovat, byl bych velice velice rad, kdyby jste si vybrali ktera moznost se vam libi nejvice a proc nebo pripadne mi nabidli jine lepsi reseni.

Editoval Lexi (22. 7. 2013 11:59)

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

Já to obvykle dělám tak, že formulář si na success definuje vlastní událost (u přihlašovacího formuláře by to bylo třeba onSuccessfulLogin[] = .... A do toho se skutečně hookuje presenter. Je to co nejvíce decoupled, a tak to mám rád.

Třetí varianta se zdá být nejprůzračnější, ale 2 requesty jsou neomluvitelné, naprosto souhlasím.