Routovani – zmena presenteru ve filtru
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.

- Jiří Nápravník
 - Člen | 710
 
Zdravím,
potřebuji poradit, chci docilit nasledneho routovani, aby smerovalo
/profil/1/galerie → Profile:gallery(id)
/profil/1/pratele → List:friends(id)
chci to v jedne route a nastavit ten presenter ve filtru. Vymyslel jsem tohle:
$frontList[] = new Route('/profil/<id [0-9]+>/<action>', [
			'presenter' => [
				Route::VALUE => 'Profile'
			],
			'action' => [
				Route::FILTER_TABLE => [
					'pratele' => 'friends',
					'galerie' => 'gallery',
				],
				Route::FILTER_STRICT => TRUE,
			],
			NULL => [
				Route::FILTER_IN => function($params){
					if($params['action'] ==='friends')){
						$params['presenter'] = 'List';
					}
					return $params;
				}
			]
		]);
když zadám adresu, tak to funguje jak má. ALe pokud chci vytvořit adresu přes {link}, tak se mi vytvoří jen v případě galerie. V případě pratel nikoli. Tipuji, ze je treba i FILTER_OUT ale nejak nevim, jak jej napsat.

- Jan Tvrdík
 - Nette guru | 2595
 
Tipuješ správně, chybí ti tam FILTER_OUT. Nicméně celé to
máš postavené blbě. Lépe třeba takto:
$frontList[] = new Route('/profil/<id [0-9]+>/<slug>', [
	NULL => [
		Route::FILTER_IN => function ($params) {
			if ($params['slug'] === 'galerie') {
				$params['presenter'] = 'Profile';
				$params['action'] = 'gallery';
			} elseif ($params['slug'] === 'pratele') {
				$params['presenter'] = 'List';
				$params['action'] = 'friends';
			} else {
				return NULL;
			}
			unset($params['slug']);
			return $params;
		},
		Route::FILTER_OUT => function ($params) {
			if ($params['presenter'] === 'Profile' && $params['action'] === 'gallery') {
				$params['slug'] = 'galerie';
			} elseif ($params['presenter'] === 'List' && $params['action'] === 'friends') {
				$params['slug'] = 'pratele';
			} else {
				return NULL;
			}
			unset($params['presenter'], $params['action']);
			return $params;
		}
	]
]);