Dodání podmíněné addCondition na zobrazování divu dle dvou comboboxů

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

Snažím se už delší dobu rozchodit zobrazování jedné části pomocí podmínek a nějak se mě nedaří udělat na to správně podmínku…

Snažím se, aby když:

  1. vybraná hodnota interní – tak bude div id ukonceni_zakaznik schovaný (visible false)
  2. pokud je hodnota zákaznická:
    1. pokud se jedná o stav_id (5 nebo 6) tak div id ukonceni_zakaznik je vidět (visible true)
    2. pokud je jiný stav_id než id (5 nebo 6), nebo ještě není vybraná hodnota, je div id ukonceni_zakaznik schovaný (visible false)

Ať zkouším psí kusy, buď to funguje u „zákaznické“ ale ne u interní nebo naopak… zkoušel jsem i elseConditon a endCondition, ale asi to používám blbě… můžete mě trochu nasměrovat jak správně udělat tuto podmínku?

<?php
    protected function createComponentRmaForm() {
        $form = new Form;
        $form->addSelect('interni', 'Reklamace', Array('Zákaznická', 'Interní'))
                ->setPrompt('Vyberte hodnotu.')
                ->addRule(Form::FILLED, 'Vyberte typ reklamace')
                ->addCondition(Form::EQUAL, '0')
                ->toggle('reklamujici')
                ->toggle('dorucenoPostou');

        $form->addSelect('stav_id', 'Stav', Array(1 => "stav 1",
                2 => "stav 2",
                3 => "stav 3",
                4 => "stav 4",
                5 => "zobrazit A 5",
                6 => "zobrazit B 6",
            ))
                ->setPrompt('Vyberte hodnotu.')
                ->addRule(Form::FILLED, 'Vyberte stav.');

         $form['stav_id']
            ->addConditionOn($form['interni'], Form::EQUAL, '0')
            ->addCondition(Form::EQUAL, Array(5, 6))
                 ->toggle('ukonceni_zakaznik', true);

        $form['stav_id']
            ->addConditionOn($form['interni'], Form::EQUAL, '1')
                 ->toggle('ukonceni_zakaznik', false);

         return $form;
    }
?>
tatyalien
Člen | 239
+
0
-

Tohle taky nefachá, sice se to správně zobrazuje u zákaznické, tak bohužel i u interní… asi nevím jak správně napojit elseCondition a endCondition…

<?php
$form['stav_id']
   ->addConditionOn($form['interni'], Form::EQUAL, '1')
      ->toggle('ukonceni_zakaznik', false)
   ->elseCondition()
	->addCondition(Form::EQUAL, Array(5, 6))
      		->toggle('ukonceni_zakaznik', true)
    	->elseCondition()
        	->toggle('ukonceni_zakaznik', false)
        ->endCondition()
    ->endCondition();
?>
tatyalien
Člen | 239
+
0
-

Nikdo neví jak tedy používat esleCondition atd?

Filip Procházka
Moderator | 4668
+
0
-

Nečetl jsem to, protože mi to na první pohled přijde docela komplikované a nechce se mi vymýšlet ty podmínky. Ale řeknu ti k tomu tohle: Občas je lepší nepoužívat formulářové podmínky a napsat to v čistém javascriptu (jQuery).

tatyalien
Člen | 239
+
0
-

No asi mě nic jiného nezbyde… ale chtěl jsem se alespoň přiučit ala podmínky na formulářích… neva.

tatyalien
Člen | 239
+
0
-

Tak jsem si to nakonec udělal takto (třeba se to někomu hodí):

<?php
protected function createComponentRmaForm() {
        $form = new Form;
        $form->addSelect('interni', 'Reklamace', Array('Zákaznická', 'Interní'))
                ->setPrompt('Vyberte hodnotu.')
                ->addRule(Form::FILLED, 'Vyberte typ reklamace')
                ->addCondition(Form::EQUAL, '0')
                ->toggle('reklamujici')
                ->toggle('dorucenoPostou');

        $form->addSelect('stav_id', 'Stav', Array(1 => "stav 1",
                2 => "stav 2",
                3 => "stav 3",
                4 => "stav 4",
                5 => "zobrazit A 5",
                6 => "zobrazit B 6",
            ))
                ->setPrompt('Vyberte hodnotu.')
                ->getControlPrototype()->onChange('
                    var interni = document.getElementById("interni").value;
                    var stav = this.value;
                    if(interni == 1 && (stav == 5 || stav == 6)) {
                        var el = document.getElementById("ukonceni_zakaznik").style;
                        el.display=block;
                    }')
                ->addRule(Form::FILLED, 'Vyberte stav.');

         $form['stav_id']
            ->addConditionOn($form['interni'], Form::EQUAL, '0')
            ->addCondition(Form::EQUAL, Array(5, 6))
                 ->toggle('ukonceni_zakaznik');

         return $form;
    }
?>
Nox
Člen | 378
+
0
-

Hodně svůj kód vylepšíš pokud místo hardcodovaného JS kódu tam dáš pouze třeba volání JS funkce a tu si napíšeš do svého JS souboru – navíc ji pak můžeš použít na víc místech atd.

tatyalien
Člen | 239
+
0
-

To je možné, ale JS vůbec neumím tohle byl můj první pokus ala dotaz na pana googla jestli se píšou stejně podmínky jako v php a pak jak získat prvek… knížku na javascript teprve plánuji :-) Ale pokud mě nakopneš správným směrem, rád to upravím…

PS-samozřejmně jsem zjistil, že to sice fachá, ale má to boty… například pokud sice vybere uživatel zákaznickou rma, a pak dá stav 5,6 tak se správně zobrazí div, ale pokud pak překliknu na interní rma, zůstane div zobrazený :-( sice pokud pak změním hodnotu stavu, tak se schová, ale je to piplačka na entou…

Claudie1
Člen | 21
+
0
-

Pokud tomu dobře rozumím, pak by to mohlo být nějak takhle:

javascriptová funkce (dej ji do hlavičky html stránky do tagu script nebo do samostatného souboru s kocovkou .js a ten přilinkuj pomocí příslušného tagu. to druhé je myslím lepší řešení, do budoucna můžeš mít těch funkcí víc)

function hideShow() {

var interni = document.getElementById("interni").value;
                    var stav = this.value;
                    if(interni == 1 && (stav == 5 || stav == 6)) {
                        var el = document.getElementById("ukonceni_zakaznik").style;
                        el.display=block;
                    } else {
                        el.display=none;
                    }
}

a tu funci navěsit na onchange stavu i reklamace

tatyalien
Člen | 239
+
0
-

Claudie1: No po napojení kódu, mě přestane fungovat to co je napjené na combobox interni.

Nefunguje pak toggle dle výběru…

<?php
        $form->addSelect('interni', 'Reklamace', Array('Zákaznická', 'Interní'))
                ->setPrompt('Vyberte hodnotu.')
                ->addRule(Form::FILLED, 'Vyberte typ reklamace')
                ->addCondition(Form::EQUAL, '0')
                ->toggle('reklamujici')
                ->toggle('dorucenoPostou');
?>

Kód jsem jen upravil získání elementu, ten byl ve funkci jen v ifu a v else používal taky, nevím jestli to byl překlep, ale upravené to je takto:

<?php
function hideShow() {
    var interni = document.getElementById("interni").value;
    var stav = this.value;
    var el = document.getElementById("ukonceni_zakaznik").style;

    if(interni == 1 && (stav == 5 || stav == 6)) {
        el.display=block;
    } else {
        el.display=none;
    }
}
?>

Editoval tatyalien (21. 7. 2011 18:30)

tatyalien
Člen | 239
+
0
-

Tak snad finální úprava (již mě funguje tak jak chci…), jen jsme musel dodělat schování divu id=„ukonceni_zakaznik“ hned po načtení stránky. Jelikož mě zůstával jinak zobrazený ještě před jakýmkoliv výběrem comboboxu.

Továrnička:

<?php
    protected function createComponentRmaForm() {
        $form = new Form;
        $form->addSelect('interni', 'Reklamace', Array('Zákaznická', 'Interní'))
                ->setPrompt('Vyberte hodnotu.')
                ->setHtmlId('interni')
                ->addRule(Form::FILLED, 'Vyberte typ reklamace')
                ->addCondition(Form::EQUAL, '0')
                ->toggle('reklamujici')
                ->toggle('dorucenoPostou');

        $form->addSelect('stav_id', 'Stav', Array(1 => "stav 1",
                2 => "stav 2",
                3 => "stav 3",
                4 => "stav 4",
                5 => "zobrazit A 5",
                6 => "zobrazit B 6",
            ))
                ->setPrompt('Vyberte hodnotu.')
                ->setHtmlId('stav_id')
                ->addRule(Form::FILLED, 'Vyberte stav.');


        $form['interni']->getControlPrototype()
                ->onchange  = 'hideShow();';

        $form['stav_id']->getControlPrototype()
                ->onchange  = 'hideShow();';

         return $form;
    }
?>

šablona:

<?php
<div id="reklamujici">
    Reklamující
</div>
<div id="dorucenoPostou">
    dorucenoPostou
</div>
<div id="ukonceni_zakaznik">
    ukonceni_zakaznik - vidět jen při stavu 5,6 a zákaznické...
</div>
<script>
    // po načtení stránky okamžitě schovám tento div - bez tohoto jsem ho nedokázal rovnou schovat z nette..
    document.getElementById('ukonceni_zakaznik').style.display='none';
</script>

{control rmaForm}

<script>
function hideShow() {
    var interni = document.getElementById("interni").value;
    var stav = document.getElementById("stav_id").value;
    var el = document.getElementById("ukonceni_zakaznik").style;

    if(interni =="" || stav =="") {
        el.display="none";
    } else {
        if(interni == 0 && (stav == 5 || stav == 6)) {
            el.display="block";
        } else {
            el.display="none";
        }
   }
}
</script>
?>

Poznámka: blbo mě to, když jsme měli nastavené el.display=block;, po asi hodině pokusů a googlení jsem si našel že to má být el.display=„block“;… No neva, chybama se člověk učí

Claudie1
Člen | 21
+
0
-

Kód jsem jen upravil získání elementu, ten byl ve funkci jen v ifu a v else používal taky, nevím jestli to byl překlep, ale upravené to je takto:

<?php
function hideShow() {
    var interni = document.getElementById("interni").value;
    var stav = this.value;
    var el = document.getElementById("ukonceni_zakaznik").style;

    if(interni == 1 && (stav == 5 || stav == 6)) {
        el.display=block;
    } else {
        el.display=none;
    }
}
?>

jo, tam jsem měla blbost, pardon, nevím, čím jsem myslela :-) takhle to bylo myšleno