Přepínání formulářových prvků v závislosti na javascriptu

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

Zdravím,

momentálně řeším takový oříšek (alespoň pro mě :)).
Nette 2, PHP 5.3.

Mám formulář a v něm takovéto 2 prvky:

<?php
	$form->addText('auctionTime')
                ->addRule($form::FILLED, 'Musíte vyplnit dobu inzerce')
                ->addRule($form::INTEGER, 'Doba inzerce musí být číslo')
                ->addRule($form::RANGE, 'Doba inzerce musí být v rozsahu od %d do %d', array(0, 10))
                ->getControlPrototype()->class = "insertInput";

        $form->addText('fixedTime')
                ->addRule($form::FILLED, 'Musíte vyplnit dobu inzerce')
                ->addRule($form::INTEGER, 'Doba inzerce musí být číslo')
                ->addRule($form::RANGE, 'Doba inzerce musí být v rozsahu od %d do %d', array(0, 20))
                ->getControlPrototype()->class = "insertInput";
?>

Rozdíl je pouze v rozsahu.

Na stránce mám 2 divy. Vždy je jeden aktivní, v případě, že kliknu na druhý, první se zdeaktivuje a aktivuje druhý.
K tomu první patří prvek auctionTime, ke druhýmu fixedTime. Podle toho, zda-li uživatel má aktivní první div, ukáže se prvek auctionTime, platí jeho JS a PHP validace. Když klikne na druhý, tak momentálně by měl form validovat druhý a to fixedTime, ale auctionTime už ne.

Doufám, že jsem to vysvětlil správně a pochopitelně :) Pokud ne, zkusím to znova.
Jde mi o to, jestli nemáte ideu jak na to.

Zatím mě napadlo, že zahrnu ve formuláři (a výpisu do stránky) oba inputy a pomocí js vždy budu mít viditelný (display) jeden a druhý bude schovaný a nebude mít nutte-data-rules, abys se nevalidoval, ale zde jsem se právě zasekl, aby se nevalidoval dle JS, ale na straně serveru stále bude.

Co myslíte? :)

voda
Člen | 561
+
0
-

Přidej si do formu checkbox, který bude určovat jestli platí fixedTime nebo auctionTime. Podle toho si pak taky můžeš vybrat při zpracování kterou hodnotu použiješ. A u prvků *Time přidej před pravidla podmínku na hodnotu checkboxu (addConditionOn). A aktivace deaktivace bude samozřejmě přepínat i checkbox. Checkbox můžeš případně skrýt.

studna
Člen | 181
+
0
-

Jsem z toho popisu trošku zmatený. :(

<?php

	$form->addText('auctionTime')
                ->addConditionOn( $form['fixedTime'], ~$form::FILLED )
		->addRule($form::FILLED, 'Musíte vyplnit dobu inzerce')
                ->addRule($form::INTEGER, 'Doba inzerce musí být číslo')
                ->addRule($form::RANGE, 'Doba inzerce musí být v rozsahu od %d do %d', array(0, 10))
                ->getControlPrototype()->class = "insertInput";

        $form->addText('fixedTime')
		->addConditionOn( $form['auctionTime'], ~$form::FILLED )
                ->addRule($form::FILLED, 'Musíte vyplnit dobu inzerce')
                ->addRule($form::INTEGER, 'Doba inzerce musí být číslo')
                ->addRule($form::RANGE, 'Doba inzerce musí být v rozsahu od %d do %d', array(0, 20))
                ->getControlPrototype()->class = "insertInput";

?>

Pak už jen záleží na tom, jak ty inputy budeš aktivovat. Když bude input1 prázdný, bude se validovat input2 a opačně.

Doufám, že jsem to pochopil správně. :)

edit: Je zřejmé, že po aktivaci jednoho inputu bude třeba druhý input „odstavit“ a nastavit mu prázdnou hodnotu.

Editoval studna (27. 2. 2011 0:35)

wise
Člen | 161
+
0
-

Řešení studny se mi zdá jednodušší :) Vyzkouším a dám vědět.

Jen ještě jedna otázka :) Je nějaké validační pravidlo pro kladná čísla nebo si musím napsat vlastní callback?

voda
Člen | 561
+
0
-

wise napsal(a):

Řešení studny se mi zdá jednodušší :) Vyzkouším a dám vědět.

Možná ano, ale pokud někdo vyplní (např. s vypnutým js) nebo jinak podstrčí oba inputy vyplněný, tak se ti validace neprovede.

Jen ještě jedna otázka :) Je nějaké validační pravidlo pro kladná čísla nebo si musím napsat vlastní callback?

Form::RANGE s hodnotou array(0, null)

studna
Člen | 181
+
0
-

voda napsal(a):

wise napsal(a):

Řešení studny se mi zdá jednodušší :) Vyzkouším a dám vědět.

Možná ano, ale pokud někdo vyplní (např. s vypnutým js) nebo jinak podstrčí oba inputy vyplněný, tak se ti validace neprovede.

Na straně serveru se to dá podchytit a zabít neposlušného uživatele hláškou typu „Můžete vyplnit pouze jedno políčko!“. :)

wise
Člen | 161
+
0
-

studna napsal(a):

voda napsal(a):

wise napsal(a):

Řešení studny se mi zdá jednodušší :) Vyzkouším a dám vědět.

Možná ano, ale pokud někdo vyplní (např. s vypnutým js) nebo jinak podstrčí oba inputy vyplněný, tak se ti validace neprovede.

Na straně serveru se to dá podchytit a zabít neposlušného uživatele hláškou typu „Můžete vyplnit pouze jedno políčko!“. :)

A také bude uděláno :-)

Děkuji oběma za rady, vše funguje krásně :-)