Routa pro převod ze starého url na nové dle statické tabulky

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

Dá se nějak pomocí routeru přesměrovat url: domena.cz/zbozi-kat/zbozikat?kat=3
na akci ‚Categories:default, id=5‘
S tím že 3ka by se změnila na pětku pomocí pevně napsaného pole

Zkoušel jsem to nějak takto ale to se chová uplně divně.

$router[] = new Route('zbozi-kat/zbozikat ? kat=<id>', [
			'id' => [
				Route::FILTER_IN => function ($id) {
					$array =[3 => 5];
					return $array[$id]  //v $id by mela byt 3(hodnota z puvodního url z parametru 'kat'
	//vratit by to melo 5 dle pole
				}
			],
			'presenter' => 'Categories',
			'action' => 'default',
			Route::ONE_WAY
		]);

Díky za pomoc

David Matějka
Moderator | 6445
+
0
-

pomoci rout nemuzes zmenit nazev get parametru. mrkni na globalni filtry, kde dostanes pole vsech parametru a muzes to transformovat dle libosti

Domki
Člen | 310
+
0
-

Aha ono de předat jako pole.
A dotaz kdy použit Filter_in a kdy out?
z dokumentace mi to není moc jasné, resp co použít zde?

David Matějka
Moderator | 6445
+
0
-

filter_in se pouziva pro preklad URL pozadavku na aplikacni request – takze v tomto pripade.
filter_out kdyz se vytvari URL

Domki
Člen | 310
+
0
-

Kdyz to mám takto:

$router[] = new Route('zbozi-kat/zbozikat ? kat=<id>', [
			NULL => [
				Route::FILTER_IN => function(array $params) {
					return $params;
				},
				Route::FILTER_OUT => function(array $params) {
					Debugger::barDump($params);
					$transformArray = [
						3 => 5,
					];
					Debugger::barDump(intval($params['id']));
					$params['id'] = $transformArray[intval($params['id'])];
					return $params;
				},
			],
			'presenter' => 'Categories',
			'action' => 'default',
			Route::ONE_WAY
		]);

Tak mi debuger vypise:
array (5)
filter ⇒ array (7)
action ⇒ „default“ (7)
id ⇒ „1“
presenter ⇒ „Categories“ (10)
________________________________
1

Nějak se to změní id na 1 a skonci na chybe nedefinovany index 1

David Matějka
Moderator | 6445
+
0
-
$router[] = new Route('zbozi-kat/zbozikat', [
            NULL => [
                Route::FILTER_IN => function(array $params) {
                    $transformArray = [
                        3 => 5,
                    ];
					if (!isset($params['kat']) || !isset($transformArray[$params['kat']])) {
						return NULL;
					}
					$params['id'] = $transformArray[$params['kat']];
					unset($params['kat']);
                    return $params;
                },
            ],
            'presenter' => 'Categories',
            'action' => 'default',
            Route::ONE_WAY
        ]);
Domki
Člen | 310
+
0
-

Jo to už skoro funguje ale jen kdyz odendam řadek unset($params[‚kat‘]);.
Pokud tam je tak to smaže nějak tam vloží 1, a skončí to s null a 404 exception.