Získání výchozích hodnot po submitu
- akadlec
- Člen | 1326
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
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)
- Michal Vyšinský
- Člen | 608
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.
- japlavaren
- Člen | 404
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
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
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
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
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
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í.