Předání JSON v hidden poli ve formuláři

- j0hny
 - Člen | 33
 
Ahoj,
řeším problém s aktuálním Nette (2.4). Potřebuji ve formuláři poslat json, který si generuji do hidden pole na stránce v javascriptu. Protože tohle v aplikaci dělám často, chtěl jsem si na to udělat komponentu do formuláře, dědící od HiddenField a reimplementující metodu getValue takto:
public function getValue()
{
    $value = parent::getValue();
    return json_decode($value);
}
bohužel toto nefunguje, protože parent::getValue() vrátí hodnotu pole oescapovanou, což už funkce json_decode nepřechroustá. Prošel jsem tedy kód nette a zjistil, že toto se děje v Nette\Forms\Helpers::extractHttpData. Tím že je tato metoda statická, není možné ji nějak elegantně nahradit v potomkovi ani si ji zavolat znovu a pokud bych tedy chtěl upravit chování tak, aby se mi pro konkrétní pole zachoval „surový“ vstup z html, musel bych buďto sahat do zdroje Nette (nechci), nebo reimplementovat celou metodu pro získání hodnot formuláře (nechci, duplicity, zbytečná dědičnost).
Neexistuje nějaký elegantnější způsob, jak získat neescapovanou hodnotu z HiddenFieldu? Přísahal bych, že to v minulosti nějak šlo, ale nějak na to nemůžu z kódu přijít.
Předem díky za rady, Johny.

- Jan Tvrdík
 - Nette guru | 2595
 
protože parent::getValue() vrátí hodnotu pole oescapovanou
To nechápu. Co by to jako mělo escapovat? Máš nějaký příklad?

- j0hny
 - Člen | 33
 
@Jan Tvrdík příklad:
toto (v http požadavku v POSTu):
[{"id":1,"from":"1.12.2016","to":"31.12.2016","percent":"10%"},{"id":2,"from":"1.6.2017","to":"30.6.2017","percent":"20%"},{}]
je při slíznutí hodnot formulářem (a jako výsledek getValue v HiddenField) převedeno na toto:
"[{\"id\":1,\"from\":\"1.12.2016\",\"to\":\"31.12.2016\",\"percent\":\"10%\"},{\"id\":2,\"from\":\"1.6.2017\",\"to\":\"30.6.2017\",\"percent\":\"20%\"},{}]"
Děje se to pravděpodobně na řádku 57 v Nette\Forms\Helpers.
@CZechBoY – ajax bohužel pro tento případ (v kontextu aplikace) není možné použít.

- j0hny
 - Člen | 33
 
Tak už se mi to podařilo „odhalit“. Metoda „setValue“ na komponentě je totiž volaná nejen explicitně když chci nastavit hodnotu při definici formuláře, ale i když se loadují data do formuláře při odeslání (přijde mi to trochu podivné, ale nechci kritizovat tak se s tím smířím).
Měl jsem v kopmonentně přepsanou setValue tak, že se v ní volal „json_encode“. Toto fungovalo v pořádku při nastavení hodnoty při vytváření, ale už ne při odeslání formuláře, kde se json_encode zavolal podruhé – proto ten escape.
Editoval j0hny (29. 6. 2017 13:23)

- matopeto
 - Člen | 395
 
j0hny napsal(a):
je při slíznutí hodnot formulářem (a jako výsledek getValue v HiddenField) převedeno na toto:
"[{\"id\":1,\"from\":\"1.12.2016\",\"to\":\"31.12.2016\",\"percent\":\"10%\"},{\"id\":2,\"from\":\"1.6.2017\",\"to\":\"30.6.2017\",\"percent\":\"20%\"},{}]"
Ked dam ten tvoj string do json_decode tak normalne prejde, je to validny json string

- j0hny
 - Člen | 33
 
matopeto napsal(a):
j0hny napsal(a):
je při slíznutí hodnot formulářem (a jako výsledek getValue v HiddenField) převedeno na toto:
> "[{\"id\":1,\"from\":\"1.12.2016\",\"to\":\"31.12.2016\",\"percent\":\"10%\"},{\"id\":2,\"from\":\"1.6.2017\",\"to\":\"30.6.2017\",\"percent\":\"20%\"},{}]"Ked dam ten tvoj string do json_decode tak normalne prejde, je to validny json string
Ano, je to validní JSON string, pro získání pole by se musel zavolat decode dvakrát (dvojité uvozovky na začátku a konci jsou součástí toho stringu). Už jsem na to ale přišel, viz můj příspěvek výše. Každopádně díky!