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

j0hny
Člen | 33
+
0
-

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
+
0
-

protože parent::getValue() vrátí hodnotu pole oescapovanou

To nechápu. Co by to jako mělo escapovat? Máš nějaký příklad?

CZechBoY
Člen | 3608
+
0
-

Co v tom jsonu máš? Nebyl by lepší klasickej ajax požadavek místo formuláře?

j0hny
Člen | 33
+
0
-

@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
+
0
-

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
+
+1
-

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
+
0
-

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!

matopeto
Člen | 395
+
0
-

@j0hny ono to nebolo jasne z tej otazky preco je ten json zly, nabuduce bud presnejsi :)