Spatne presmerovani u GET metody
- Jan Mikeš
- Člen | 771
Zdravim, mam tuto routu:
$router[] = new Route('[<kategorie [0-9]+>/]<presenter>/<action>[/<id>]', 'Intro:default');
a tento formular:
public function createComponentFiltrForm(){
$form = new UI\Form;
$form->setMethod("GET");
$form->addSelect("order", "", array("new" => "od nejnovějších", "old" => "od nejstarších",))->setPrompt("--");
$form->addSelect("kategoriee", "", $this->kategorie_all->fetchPairs("id", "value"))->setPrompt("--");
return $form;
}
Odesilam pres jquery metodou .change(), vysledna url by mela vypadat ± „/galerie/?order=new&kategorie=5&do=filtrForm-submit“ s tim ze diky route se preupravi na „/5/galerie/?order=new&do=filtrForm-submit“
jenze bohuzel parametr kategorie se mi vubec v adrese neobjevi. Pokud ho prejmenuji napr na kategoriee tak je vysledek „/galerie/?order=new&kategoriee=5&do=filtrForm-submit“ takze je pravdepodobne problem nekde ve spolupraci routovani s get formularem.
Nevite nekdo jak to vyresit tak, abych mohl vyuzit router a tim mit hezci url?
Editoval Lexi (13. 3. 2012 12:07)
- Jan Mikeš
- Člen | 771
Nejde o preklep. Mozna jsem spatne popsal problem.
Kdyz mam nastavenou vyse zminenou routu, tak vysledna url je „/galerie/?order=new&do=filtrForm-submit“ parametr kategorie se uplne vytrati
Pokud routu smazu tak je vysledek spravne „/galerie/?order=new&kategorie=5&do=filtrForm-submit“, routou se snazim docilit toho, aby vysledek byl tento „/5/galerie/?order=new&do=filtrForm-submit“ pokud adresu napisu rucne, aktivuje se mi prislusna routa a vysledek je spravne a vse funguje tak jak ma. Odeslanim formulare se na tuto adresu ale nedostanu.
Redirekci nikde nenastavuji, js vypada takto:
$("#frmfiltrForm-order, #frmfiltrForm-kat_id").change(function(){
this.form.submit();
});
Editoval Lexi (13. 3. 2012 12:52)
- duke
- Člen | 650
A máš parametr „kategorie“ nastaven v presenteru jako persistentní? Případně máš ho jako parametr u renderDefault?
Možná to víš, ale definicí routy neovlivníš přímo link generovaný submitem formuláře (co se hodnot formuláře týče). Ten ti to bude vždy cpát do query stringu (pokud používáš GET). Ale pokud se ti to vytrácí, tak to znamená, že Nette (nebo tvá aplikace) provádí následnou redirekci, během níž se ten parametr ztratí.
Editoval duke (13. 3. 2012 13:03)
- Jan Mikeš
- Člen | 771
Mam
public function actionDefault($order, $kategorie)
a tedka jsem zkousel i persisentni parametr, beze zmeny. Musi se to 100% nekde ztracet pri redirectu, otazkou je ale proc?
edit: vsiml jsem si, ze kdyz rucne napisu do url „/galerie/?kategorie=5“ tak se redirectne na „/galerie/“, takze to dela nejen pri odesilani formulare, kdyz ale rucne napisu „/5/galerie/“ tak to zustane a v debugg baru vidim spravne parametr kategorie =>5
Editoval Lexi (13. 3. 2012 13:18)
- Jan Mikeš
- Člen | 771
Ot@s napsal(a):
$router[] = new Route('[!<kategorie [0-9]+>/]<presenter>/<action>[/<id>]', 'Intro:default');
Nevim co presne ma ten ! delat, ale problem to nevyresilo a navic pribyla
chybka No route for Galerie:default()
pokud neni parametr kategorie
zadan a vsechny odkazy ve webu zcervenaly s tim, ze pro ne nyni neexistuje
routa :)
- kravčo
- Člen | 721
Lexi napsal(a):
Odesilam pres jquery metodou .change(), vysledna url by mela vypadat ± „/galerie/?order=new&kategorie=5&do=filtrForm-submit“ s tim ze diky route se preupravi na „/5/galerie/?order=new&do=filtrForm-submit“
Tá url sa zrejme „neupraví“… A mám pocit, že je to tak správne. Mohlo by pomôcť pridať routu pre kategóriu v query, ale skôr mám pocit, že sa snažíš urobiť niečo neštandardnou cestou…
$router[] = new Route(
'[<kategorie [0-9]+>/]<presenter>/<action>[/<id>]',
'Intro:default');
$router[] = new Route(
'<presenter>/<action>[/<id>] ? <kategorie>',
'Intro:default', Route::ONE_WAY);
jenze bohuzel parametr kategorie se mi vubec v adrese neobjevi. Pokud ho prejmenuji napr na kategoriee tak je vysledek „/galerie/?order=new&kategoriee=5&do=filtrForm-submit“ takze je pravdepodobne problem nekde ve spolupraci routovani s get formularem.
Nevite nekdo jak to vyresit tak, abych mohl vyuzit router a tim mit hezci url?
- Jakub Bouček
- Člen | 54
Ahoj, omlouvám se, že obovuji toto vlákno, ale nenašel jsem zde řešení – tedy nějaké resolutní sdlění a vysvětlení toho, proč Nette dělá to, co dělá.
Mám URL:
http://www.nejakyweb.cz/bookmarks/?platform=facebook
A k ní routu:
$router[] = new Route( 'bookmarks/', array(
'presenter' => 'Bookmarks',
'action' => 'list'
));
Rád bych jej upravil, aby parametr byl součástí cesty.
http://www.nejakyweb.cz/bookmarks/facebook/
A k ní routu:
$router[] = new Route( 'bookmarks[/<platform>]/', array(
'presenter' => 'Bookmarks',
'action' => 'list',
));
OK, problém je, že starý tvar URL nyní nefunguje korektně. Nette přesměruje tak na půl – parametr vyhodí z query stringu, ale zároveň jej nedoplní podle platné routy:
http://www.nejakyweb.cz/bookmarks/
místo očekávaného
http://www.nejakyweb.cz/bookmarks/facebook/
Chápu důvody k přesměrování, v rámci kanonizace URL odstraní parametr, protože jej vynuluje defaultní hodnota routy a tak jej vyhodí.
Ale z pohledu práce s daty mi to přijde jako chyba. Parametr je jednou předán, Nette by jej IMHO mělo akceptovat, pokud není vysloveně zadáno podle volitelné masky [/<platform>].
Pokud to není bug, pak prosím o stručný popis, proč se to tak chová. Popř link na jiné místo v diskuzi, kde by se to dalo vysvětlit.
Dodatek:
Vím, že řešení problému je ONE_WAY routa s otazníčkem. O to mi
nejde – nosnou otázkou je, zda vám přijde OK, že Nette bez varování
zahazuje parametry, které se jí dostanou nevhodnou cestou. Přitom ale ten
parametr dostane a IMHO je to jen o nastavení priorit, jestli se upřednostní
GET parametr ve query před výchozí hodnotou (NULL) u nevyplněného
volitelného parametru v URL.
Editoval bukaJ (10. 8. 2012 15:25)
- David Grudl
- Nette Core | 8228
Zjednodušeně: Route brání tomu, aby parametr, který se předává v cestě, nebylo možné předat přes query.
Otázka je, jestli tuhle ochranu odstranit. V podstatě by to obnášelo přidat kontrolu regulárním výrazem pro parametry v query. Ale nevím, jestli by to byl krok správným směrem…