Jak na custom logiku parametru <action> na zaklade ostatnich parametru

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

Ahoj, chtel bych docilit toho aby se mi v routeru nevyskytoval parametr <action> a automaticky se zjistoval podle vyplnenych parametru, napr budu mit vyplneno pouze <productLine> tak bude action=line, budou uvedeny parametry productLine && productCategory tak action=category, podle nejake moji custom logiky, nedari se mi toho ale docilit, porad mi to pada na Invalid link: No route for Product:line(productLine=1)

Pokud uvedu v poli parametru i “action” ⇒ “line” namisto NULL, tak to funguje (samozrejme jen pro action=line, jde mi jen o to, aby router uprednostnil moji custom logiku (a kam ji napsat???) namisto toho aby potreboval explicitne parametr <action>

	$router[] = new Route("<productLine>/[<productCategory>[/<product>]]", [
			"presenter" => "Product",
			"locale" => $lang,
			"action" => NULL,
			NULL => [
				Route::FILTER_IN => function(array $params) {
					//
					return $params;
				},
				Route::FILTER_OUT => function(array $params) {
					//
					return $params;
				},
			]
		]);
newPOPE
Člen | 648
+
0
-

A nie je to preto, ze v FILTER_IN len vratis $params a Nette potom nevie aka action vlastne je. Skusil by som nieco taketo:

//...
Route::FILTER_IN => function(array $params) {
	$params['action'] = 'line'; //aby Nette dostalo action
    return $params;
},
//...
Jan Mikeš
Člen | 771
+
0
-

Mozna na to jdu spatne a lepsim resenim by bylo jeden univerzalni parametr, ktery by sezral vsechno vcetne / a ja to parsoval vse v nem?

Unlink
Člen | 298
+
0
-

A niečo takéto by nefungovalo?

$router[] = new Route("<productLine>", [
	"presenter" => "Product",
    "locale" => $lang,
    "action" => "line"
]);
$router[] = new Route("<productLine>/<productCategory>", [
	"presenter" => "Product",
    "locale" => $lang,
    "action" => "category"
]);
Jan Mikeš
Člen | 771
+
0
-

@newPOPE to jsem zkousel a dostavam stale Invalid link, protoze nette ma tuto routu zafixovanou pouze pro jednu action a to tu kterou urcim ja a uz ji nelze dynamicky menit, pokud v 1. parametru neuvedu <action>

Jan Mikeš
Člen | 771
+
0
-

@Unlink timto resenim jsem se vydal po rade na gitteru. Puvodne jsem to chtel narvat do jedne routy, protoze tam mam filterIn i filterOut funkce pro vsechny parametry, tak ta logika je trosku slozitejsi.

newPOPE
Člen | 648
+
0
-

@Lexi ale to je mozne dynamicky menit (iba ze by nebolo co sa mi nezda :D). Len to vo FILTER_IN musis vratit aj action (a z defaults action vyhodit) v poli $params lebo na zaklade toho potom Nette zostavuje AppRequest (https://api.nette.org/…ter.php.html#188). Cize to co som ti napisal je len example takisto si tam mozes napisat nejaky if

$router[] = new Route("<productLine>/[<productCategory>[/<product>]]", [
        "presenter" => "Product",
        "locale" => $lang,
        NULL => [
            Route::FILTER_IN => function(array $params) {
                if(...) {$params['action'] = 'link'}
				else {$params['action'] = 'category'}

                return $params; // na zaklade $params['action'] si potom Presenter vola akcie...
            },
            Route::FILTER_OUT => function(array $params) {
                // jo a tu musis mat minimalne parametre ktore mas v maske ako povinne inak myslim Nette nevygeneruje link
                return $params;
            },
        ]
    ]);

Editoval newPOPE (29. 9. 2015 14:16)