Přepínání formulářových prvků v závislosti na javascriptu
- wise
- Člen | 161
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
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
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)
- voda
- Člen | 561
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
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
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ě :-)