Formular se napoprve ajaxove odesle, pak uz ne
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Azim
- Člen | 41
Zdravim. Mam formular, ve kterem vyuzivam Replicator a onchange selectu jej ajaxove odesilam. Problem je, ze pri prvni zmene selectu se formular spravne odesle a zpracuje, pri dalsich zmenach uz ne (ve firebugu je jen jeden xhr pozadavek, vypada to, ze prijaty snippet nejak rozbil ajaxove odesilani). Nesetkal jste se s tim nekdo, resp. nevite kde je chyba? Diky za odpovedi
Sablona
<script>
// po načtení stránky
$(function () {
// odeslání na formulářích
$(".ajax").change(function () {
$(this).closest("form").ajaxSubmit();
return false;
});
});
</script>
<div id="wrapper">
{snippet objednavkaForm}
{control objednavkaForm begin}
{if !$control['objednavkaForm']['polozkyObjednavky']->isSubmittedBy()}
{control objednavkaForm errors}
{/if}
{control objednavkaForm body}
{control objednavkaForm end}
{/snippet}
presenter(formular + zpracovani)
protected function createComponentObjednavkaForm($name) {
$form = new MyForm;
$presenter = $this;
$invalidateCallback = function () use ($presenter) {
$presenter->invalidateControl('objednavkaForm');
};
$drinkySelect = array();
foreach ($this->drinky as $drink) {
$drinkySelect[$drink->getId()] = $drink->getNazev();
}
$arr = array();
for ($i = 1; $i <= 5; $i++) {
$arr[$i] = $i;
}
$replicator = $form->addDynamic('polozkyObjednavky', function (Container $container) use ($invalidateCallback, $drinkySelect, $arr) {
$container->currentGroup = $container->form->addGroup();
$container->addSelect('drink', 'Drink', $drinkySelect)
->setAttribute('class', 'ajax');
$container->addSelect('objem', 'Objem', \Drink::$objemySelect)
->setAttribute('class', 'ajax');
$container->addSelect('mnozstvi', 'Množství', $arr)
->setAttribute('class', 'ajax');
$container->addHidden('jednotkovaCena');
$container->addText('cena', 'Cena')->setAttribute('class', 'cena');
$container->addSubmit('removeAjax', 'Smazat')
->setAttribute('class', 'ajax')
->addRemoveOnClick($invalidateCallback);
}, 1);
$replicator->addSubmit('addAjax', 'Přidat položku')
->setAttribute('class', 'ajax')
->addCreateOnClick($invalidateCallback);
$form->addText('vyslednaCena', 'Výsledná cena')->setAttribute('class', 'vyslednaCena');
$form->addSubmit('sendAjax', 'Odeslat objednávku')
->onClick[] = callback($this, 'ObjednavkaFormSubmitted');
$this[$name] = $form;
$form->action .= '#snippet--objednavkaForm';
$form->onSuccess[] = callback($this, 'ajaxSubmit');
return $form;
}
public function ajaxSubmit(MyForm $form) {
if ($this->isAjax()) {
$form->setValues(array(), TRUE);
$this->invalidateControl('objednavkaForm');
}
}
- Michal Vyšinský
- Člen | 608
Jestli se nepletu, tak to nefunguje kvůli změně DOM. Řešení jsou IMO
dvě:
Použít .live(„change“, function(){…}). A nebo dát ten script také do
snipettu a invalidovat i jej.
Editoval CherryBoss (28. 1. 2013 14:19)