odeslání formuláře pomocí JS po změně údajů ve formuláři
- mrazek85
- Člen | 9
Ahoj,
mám formulář s objednávkou, kde dole je možnost skrze replikator pridat
nebo ubrat polozky, vse funguje dobre, jen bych dole chtěl udělat rekapitulaci
DPH, atd.. to vše mi počítá nějaká metoda a její hodnoty vykresluje
snippet po kliku na Submit recalc class ajax ..
vše funguje, jen bych chtěl, aby se mi např. při změně hodnoty quantity
odeslal automaticky formulář pomocí tlačítka recalc
→ JS
<?php
$items = $form->addDynamic('items', function (Container $user) {
$user->addText('quantity', 'Quantity');
$user->addText('price', 'Price');
}, 1);
$form->addSubmit('recalc', 'Recalc')->setHtmlId('recalc')->setValidationScope(FALSE)->onClick[] = array($this, 'recalc');
$form->addSubmit('send', 'Send')->onClick[] = array($this, 'formSubmit');
?>
<?php
public function recalc(SubmitButton $button) {
$values = $button->getForm()->getValues();
$this->template->data = $this->model->calculateInvoicesSumVats($this->profile, $values);
$this->redrawControl('calc');
}
?>
přidal jsem tedy na všechny inputy, které chci hlídat třídu .recalc
<script>
$(".recalc").change(function () {
//alert(".recalc");
$('#recalc').click();
});
</script>
a očekával jsem, že po změně dojde k přepočítávání. Bohužel #recalc se stiskne, ale „nepoužije se“ třída ajax a odešle to celý formulář bez ajaxu což je špatně, mohu tu kalkulaci napsat v javascriptu, ale vzhledem k možnostem zaokrouhlování atd. bych používal raději jednu metodu, která bude obstarávat obojí – jak toto informativní vykreslování, tak následně přepočet pro db ⇒ musím odeslat po každé změně hodnoty formuláře k překalkulování.
Snad jsem to napsal trochu pochopitelně, někdo nějaký nápad, jak to vyřešit ? :-)
Editoval mrazek85 (24. 2. 2016 15:30)
- GEpic
- Člen | 566
Podle mě tímto $('#recalc').click();
způsobíš, že obejdeš
ajax knihovnu a odešle se klasicky. Spíš si udělej AJAX GET request na
signál v presenteru.
Píšu z hlavy:
$.nette.ajax({
type: "GET",
url: {link signalName!},
data: {params: data} /* Může být, a nemusí */
});
A v PHP:
public function handleSignalName($params) // Params může být, a nemusí, záleží na tvé situaci
{
// Kod co ti provede co potřebuješ
$this->redrawControl();
}
Takže v tvém případě:
<script>
$(".recalc").change(function () {
$.nette.ajax({
type: "GET",
url: {link recalc!}
});
});
</script>
<?php
public function handleRecalc()
{
$values = $this['componentName']->getValues(true);
$this->template->data = $this->model->calculateInvoicesSumVats($this->profile, $values);
$this->redrawControl('calc');
}
?>
Samozřejmě musíš mít knihovnu od @VojtěchDobeš
nette.ajax.js
Editoval GEpic (24. 2. 2016 16:51)