Dopočítaný prvek formuláře

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

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.

CZechBoY
Člen | 3608
+
+1
-

potrebujes tu vypocitanou hodnotu opravdu jako polozku ve formulari? nestaci ti to spocitat po odeslani formulare?

Šaman
Člen | 2666
+
+3
-

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.)

Petr64
Člen | 22
+
0
-

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

Š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
+
0
-

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

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 text Zamí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
+
0
-

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)

Šaman
Člen | 2666
+
+1
-

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ě.)

Petr64
Člen | 22
+
0
-

Š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.

CZechBoY
Člen | 3608
+
+1
-

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ž je Zamítnuto tak přidáš poznámku z formu, když ne tak odešleš nějakou univerzální schvalovací odpověď.

Rob Bob
Člen | 60
+
0
-

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

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ž je Zamí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
+
0
-

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ž je Zamí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
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

tak muzes udelat symlink no.
mas spravne spusteny nette? mas document root do slozky www?

Editoval CZechBoY (25. 8. 2017 8:39)

Petr64
Člen | 22
+
0
-

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?

rkor
Člen | 62
+
+1
-

Ten <script> musíš dát až pod {control confirmForm}, protože JS ten prvek nezná, když tam ještě není. A samozřejmě předtím musíš mít načteno jquery

Petr64
Člen | 22
+
0
-

rkor napsal(a):

Ten <script> musíš dát až pod {control confirmForm}, protože JS ten prvek nezná, když tam ještě není. A samozřejmě předtím musíš mít načteno jquery

Díky to byl ten problém. Vyřešeno.