Parametry odesílané GET formulářem

d@rkWolf
Člen | 165
+
0
-

Snažím se odeslat GET formulářem parametry pro filtrování a zlepšit formát odeslaných dat, problém je s poli z checkboxListů(je tam několik parametrů vybíraných checkboxListy).

Aktuálně mi to generuje asi tak několik kilometrů dlouhou hnusnou adresu(a to je zaškrnuto jen 5 checkboxů:
?filtr1=hodnotaX&filtr2[0]=hodnotaX&filtr3[0]=hodnotaX&filtr3[1]=hodnotaY&filtr4[0]=hodnotaX&filtr4[1]=hodnotaY

Chtěl bych docílit toho, abych měl místo polí něco jako, protože ty filtrované výběry se budou posílat třeba emailem apod.:
?filtr1=hodnota&filtr2=hodnotaX,hodnotaY&filtr3=hodnotaX,hodnotaY...

(eventuelně odděleno něčím jiným, ale čárka mi přijde nejlogičtější)

Mám ty jednotlivé parametry jako persistentní, zkoušel jsem ve zpracování formuláře ty pole převést pomocí implode na řetězec oddělený čárkami, ale jak to odešlu, okamžitě skončím na Error404 Presenteru…A v adrese mám na tom 404 tohle:
?filtr1=hodnota&filtr2[]=hodnotaX&filtr2[]=hodnotaY&filter=gallery.use_filter&do=filterForm-submit

Co dělám špatně? Poradil by mi někdo, jak na to, prosím? Navíc teda při jednom pokusu, kdy sem poslal do redirectu ručně přímo string oddělený čárkou, tak to ještě skončilo s vyescapovanou tou čárkou(nějaké %d2 nebo něco podobnýho teď nevím), což je taky na nic.

Toanir
Člen | 57
+
0
-

To bude souviset s tím, jak se standardně posílají checkboxy přes HTTP. Už jak si popisoval problém mě napadlo, že by bylo pěkný kdyby hodnoty byly třeba v seznamu odděleným čárkami, přesně jak jsi to popsal kousek dál. Tak nějak by se mi to líbilo, ale asi to nepůjde zcela out-of-the-box.

Možná zbytečně složitý řešení:

Myslím že bych se k tomu postavil nějak následovně za použití JS:

  • přiohnul bych komponentu CheckBoxList (nebo bych vytvořil novou, obdobnou) která by:
    • měla nějaký kumulativní hidden field
    • měla checkboxy, který se nebudou submittovat s odesláním formuláře a jejich zaškrtnutí bylo provázaný s hodnotou toho hidden fieldu

Určitě by v takovým případě bylo dobrý být připravený na variantu, kdy není JS k dispozici takže aby komponenta dokázala pracovat i se standardníma checkboxama.

Jednoduchý řešení ale rozházený na více requestů:

… alternativně mě ještě napadlo, že bys mohl mít persistentní parametr pro vybraný hodnoty a po odeslání formuláře filtru by sis posbíral hodnoty checkboxů, uložil si je do persistentního parametru dle libosti a provedl redirect. Při načítání bys zase persistentní parametr dle libosti rozparsoval a nastavil jako defaulty tomu formuláři

Editoval Toanir (14. 5. 2020 9:30)

David Grudl
Nette Core | 8179
+
+4
-

To není špatný nápad, zkusil jsem to naimplementovat do nette/forms

Toanir
Člen | 57
+
0
-

Hustý! :D

d@rkWolf
Člen | 165
+
0
-

@Toanir Jo já se právě snažím co nejvíc vyhnout nějakému rozsáhlejšímu použití JS, protože mi to většinou nechce fungovat…proto jsem se snažil to rozchodit jen s formuláři, snippety a nakonec jsem nastavil odesílání formu při onChange Najou. Takže JS mám celý tuším 2 řádky a asi by se to vecpalo do jednoho. Zatím to mám teda ve formátu jak jsem psal, ale když to jak koukám David naimplementoval, tak to upravím, jak bude releasnutá nová verze Nette Forms.

Já to navíc mám teda ještě obalené momentálně v Contribute Forms-Bootstrap páč se mi to nechtělo vykreslovat celé ručně, takže to stejně nejspíš budu muset to vykreslení předělat, protože tam to asi bude trvat, než se to upraví. I tak je v tom spousta bugů.

David Grudl
Nette Core | 8179
+
0
-

Mělo by to fungovat od nette/forms 3.0.5. Aby netteForms.js balil do checkboxlisty do kompaktní podoby, je potřeba nastavit HTML atribut

$form->setHtmlAttribute('data-nette-compact');
d@rkWolf
Člen | 165
+
0
-

@DavidGrudl jo, všiml jsem si, updatnul sem si nette/forms, ale asi tam mám nějaký problém spojený s tím, že to vykresluju přes Contribute Forms-Boostrap, zkusil jsem to jen tak přehodit na Ui/Forms() a přestalo mi to ajaxově(Najou) odesílat úplně, koukal sem na to a nemůžu najít nic, co by mělo způsobit takovou změnu chování a ne jen zrušení Bootstrap formátování u vygenerovaných formulářových políček…