Form bez zbytku Nette – dynamické zobrazení/skrytí části formuláře v závislosti hodnoty RadioButton
- lukasruzicka
- Člen | 4
Ahoj,
řeším následující situaci. Pužívám ve svém projektu třídu Form,
aniž bych používal zbytek Nette.
Mám následující formulář:
<?php
$doprava=Array(1=>"Pošta",2=>"Osobně",3=>"PPL");
$fakturacni_adresa=Array(1=>"Fakturační adresa je shodná s dodací.", 2=>"Fakturační adresa je odlišná od dodací.");
$formular = new Form();
$formular ->addText("jmeno", "Jméno: ");
$formular ->addText("prijmeni", "Příjmení: ");
$formular ->addText("ulice", "Ulice: ");
$formular ->addText("mesto", "Město");
$formular ->addText("psc", "PSČ");
$formular ->addText("telefon", "Telefon: ");
$formular ->addText("email", "E-mail: ");
$formular ->addRadioList("adresa", NULL, $fakturacni_adresa);
$formular ->addText("dodaci_jmeno", "Jméno: ");
$formular ->addText("dodaci_prijmeni", "Příjmení: ");
$formular ->addText("dodaci_ulice", "Ulice: ");
$formular ->addText("dodaci_mesto", "Město");
$formular ->addText("dodaci_psc", "PSČ");
$formular ->addTextArea("poznamka", "Poznámka");
$formular ->addRadioList("doprava", "Doprava:", $doprava);
$formular ->addCheckbox("souhlasim", " : Souhlasím s obchodními podmínkami.");
$formular ->addSubmit("odeslat", "Odeslat");
?>
A potřebuji následující.
Pokud uživatel označí „Fakturační adresa je odlišná od dodací.“, tak se mu zobrazí i zbytek formuláře – tzn. prvky „dodaci…“.
Pokud nechá nastavenou defaultní hodnotu „Fakturační adresa je shodná s dodací.“, zobrazí se jen prvky pro vyplnění první adresy.
Jde toto udělat nějak „čistě“, aniž bych si musel psát nějáký svůj Javascriptvý bastl přesně tomuto formuláři na míru?
Děkuji za odpověď,
Lukáš Růžička
- Aurielle
- Člen | 1281
Tvůj problém by měla vyřešit metoda toggle():
$form->addRadioList('adresa', NULL, $fakturacni_adresa)
->addCondition(Form::EQUAL, 2) // 2 = odlišné adresy
->toggle('dodaci_adresa');
$form->addContainer('Dodací adresa')->setOption('container', Html::el('div')->id('dodaci_adresa'));
$form->addText(...);
// A tak dále.
Nezapomneň na přilinkování netteForms.js.
Editoval gmvasek (4. 5. 2011 12:42)
- lukasruzicka
- Člen | 4
Drakul:
Narazil jsem na stejný problém u Containeru (není u něj implementována
metoda setOption). Řešení jsem našel v použití addGroup, který jsem
nastavil jako DIV.
Ale klíčová pro mě byl metoda toggle(), kterou jsem před tím neznal.
<?php
$formular ->addRadioList("adresa", NULL, $radioButtonRuzneAdresy)
->addCondition(Form::EQUAL, 2) // 2 = odlišné adresy
->toggle('dodaci_adresa');
$formular ->addGroup()->setOption('container', Html::el('div')->id('dodaci_adresa'));
?>
Lukáš
Editoval lukasruzicka (6. 5. 2011 11:55)
- Tomáš Votruba
- Moderator | 1114
Je třeba přidat addGroup
k úvodní skupině prvků, jinak
další skupiny budou lítat nahoru.
Pro úplný názorný příklad:
/* CSS, aby nepřekážely čárky */
fieldset {border:none}
<?php
/* form na nákup kreditů */
$pocetKreditu = array(1,2,3,4,5,10,15,20,25,30,40,50,75,100);
$zposobyPlatby = array("Vklad na účet","Sporopay","Další");
$kupitKredityForm = new Form;
$kupitKredityForm->setAction("action/kredity.php?type=koupit");
$kupitKredityForm->addGroup();
$kupitKredityForm->addSelect("pocet","Počet kreditov:",$pocetKreditu);
$kupitKredityForm->addSelect("zposob","Zpôsob platby:",$zposobyPlatby)
->addCondition(Form::EQUAL,1)
->toggle('toggle1')
->addCondition(Form::EQUAL,2)
->toggle('toggle2');
$kupitKredityForm->addText("text","Já tu eště som");
$kupitKredityForm->addGroup()->setOption('container', Html::el('fieldset')->id('toggle1'));
$kupitKredityForm->addText("test2","test2");
$kupitKredityForm->addGroup()->setOption('container', Html::el('fieldset')->id('toggle2'));
$kupitKredityForm->addText("test3","test3");
echo $kupitKredityForm;
?>
- czita
- Člen | 5
Ahoj,
řešil jste někdo přepínání dvou subgroup v hlavní group?
Snažím se dosáhnout něčeho viz. níže, ale s tím rozdílem, že má být hlavní grupa ostatní jen subgrupy.
$form = new Form;
$form->addGroup("Převod zboží");
$form->addSelect("zbozi", "Zboží", array("Zboží 1", "Zboží 2"));
$form->addText("text","Popis");
$form->addCheckbox("vyber","Převod na sklad:")
->addCondition(Form::EQUAL,0)
->toggle('toggle1')
->addCondition(Form::EQUAL,1)
->toggle('toggle2');
$form->addGroup()->setOption('container', Html::el('fieldset')->id('toggle1'));
$form->addSelect("uzivatelID","Uživatel", array("Uživatel 1", "Uživatel 2"));
$form->addGroup()->setOption('container', Html::el('fieldset')->id('toggle2'));
$form->addSelect("skladID","Sklad", array("Sklad 1", "Sklad 2"));
$form->addGroup();
$form->addText("poznamka", "Poznámka");