AJAX – zpracování formuláře přestane po pár odeslání fungovat
- Magnus
- Člen | 65
Zdravím,
občas se mi stane, že se nedokáže správně zpracovat formulář. Např. 4× za sebou se hodnoty odešlou správně a pak se to z pro mě neznámého důvodu zasekne a dokud stránku neaktualizuji, tak formulář nelze znovu odeslat.
Vytvoření formuláře:
pomocí atributu data-ajax-function se automaticky zavolá daná funkce.
<?php
/**
* @return Form
*/
public function createAddRank()
{
$form = new Form();
$form->getElementPrototype()->{"data-ajax-function"} = "addRank(this);";
$form->addText("name", "název");
$form->addSubmit("add", "přidat");
$form->onSuccess[] = $this->addRankSubmitted;
return $form;
}
/**
* @param Form
* @param Nette\ArrayHash
*/
public function addRankSubmitted(Form $form, $values)
{
$p = $form->getPresenter();
try {
$this->facade->addRank($values->name);
$p->flashMessage("OK", "success");
if ($p->isAjax()) {
$form->setValues(array(), TRUE);
$p->payload->error = FALSE;
$p->payload->name = $values->name;
} else {
$p->redirect("this");
}
} catch (UniqueConstraintViolationException $e) {
$form->addError("záznam již existuje");
if ($p->isAjax()) {
$p->payload->error = TRUE;
}
}
if ($p->isAjax()) {
$p->redrawControl("ranks");
$p->redrawControl("scripts");
}
}
?>
s JS použvám knihovnu jQuery. Pomocí funkce formValuesToObject() se mi všechny hodnoty z formuláře hodí do objektu (v tomto případě to udělá řetězec jako v URL, zkoušel jsem více možností, ale všechny dopadly stejně).
{snippet scripts}
<script type="text/javascript">
function formValuesToObject(form)
{
var arr = $(form).serializeArray();
return decodeURIComponent($.param(arr));
}
function addRank(form)
{
var f = $(form);
$.nette.ajax({
type: f.attr("method"),
url: f.attr("action"),
data: formValuesToObject(f)
}).success(function(result) {
console.log(result);
});
return false;
}
</script>
{/snippet}
Vykreslení formuláře
{snippet ranks}
{control addRankForm}
{/snippet}
Jen pro ukázku, co vypíše konzole. 4× se formulář odeslal správně a
poté jakoby vůbec nedošlo ke zpracování (nevrátily se mi hodnoty error,
name a hodnota snippets je prázdná).
Pokaždé byl ten formulář odeslán bez aktualizace stránky, prostě po
kliknutí na tlačítko se formulář překreslil a takhle dokola, dokud to
nepřestalo fungovat :D
Nevíte, v čem by mohl být problém?