Výpočet během vyplňování formuláře?

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

Dobré odpoledne,

dokáže mi prosím někdo poradit nějaký jednoduchý způsob, jak přimět formulář, aby v průběhu zadávání (ne až po odeslání) předvyplnil některá pole na základě právě zadávaných/zadaných hodnot?

Dejme tomu, že mám formulář na objednání ubytování s poli „Počet osob“, „Počet nocí“ a „Celková cena“ a já bych rád, aby se třetí pole „Celková cena“ automaticky vyplnilo po zadání prvních dvou (dle vzorce „Celková cena“ = „Počet osob“ * „Počet nocí“ * konstanta, že:-). Určitě to musí jít, ale potřeboval bych trochu nasměrovat správným směrem… :-)

Díky moc.

phx
Člen | 651
+
0
-

Javascript. onChange na prvcich a detekce/nastaveni ID prvku.

HappyBear
Člen | 10
+
0
-

phx napsal(a):

Javascript. onChange na prvcich a detekce/nastaveni ID prvku.

Můžete být prosím (někdo) trochu konkrétnější, případně napsat alespoň hrubý nástřel kódu? Jak přidat funkci na onChange jsem si našel ještě před postnutím dotazu, ale není mi jasné, kde/jak nadefinuji tu konkrétní funkci, abych z ní mohl pohodlně přistupovat k ostatním polím formuláře…

Pokud jsou mé dotazy úplně mimo, tak se omlouvám, ale Nette jsem viděl poprvé před dvěma dny s PHP obecně jsem na tom (zatím) také na úrovni první třídy pomocné školy…

Editoval HappyBear (20. 3. 2009 23:36)

Honza Marek
Člen | 1664
+
0
-

Třeba onchange můžeš přiřadit něco takového.

this.form.celkovaCena.value = this.form.pocetOsob.value * this.form.pocetNoci.value * 100000

Pokud bys to chtěl mít komplexnější, tak do onchange přiřadíš "spocitatVeci(this.form)" a funkci spocitatVeci hodíš vedle.

function spocitatVeci(form) {
	// třeba nějaká kontrola na správnost čísla


	form.celkovaCena.value = form.pocetOsob.value * form.pocetNoci.value * 100000;
}

Samozřejmě je to jenom příklad, nemusíš se toho držet :-D

Editoval Honza M. (20. 3. 2009 23:49)

pmg
Člen | 372
+
0
-

Honzův příspěvek jsem nestihl, ale také jsem to zkusil. Jednodušší asi je do funkce předat ten formulář, ale může se to hodit i takto:

// Presenter
$form = new AppForm($this, 'test');
$form->addText('osob', 'Počet osob:')
	->getElementPrototype()->onChange = 'nastavCenu()';
$form->addText('noci', 'Počet nocí:')
	->getElementPrototype()->onChange = 'nastavCenu()';
$form->addText('cena', 'Celková cena:');

$this->template->form = $form;
{* Šablona *}
<script type="text/javascript">
/* <![CDATA[ */
function nastavCenu() {
	var g = document.getElementById;
	var osob = g({$form['osob']->htmlId});
	var noci = g({$form['noci']->htmlId});
	var cena = g({$form['cena']->htmlId});

	cena.value = osob.value * noci.value * 500;
}
/* ]]> */
</script>

{?$form->render()}

Editoval pmg (21. 3. 2009 0:10)

HappyBear
Člen | 10
+
0
-

Děkuji za tip i příklad, v mezičase jsem sám vyplodil něco podobného, akorát – neznaje řádně Nette – asi o řád méně elegantního/abstraktního:

<?php
  require 'Nette/loader.php';

  $form = new Form();
  $form->addText('pocetOsob', 'Počet osob:')
       ->getControlPrototype()->onChange = 'Spocitej();';
  $form->addText('pocetNoci', 'Počet nocí:')
       ->getControlPrototype()->onChange = 'Spocitej();';
  $form->addText('cenaCelkem', 'Cena celkem:');
  $form->addSubmit('send', 'Odeslat');

  echo $form;
?>
<script type="text/javascript">
function Spocitej()
{
  osob = document.getElementById("frm-pocetOsob");
  noci = document.getElementById("frm-pocetNoci");
  cena = document.getElementById("frm-cenaCelkem");
  cena.value = osob.value *  noci.value * 100;
}
</script>

Můj problém spočíval zřejmě pouze v tom, že jsem na základě příkladů jako je třeba tento:

$form->addCheckbox('send', 'Shipping address:')
    ->addCondition(Form::EQUAL, TRUE)
        ->toggle('sendBox'); // toggle HTML element 'sendBox'

nějak usoudil, že by to mohlo/mělo jít napsat jednoduššeji, podmínku změnit na Form:FILLED a místo toggle(cosi) tam _nějak_ propašovat svou fci na počítání… Asi jsem byl moc naivní, že? :-)

pmg
Člen | 372
+
0
-

Vlastně jsi to udělal stejně. Ta metoda toogle slouží k odkrývání prvků na základě nějaké podmínky.