výchozý hodnoty formuláře – select a multiselect

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

Zdravím,

Jde v Nette::AppForm u prvku select nastavit výchozí hodnotu, tak aby se při prvním zobrazení forumláře automaticky zaškrtla nějaká ta položka? A jde to udělat i u multiselectu? – tzn. oznacit jake polozky maji byt vyselectovane atd…:)

Díky

Mas3r
Člen | 116
+
0
-

Zkus přes setValue();

ViliamKopecky
Nette hipster | 230
+
0
-

Mas3r napsal(a):

Zkus přes setValue();

To bych nedoporučoval, pokud by uživatel hodnotu změnil, tak by to formulář neposlal.

Používejte setDefaults()

phx
Člen | 651
+
0
-

Rekl bych, ze setValue je neco jineho nez emptyValue !!! Nebo proc by se to neposlalo?

LM
Člen | 206
+
0
-

enoice napsal(a):

To bych nedoporučoval, pokud by uživatel hodnotu změnil, tak by to formulář neposlal.

Používejte setDefaults()

setDefaults() taky vlastně neudělá nic jinýho než že projde to pole a zavolá nad každým prvkem setValue(), to že se takhle přepsala odeslaná hodnota se dělo v dřívějších verzích nebo to možná dělá jen Form bez presenteru (odeslané hodnoty se nastavili prvku hned po přidání do formuláře).

David Grudl
Nette Core | 8218
+
0
-

Mezi setValue() a setDefaults() v podstatě není rozdíl, jen je důležité to udělat v podmínce if (!$form->isSubmitted()) { ... }.

phx
Člen | 651
+
0
-

Ohledne tohoto jsem nedavno narazil. Mam formular z vice casti (modulu) a kazda cast si generuje svoje prvky a value k nim. Potrebuji value vyplnit pomoci setDefault, ale to pokazde vymaze to co tam dala jina cast. Tak musim nejprve nacit co tam je (getValue()) a pote doplnit co chci a zavolat setDefaults(). Kdyz ale volam poprve getValues() tka mi to vynada, ze formular neni populate(). A at zavolam isSubmitted() nebo setDefautls(). Jenze pri pouziti AppForm isSubmitted() formular nezpopulati:( (ach ta cestina). Ze by BUG?

Mozna by stalo za upravu aby setDefautls() mohlo nastavit vychozi hodnoty jen pro cast formulare (pro container).

OT: Dale i moznost vykresleni samotneho containeru by nebyla spatna. Tusim ze jsi mi to tu nekdy nabizel.

Jod
Člen | 701
+
0
-

David Grudl napsal(a):

Mezi setValue() a setDefaults() v podstatě není rozdíl, jen je důležité to udělat v podmínce if (!$form->isSubmitted()) { ... }.

To platí aj pri využívaní eventov?

David Grudl
Nette Core | 8218
+
0
-

Ok, ok, ok. setDefaults() od nynějška nepřemazává ostatní prvky.

phx
Člen | 651
+
0
-

DEKUJI… mozna by ale bylo fajn udelat neco jako clear() nebo setEmptyValues() pro vymazani formulare. Tedy pokud tam nic takoveho neni.

ViliamKopecky
Nette hipster | 230
+
0
-

phx napsal(a):

DEKUJI… mozna by ale bylo fajn udelat neco jako clear() nebo setEmptyValues() pro vymazani formulare. Tedy pokud tam nic takoveho neni.

Vznikl tam i druhý parametr s výchozí hodnotou FALSE, že neuhodneš co dělá? ;)

David Grudl
Nette Core | 8218
+
0
-

enoice napsal(a):

phx napsal(a):

DEKUJI… mozna by ale bylo fajn udelat neco jako clear() nebo setEmptyValues() pro vymazani formulare. Tedy pokud tam nic takoveho neni.

Vznikl tam i druhý parametr s výchozí hodnotou FALSE, že neuhodneš co dělá? ;)

Vznikl, ale stejně clear() by asi bylo vhodnější. No uvidíme.

David Grudl
Nette Core | 8218
+
0
-

phx napsal(a):

Kdyz ale volam poprve getValues() tka mi to vynada, ze formular neni populate(). A at zavolam isSubmitted() nebo setDefautls().

Ověřování populate je služba programátorovi, která hlídá, jestli formulář používá správným způsobem. To znamená, že před získáváním hodnot metodou getValues() musí být formulář nějak naplněn. Buď tím, že byl odeslán, nebo metodou setDefaults().

phx
Člen | 651
+
0
-

Jasny, ale cekal bych, ze kdyz formular neni ani jednim zpusobem naplnen tak to vrati prazda data. A chtel jsem poukazat na to, ze ve AppForm metoda isSubmitted nepopulatizuje formular. Asi se me myslenky/ocekavani/intuice ubiraji jinym smerem nez Forms:)

David Grudl
Nette Core | 8218
+
0
-

phx napsal(a):

A chtel jsem poukazat na to, ze ve AppForm metoda isSubmitted nepopulatizuje formular.

To je divné. isSubmitted v případě odeslání volá loadHttpData, která populate nastaví na TRUE. Žádnou z těchto funkcí AppForm nepřepisuje.

phx
Člen | 651
+
0
-

Me to neprojde pres tuto podminku. Takze se k zavolani loadHttpData nikdy nedostanu.

// AppForm::processHttpRequest(...)

if (!$presenter->isSignalReceiver($this, 'submit')) return;

Btw: neni to uplne nejnovejsi revize.

David Grudl
Nette Core | 8218
+
0
-

V tom případě ti nemůže AppForm fungovat vůbec. Zkus prosím poslední verzi.

phx
Člen | 651
+
0
-

Funguje az na tento problem:) Ale ok, zkusim…

Je nejaky rozdil mezi SVN a balikem na webu?

phx
Člen | 651
+
0
-

Tak jsem aktualizoval a hazi mi to tuto chybu:(

Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in /srv/www/inet-servis.cz/vks/libs/Nette/Forms/Form.php on line 455

toto je bezezmeny:(

David Grudl
Nette Core | 8218
+
0
-

phx napsal(a):

Tak jsem aktualizoval a hazi mi to tuto chybu:(

Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in /srv/www/inet-servis.cz/vks/libs/Nette/Forms/Form.php on line 455

toto je bezezmeny:(

Opravím.

Vyzkoušej examples/akrabat.forms, jestli funguje.

phx
Člen | 651
+
0
-

Akrabat.forms jede. Kdyz formular neni odeslan (je jen vytvoren a popripade nejak naplnen) tak to danou podminkou neprojde. Tudiz formular neni populated:( Kdyz je form odeslan tak je vse ok. Pres danou podminku to projde a nakonec to v Form::loadHttpData() vykona $this->isPopulated = TRUE

David Grudl
Nette Core | 8218
+
0
-

To je přece zcela správně, ne?

phx
Člen | 651
+
0
-

Tak me tedy mate toto: Kdyz mam formular a chci z nej dostat data (i kdyz tam zadna nejsou ani z odeslani ani z meho naplneni) tak mi to vypise toto: „Form was not populated yet. Call method isSubmitted() or setDefaults().“ Fajn tak jsem ono nacitani obalil do podminky if(!isSubmitted). Kdyz neni odeslano vyplnim data k editaci. Jenze u AppForm metoda isSubmitted nenastavi pri neodeslanem formulari $this->isPopulated = TRUE.

Proc to delam? Mam formular z vice casti (modulu) a kdyz modul nastavuje svoje vychozi hodnoty. A aby si je nepremazal tak musi nacist puvodni a k nim ty svoje pridat. Proto volam getValues() na prazdnem nevyplnenem formulari. (nejaky mudul je vdzy prvni)

ANO ted uz je to zbytecne, kdyz setDefaults() nepremazava ostatni data. Jen jsem to chtel doresit. Takze to asi uzavreme jako OK. Jen ten warning:)

David Grudl
Nette Core | 8218
+
0
-

phx napsal(a):

Tak me tedy mate toto: Kdyz mam formular a chci z nej dostat data (i kdyz tam zadna nejsou ani z odeslani ani z meho naplneni) tak mi to vypise toto: „Form was not populated yet. Call method isSubmitted() or setDefaults().“

Ano, to je záměr.

Fajn tak jsem ono nacitani obalil do podminky if(!isSubmitted). Kdyz neni odeslano vyplnim data k editaci. Jenze u AppForm metoda isSubmitted nenastavi pri neodeslanem formulari $this->isPopulated = TRUE.

To ale přece platí i pro Form, nejen AppForm. Úkolem metody isSubmitted() není nastavit isPopulated na TRUE (ačkoliv to může být vedlejší efekt, pokud formulář skutečně odeslán byl), ale zjistit, zda-li byl formulář odeslán.

Proc to delam? Mam formular z vice casti (modulu) a kdyz modul nastavuje svoje vychozi hodnoty. A aby si je nepremazal tak musi nacist puvodni a k nim ty svoje pridat. Proto volam getValues() na prazdnem nevyplnenem formulari. (nejaky mudul je vdzy prvni)

Rozumím. To jsem právě nechápal.

phx
Člen | 651
+
0
-

OK jen ze ta hlaska je matouci. Nakonec jsem to vyresil tim, ze jsem volal setDefaults(array()).

LM
Člen | 206
+
0
-

David Grudl napsal(a):

phx napsal(a):

Tak jsem aktualizoval a hazi mi to tuto chybu:(

Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in /srv/www/inet-servis.cz/vks/libs/Nette/Forms/Form.php on line 455

toto je bezezmeny:(

Opravím.

Po téhle opravě rev.158 setDefaults ignoruje struktury skládající se z ArrayObject, třeba:

array(3) {
	"name" => …
	"address" => object(DibiRow) {
		…
	}
}
David Grudl
Nette Core | 8218
+
0
-

fixed