Dodání podmíněné addCondition na zobrazování divu dle dvou comboboxů
- tatyalien
- Člen | 239
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ž:
- vybraná hodnota interní – tak bude div id ukonceni_zakaznik schovaný (visible false)
- pokud je hodnota zákaznická:
- pokud se jedná o stav_id (5 nebo 6) tak div id ukonceni_zakaznik je vidět (visible true)
- 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
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();
?>
- Filip Procházka
- Moderator | 4668
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
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;
}
?>
- tatyalien
- Člen | 239
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
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
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
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
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