Form bez zbytku Nette – dynamické zobrazení/skrytí části formuláře v závislosti hodnoty RadioButton

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

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

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

Přesně tohle nasměrování jsem potřeboval.
Díky!

Lukáš

drakul
Člen | 37
+
0
-

Mně to hází chybu: Call to undefined method Nette\Forms\Container::setOption()

lukasruzicka
Člen | 4
+
0
-

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

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

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");