Text s atributem disabled není odesílán
- svezij
- Člen | 69
Ahojte, mám formulář s nějakými textovými inputy. Dále tam mám jeden checkbox, na kterém mám událost onclick. Tato událost nastavuje atribut disabled u jednoho z inputů. Ve výchozím stavu je ale daný input disabled. Když ale zaškrtnu checkbox, atribut disabled se nastaví na false, takže input se zobrazí, stejně se neodešle. Ukážu to na příkladu:
- Mám formulář a v něm následující prvky
$form->addText('disabled_input', 'Input s atributem disabled = true')
->setDisabled(TRUE);
$form->addCheckbox('enable_disable', 'změnit hodnotu atributu disabled')
->setAttribute('onclick', 'if (this.checked) { this.form.disabled_input.disabled = false; } else { this.form.disabled_input.disabled = true; }');
$form->addSubmit('send', 'Odeslat');
$form->onSuccess[] = $this->formSubmitted;
- Obsah metody formSubmitted
echo '<pre>'; var_dump($form->values); exit();
- Kliknu na checkbox, tím se mi text „povolí“ (nastaví se atribut disabled na false)
- Vyplním textbox
- Odešlu formulář
- Na obrazovku se mi vypíše pouze:
object(Nette\ArrayHash)#172 (1) {
["enable_disable"]=>
bool(true)
}
Jak mám ale tohoto chování docílit? Toto byl zjednodušený příklad,
ten textový input není vždycky ve výchozím stavu disabled, jen za
určitých podmínek, atd. Jediné, co mě napadá je nechat ho povolený a
ošetřit to javascriptem, ale to je přece hloupost ne?
Snad je vše pochopitelné, děkuji :-).
- Semik
- Backer | 135
Je to očekávané chování. Formulář se nemůže dozvědět, že jsi si ho povolil. Je to i kvůli bezpečnosti. Přes běžné podmínky ve formulářích by to mělo jít udělat. Případně využít toggle (https://doc.nette.org/cs/forms).
- svezij
- Člen | 69
Omlouvám se, možná budu vypadat trochu natvrdle, ale v podstatě jsem vůbec neporozuměl tvé odpovědi.
ad „Je to očekávané chování“: chápu ;-)
ad „Formulář se nemůže dozvědět, že jsi si ho povolil.“: proč se formulář nemůže dozvědět, že jsem inputy povolil? Budu konkrétní, mám inputy s doručovací a fakturační adresou. Ve formuláři potřebuji aktivní všechny položky fakturační adresy, ale na začátku nechci, aby uživatel musel zadávat fakturační adresu, a dokonce mu to potřebuji zakázat, protože z 90% bude doručovací a fakturační adresa totožná. Klikne-li ale na checkbox „fakturační adresa je rozdílná od adresy doručovací“, musí se mu položky povolit. Napadlo mě vyřešit to pomocí atributu readonly, ale to je přeci principielně špatně, ty položky nejsou readonly, ty položky má prostě zakázané použít, pokud se opravdu neliší doručovací a fakturační adresa.
ad „Je to i kvůli bezpečnosti.“: tomu jsem asi neporozuměl vůbec :-(
ad „Přes běžné podmínky ve formulářích by to mělo jít udělat.“: dělám v Nette první projekt a jsem zatím opravdu začátečník, takže kdybych to říkal špatně, omlouvám se. Jestli jsem dobře pochopil podmínky, tak já mohu zařídit to, že pokud uživatel nebude mít zakliknutý checkbox „fakturační adresa je rozdílná od adresy doručovací“, pak odeslání formuláře neprojde, ale to já nechci – když přeci dám uživateli možnost do něčeho psát, tak mu za to nemůžu „nadávat“, a že si nevšimne nějakého checkboxu je normální. Já mu prostě musím zakázat do toho vůbec psát.
ad „Případně využít toggle“: opět, jestli jsem to dobře pochopil, tak toggle je pro zobrazování a skrývání částí formuláře. Je to super a určitě bych to mohl použít, kdyby ale zadavatel mého projektu nechtěl, aby šly ty adresy vidět od začátku. Toggle tedy použít nemohu.
Pokud to s disabled nepůjde, použiji asi readonly, ale moc se mi to nelíbí i kvůli vzhledu (disabled inputy vypadají opravdu, že se do nich nedá psát, a k nastavování readonly ještě přidávat třídu, kterou obarvím pozadí pomocí css…e-e). Mohl bych poprosit o vysvětlení toho, co nechápu? Mockrát děkuji :-)
- s4muel
- Člen | 92
setDisabled()
nastavi controlu property
disabled a kedze disabled elementy sa standardne cez formular
ani neodosielaju, tak im nette po prijati ani nenastavuje hodnotu do $form
https://api.nette.org/…ner.php.html#…
skus teda namiesto tohto:
$form->addText('disabled_input', 'Input s atributem disabled = true')
->setDisabled(TRUE);
pouzit toto:
$form->addText('disabled_input', 'Input s atributem disabled = true')
->setAttribute('disabled','disabled');
co vo vysledku bude uplne rovnake (html element bude mat predvoleny atribut disabled), ale nette ho nebude ignorovat.
este by sa dal teoreticky pouzit aj getPost() (pretoze ten parameter sa
formularom odosle aj v tom tvojom pripade), ale myslim, ze to prve je
cistejsie
https://api.nette.org/…est.php.html#…
alebo tak, ze ho nedisablujes a disabled=‚disabled‘ nastavis az pomocou javascriptu pri zobrazovani stranky. pripadne ho nastavis rucne ak pouzivas manualne vykreslovanie formulara v latte.
ja by som bol za prve riesenie, najma ak nepouzivas manualne vykreslovanie.
- svezij
- Člen | 69
Ahoj, děkuji za odpověď. Bohužel mi „setAttribute(‚disabled‘, ‚disabled‘)“ nefunguje – prvek se nestane disabled. Zatím jsem to vyřešil s readonly a nastavení pozadí. Metodu getPost moc používat nechci a řešení s javascriptem po načtení stránky se mi nelíbí. Každopádně děkuji, určitě něco nakonec zvolím ;-).
- PavelJurasek
- Člen | 39
setAttribute(‚disabled‘, ‚disabled‘) nefunguje, protože je v Nette chyba, viz tento řádek https://api.nette.org/…rol.php.html#259
Hodnota atributu disabled se přepíše hodnotou $this->isDisabled().
https://github.com/…/issues/1249
Editoval PavelJurasek (26. 9. 2013 20:28)
- dnd
- Člen | 16
je hezké, že se má místo
setAttribute(‚disabled‘, ‚disabled‘)
použít
->setDisabled()
, ale to mi nefunguje, pokud to přidám na prvek
až později (podle vyhodnocení podmínky).
$f = new Form();
$f->addText('revers','revers');
$f->addSelect('purpose_id', 'účel', $this->rPurpose->getList())
->setPrompt('- -');
if($podminka){
//$f['revers']->setAttribute('disabled'); // nefunguje
$f['revers']->setDisabled(); // zešedne. alezobrazovaný obsah inputu zmizí (nemá atribut value)
//$f['purpose_id']->setAttribute('disabled'); // nefunguje
$f['purpose_id']->setDisabled(); // select sice nejde změnit a je šedý, ale nastaví se první možnost (žádná option nemá atribut selected)
}
Takže když bych dal ->setDisabled()
na prvek přímo při
jeho definici, tak to funguje správně,
$f->addSelect('purpose_id', 'účel', $this->rPurpose->getList())
->setPrompt('- -')
->setDisabled();
ale když ho přidám až později viz příklad výše, tak to nefunguje, jak v příkladu popisuji v komentářích. Prosím vás, co dělám špatně?
Beru zpět, vyřešeno. ->setDefaults() musí proběhnout až po ->setDisabled(). Měl jsem to obráceně… Snad to někomu někdy pomůže.
Editoval dnd (23. 12. 2014 15:35)