Získání výchozích hodnot po submitu

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

Jde nějak donutit formuláře aby vrátily výchozí hodnoty pokud daný element není v POSTu?
Mám vytvořen formulář na celou editaci účtu a chtěl bych ten formulář použít i na jeho částečnou editaci kdy se vyplňuje cca 50% elementů jenže když se ty nepoužité elementy neodešlou tak nemají defaultní hodnoty.

Je na to nějaký fígl? Nebo je potřeba si dělat dva rozdílné formy?

Michal Vyšinský
Člen | 608
+
0
-

Nestačil by ve zpracování formu array_merge defaultních dat a dat z POSTu? (v tomto pořadí)

Editoval Michal Vyšinský (9. 3. 2014 12:53)

akadlec
Člen | 1326
+
0
-

v jakém eventu? onValidate?

Michal Vyšinský
Člen | 608
+
0
-

Já bych to dal až přímo do tvého zpracování formuláře.

public function processForm($form) {
    $defaults = $this->getDefaults();//jak je získáš je na tobě
    $values = $form->getValues(true);
    $data = array_merge($defaults, $values);
}

Tím pádem to co nebude v POSTu bude doplněno výchozími hodnotami.

akadlec
Člen | 1326
+
0
-

No to jaksi nepůjde protože form pak neprojde validací.

greeny
Člen | 405
+
0
-

Co takhle přidat hidden input, který bude obsahovat hodnotu, kterou se rozliší mezi dvěma typy formů a na ten input pak navázat validační pravidla?

akadlec
Člen | 1326
+
0
-

Tak na tohle zase nepotřebuju hidden input ale můžu si info o tom předat v inicializaci formu. Spíš mě zajímá jak donutit nette aby bralo defaultní hodnoty pokud není element v postu.

japlavaren
Člen | 404
+
0
-

akadlec napsal(a):

Tak na tohle zase nepotřebuju hidden input ale můžu si info o tom předat v inicializaci formu. Spíš mě zajímá jak donutit nette aby bralo defaultní hodnoty pokud není element v postu.

to bude problem. ak sa nemylim, validaciu elementov si riesi kazda sub-komponenta (text input, textarea)
napada ma riesenie pretazenie tried elementov a v nich riesit, ze ak data niesu v response, tak nevalidovat (cim samozrejme vytvaras bezpecnostnu dieru, ze tam niekto podstrci neuplne data)

akadlec
Člen | 1326
+
0
-

no bezpečnostní díru v tom nevidím, pokud někdo data nepošle tak se použijou default a to je oč mě jde. I kdyby někdo ten form na straně prohlížeče upravil a přidal nějaká pole, tak by musela projít validací, takže buď by poslal korektní hodnoty a nebo špatně a pak by neprošla validace, takže podle mě co se týká bezpečnosti je to ok.

by chtělo nějaky event beforevalidate kde by se provedlo znova naplnění daty těch elementů co nebyly v postu, nebo nevim :(

greeny
Člen | 405
+
0
-

Pak je ještě možnost javascript, který provede naplnění defaultníma hodnotama po submitu…

<form data-default-autocomplete>
<input type="text" name="foo" placeholder="fooValue">
<input type="text" name="bar" placeholder="barValue">
<input type="submit" name="save">
</form>
$('form[data-default-autocomplete]').on('submit', function(){
	$(this).each('input', function(){
		var value = $(this).value;
		if(value === '') {
			$(this).val($(this).attr('placeholder'));
		}
	});
	return true;
});

Je to jen nástřel ale něco takového by mohlo fungovat.

akadlec
Člen | 1326
+
0
-

Což je taky nonsense že to by se ty hodnoty musely předat klientovi:-)

greeny
Člen | 405
+
0
-

Aha já myslel, že klient o těch hodnotách ví :(

akadlec
Člen | 1326
+
0
-

Nene, myšlenka je taková že mám postavený form co updatuje uživatelský účet, klasika jméno, email, adresa atd. Tento form se zobrazí celý na stránce editace profilu, jenže pak mám na detailu uživatele ještě možnost takové inline editace, takže uživateli zobrazím mini form kde bude třeba jen jméno a email nebo jiný miniform kde bude jen adresa. A co chci je, že místo toho abych na každý miniform dělal vlastní komponentu formuláře, tak využít ten jeden velký form jen s tím že ne všechny pole se uživateli zobrazí a ty co se nezobrazí budou mít default hodnotu aby je pak mohl zpracovat form processor který samozřejmě vyžaduje téměř vše.

Je to čeho se snažím dosáhnout špatný návrh aplikace?

Tomáš Kolinger
Člen | 136
+
0
-

Je to hodně WTF přístup. Poličko které nevykreslíš logicky nemůže mít žádnou hodnotu. Hackování formuláře aby tohle šlo není nejlepší cesta (musel by si koukat, zda bylo či nebylo pole vykresleno a to je IMHO fůj). Radši formulář rozděl např. https://pla.nette.org/…vs-kompozice a potom vytvoření mini formuláře znamená jen použít container z velkého. Takže duplicitního kódu bude minimum.

Alternativa je upravit velký form tak, že se input do formuláře vůbec nepřidají (prostě obal ifem) a následně ve zpracování budeš hodnoty zpracovávat podle toho, zda onen input ve formuláři je, pokud ne, tak hodnotu aktualizovat nebudeš a tím zůstane stejná ale rozdělení formuláře je čistější.

akadlec
Člen | 1326
+
0
-

No taky možnost že se zbavím duplicity nicméně se asi nevyhnu vytvoření několika továrniček :(

Za mě ale nejde o hackování. Máš třeba input pro jméno a když ten form otevřeš tak pomocí default hodnot se ti předvyplní třeba „Franta Novák“ a uživatel jej může editovat. Pak vemu druhý form kde tohle pole nebude, logicky jej uživatel nebude moci ovlivnit ale při zpracovávání by form jednoduše vzal jeho výchozí hodnotu tedy „Franta Novák“ a pracoval s ní.