Dopočítaný prvek formuláře
- Petr64
- Člen | 22
Dobrý den, omlouvám se za začátečnický dotaz.
Potřeboval bych na formuláři dopočítávat prvek.
Například ve formuláři mám v default hodnotě cenu ubytová za 1 den a
1 osobu.
Pokud se změní hodnota počet dní pobytu, nebo počet ubytovaných osob pak
by se mělo pole formuláře přepočítat podle vzorce:
cenapobytu=jedncenapocetosobpocetdni
..
$form = new Form;
$form->addtext('rezervace_id', 'Rezervace id');
$form->addInteger('jedncena','cena 1den a 1osobu')->setDefaultValue(100);
$form->addInteger('pocetosob','počet osob');
$form->addInteger('pocetdni','počet dní');
$form->addInteger('cenapobytu','cena za pobyt')->setDisabled()->setValue(jedncena*pocetosob*pocetdni);
..
Předem díky za každé nakopnutí správným směrem jak toho docílit.
- Petr64
- Člen | 22
CZechBoY napsal(a):
potrebujes tu vypocitanou hodnotu opravdu jako polozku ve formulari? nestaci ti to spocitat po odeslani formulare?
Potřebuji. Tohle je jen příklad. Ale například v jiné situaci. Potřebuju vybrat ve formuláři stav žádosti „Zamítnout“ a v jiném poli dosadit text zdůvodnění, které je potřeba ještě upravit apod.
- Petr64
- Člen | 22
Šaman napsal(a):
Spíš mi přijde, že ta cena není ve skutečnosti žádný input. Je to jen informační text. Klidně bych to řešil malým jednoúčelovým JS. (Může to i použít k vykreslení disablovaný html input, ale nebude to součástí formu.)
Není někde příklad jak to udělat? Nevím ani jak bych ten script spustil apod.
- CZechBoY
- Člen | 3608
Moc to nechápu. Takže máš 1 select
, kde vybereš nějakou
položku a máš další input[type=text]|textarea
kde napíšeš
důvod. Tohle potřebuješ nějak spojit? Jakože ti vyjede text
Zamítnuto: $text
? A nestačí ti to potom jen zobrazit spojený
v nějakým seznamu požadavků (nebo co to zpracováváš)?
- Petr64
- Člen | 22
CZechBoY napsal(a):
Moc to nechápu. Takže máš 1
select
, kde vybereš nějakou položku a máš dalšíinput[type=text]|textarea
kde napíšeš důvod. Tohle potřebuješ nějak spojit? Jakože ti vyjede textZamítnuto: $text
? A nestačí ti to potom jen zobrazit spojený v nějakým seznamu požadavků (nebo co to zpracováváš)?
Takhle jsem do to úplně zabředávat nechtěl. Ale rozepíšu to. Dělám
web kde si lidi budou rezervovat pobyty v penzionu. V kalendáři si
zažádají si o termín. Jenže kalendář nezobrazuje rozjednané termíny
například telefonickou žádostí apod.
Proto to co naklikali ještě musí admin potvrdit.
V admin menu se zobrazí „požadavek“, který si rozklikne a otevře se mu
formulář. Jedno z polí je ten addSelect jak píšeš vybere „Potvzení“
nebo „odmítne“. Po změně hodnoty selectu je potřeba v addTextArea
předvolit nějaký text v závislosti na tom jestli rezervaci potvrdil nebo
zamítl. Tento text je potřeba ještě doplnit nebo upravit.
Když je to hotové odešle se klientovi potvrzovací mail a v kalendáři se
označí blokovaný termín.
Napadá mne spousta dalších situací kdy by se to hodilo použít.
- Rob Bob
- Člen | 60
Tak můžeš použít JavaScript, kde budeš mít ty předvolené hodnoty (šablonu textu) na pevno anebo použít data-attribute a uložit si je jako data k inputu, případně pokud je chceš nějak spravovat a mít v databázi, tak si ty data načíst pomocí ajaxu. Každopádně budeš potřebovat něco ve smyslu:
<script>
$("select").change(function() {
if($(this).val() === POTVRZENI) {
$("textarea").html(PREDVOLENY_TEXT_1);
} else { //případně else if a další možnosti...
$("textarea").html(PREDVOLENY_TEXT_2);
}
});
</script>
Jak získáš PREDVOLENY_TEXT už je na tobě.
Editoval Rob Bob (22. 8. 2017 10:56)
- Petr64
- Člen | 22
Šaman napsal(a):
Vycházím z toho, že ten input nastavuješ jako disabled. Disabled prvky Nette formuláře se neodesílají. (Teda, abych byl přesnější – odesílají, ale formulář je zahazuje, pokud ho budeš zpracovávat na úrovni
$form
. Dá se k nim dostat jen nízkoúrovňově.)
Pokud bychom se vrátili k prvnímu příkladu tak by pole disabled být nemuselo. Po odeslání hodnot bych si ho spočítal znova. Důležité je klient by viděl hned kolik ho pobyt bude stát.
- Rob Bob
- Člen | 60
Jenže (jestli to chápu správně) on do toho textarea pole chce načíst nějakou šablonu textu, které jsou různé v závislosti na výběru selectu, a který chce mít možnost upravit a odeslat.
@Šaman: Disabled pole se podle specifikace W3C odesílat nemají a ani to Nette samozřejmě nijak neobchází (v POST datech nejsou). Pole jsou stále jsou součástí formu, takže ho tam „najdeš“, ale hodnotu má výchozí (přes setValue), nikdy ne tu nastavenou na klientovi (např. přes JS).
- Petr64
- Člen | 22
CZechBoY napsal(a):
Líbilo by se mi vidět toggle.
Klikl bys na stav – buď by se zobrazila textarea na poznámku nebo ne. Na backendu potom zkontroluješ stav a když jeZamítnuto
tak přidáš poznámku z formu, když ne tak odešleš nějakou univerzální schvalovací odpověď.
Tak jsem zkusil toto řešení. Pro Texty to bude OK.
Trochu jsem si zalaboroval protože jsem si nepřilinkoval script netteForms.js
(i když se to všude píše).
Hledal jsem jak to udělat a nalezl jsem toto: <script src=„http://nette.github.com/resources/js/netteForms.js“></script>
Přijde mi to divné když ten samý obsahuje framework.
Nevím jak přilinkovat ten co se nachází
..\vendor\nette\forms\src\assets\netteForms.js.
Asi něco nechápu. Kdyby by někdo ještě poradil s tímto.
Předem díky všem.
- matopeto
- Člen | 395
Petr64 napsal(a):
CZechBoY napsal(a):
Líbilo by se mi vidět toggle.
Klikl bys na stav – buď by se zobrazila textarea na poznámku nebo ne. Na backendu potom zkontroluješ stav a když jeZamítnuto
tak přidáš poznámku z formu, když ne tak odešleš nějakou univerzální schvalovací odpověď.Tak jsem zkusil toto řešení. Pro Texty to bude OK.
Trochu jsem si zalaboroval protože jsem si nepřilinkoval script netteForms.js (i když se to všude píše).Hledal jsem jak to udělat a nalezl jsem toto: <script src=„http://nette.github.com/resources/js/netteForms.js“></script>
Přijde mi to divné když ten samý obsahuje framework.
Nevím jak přilinkovat ten co se nachází ..\vendor\nette\forms\src\assets\netteForms.js.
Asi něco nechápu. Kdyby by někdo ještě poradil s tímto.Předem díky všem.
nahras si ho niekde do public casti webu napr. www/js
(zalezi
aku mas strukturu) a prilinkujes cez
s cestou {$basePath}/js/netteForms.js
Editoval matopeto (24. 8. 2017 21:55)
- Petr64
- Člen | 22
matopeto napsal(a):
>
nahras si ho niekde do public casti webu napr.
www/js
(zalezi aku mas strukturu) a prilinkujes cez s cestou{$basePath}/js/netteForms.js
OK to mne napadlo taky. Jenže {$basePath} pdkazuje právě na ..\WWW. Vrtá mi hlavou proč bych ho tam měl kopírovat když ve frameworku je aktualizovaný a tudíž odpovídající verzi.
Editoval Petr64 (25. 8. 2017 7:46)
- Petr64
- Člen | 22
Rob Bob napsal(a):
Tak můžeš použít JavaScript,........
Zkoušel jsem spustit ten script. Jsem ve stavu, že nevím jak ten script spustit.
V prezenteru vykreslím form:
<?php
protected function createComponentConfirmForm()
{
...
$form = new Form;
$form->addtext('rezervace_id', 'Rezervace id');
$form->addSelect('stav', 'Zadejte typ potvrzení',$stavrez)->setDefaultValue(1);
....
$form->addSubmit('send', 'Odeslat mail');
$form->onSuccess[] = [$this, 'confirmFormSubmitted'];
return $form;
}
?>
Pak se v šabloně snažím spustit script při změně toho select boxu (na zkoušku alert) :
<?php
{block #content}
<h2>Potvrzení nebo zamítnutí rezervace {$rezervace->id}</h2>
<script>
$('#' + {$control["confirmForm"]["stav"]->htmlId}).change(function() {
alert("Zmena !");
});
</script>
{control confirmForm}
?>
Nedělá to však nic. Jsem opravdu začátečník. Kde je chyba?