Spatne presmerovani u GET metody

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
+1
-

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)

duke
Člen | 650
+
0
-

Nejde jen o překlep „kategoriee“?

A tím, že se ti „přeupraví“ url máš na mysli, že Nette automaticky provede redirekci v rámci kanonizace url? Možná by bylo šetrnější pro server řešit toto přímo v javascriptu a rovnou vyvolat redirekci na cílené url.

Jan Mikeš
Člen | 771
+
0
-

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

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

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)

Ot@s
Backer | 476
+
0
-
$router[] = new Route('[!<kategorie [0-9]+>/]<presenter>/<action>[/<id>]', 'Intro:default');
Jan Mikeš
Člen | 771
+
0
-

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 :)

Jan Mikeš
Člen | 771
+
0
-

Problem se teda tyka spise routovani nez formularu…

Vyzkousel jsem

$this->autoCanonicalize = FALSE;

a po rucnim zadani „/galerie/?kategorie=5“ mi adresa zustane, ale v debuggbaru se parametr nerozezna a povazuje ho za NULL, tak uz nevim kde muze byt chybka

kravčo
Člen | 721
+
0
-

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?

duke
Člen | 650
+
0
-

A nemáš tam ještě nějakou jinou routu, která ti to po té redirekci zachytává? Pokud ano, mohlo stačit prohodit pořadí těch rout.

Jakub Bouček
Člen | 54
+
+1
-

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

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…