odeslání formuláře pomocí JS po změně údajů ve formuláři

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mrazek85
Člen | 9
+
0
-

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
+
+1
-

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)

mrazek85
Člen | 9
+
0
-

díky za odpověď, ale pro výpočet potřebuju zpracovat data z formuláře, musím tedy odeslat celý formulář, nikoli jen poslat signál :( proto odesílám Submitem

F.Vesely
Člen | 369
+
+2
-

Jeste muzes zkusit:

$('.recalc').change(function (e) {
    $.nette.ajax({}, $('#recalc'), e);
});
mrazek85
Člen | 9
+
0
-

to je ono, moc děkuju ;)