[Best practise] Ajax ve formularich
- Jan Mikeš
- Člen | 771
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..
- Invalidovat snippety primo v komponente s formularem pomoci $this->presenter->invalidateControl()
- Invalidovat snippety v presenteru po odeslani formulare
- 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:
- 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
- Zde mi vadi hodne psani v presenteru, opakovani stejneho kodu napric celou aplikaci, cast logiky formulare v presenteru – nelibi se mi
- 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
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.