setDisabled a setRequired

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

Ahoj, mohli by jste mi prosím poradit ? Mám ve formuláři textové pole, které ale vyplňuji pomocí výběru v popup okně. Nechci tedy aby někdo mohl přímo do toho pole psát. Nastavím na něj setDisabled, ale pak mi nefunguje required. Uživatel se dostane na další stránku, aniž by vybral nějaká data v popup okně. Když na to setDisabled() nepoužiji, tak setRequired() funguje.

<?php
$form->addText('id', null, 25)->setHtmlId('id')->setDefaultValue($value)
							->setRequired('Musíte zvolit pobočku !')->setDisabled();
?>
enumag
Člen | 2118
+
0
-

Když něco nastavíš disabled tak se ta hodnota myslím vůbec neodesílá, takže required nemá smysl. Řešil bych to tak, že to textové pole by bylo čistě informativní pro uživatele, ale pro potřeby odeslání bych hodnotu ještě kopíroval do hidden inputu. Ten required (snad) být může.

roghill
Člen | 21
+
0
-

U hidden inputu sice required funguje, ale nevypíše se upozornění. Takže uživatel netuší, proč ho to nepustilo na další stránku. Proto jsem to začal řešit přes ten textový input, kde to required fungovalo (dokud jsem ho nezamknul). Takový trošku začarovaný kruh. Rozhodně bych to radši dělal přes ten hidden, textové pole byla jen taková „náhražka“.

hAssassin
Člen | 293
+
0
-

A co zkusit readonly? To se posílá a měnit se to nemůže (jen kopírovat obsah tuším).

roghill
Člen | 21
+
0
-

Super, díky moc, readonly pomohlo. Děkuji Vám oběma.

enumag
Člen | 2118
+
0
-

Vida, na readonly jsem si nevzpomněl. :-) Jen si nejsem jistej zda Nette kontroluje, že to uživatel opravdu nezměnil (např. přes firebug). Pokud to nekontroluje, je nutné to stejně ošetřit ještě jinak.

Pokud se chybové hlášky pro hidden nevypisují, je to dle mého názoru chyba. Kdyžtak si můžeš přidat vlastní validátor na úrovni formuláře, kterej to zkontroluje (tedy alespoň v Nette 2.1).

mildabre
Člen | 62
+
0
-

Také by šlo místo formulářového prvku INPUT type=text použít zápis hodnoty pomocí Javascriptu třeba do vizuálně viditelného prvku LABEL a paralelně do skrytého INPUT type = text ale ne type=hidden ale skrytého třeba pomocí kaskádových stylů (třebas .skryty { display:none;} kde INPUT class=skryty), předpokládám, že Nette nebude zjišťovat pro validaci zda je prvek vizuálně vidět parsováním CSS – zkus také toto.

Jinak je ještě další možnost vícekrokového formuláře, kde v 1. kroku se formulář dotáže na co potřebuje a data uloží do objektu v SESSION, další formuláře data dokompletují a nakonec se objekt ze SESSION uloží do databáze – obvykle je to pro uživatele nejefektnější postup.