Výpočet během vyplňování formuláře?
- HappyBear
- Člen | 10
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.
- HappyBear
- Člen | 10
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
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
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
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? :-)