Vytvoření routy s proměnnou

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

Ahoj,

s Routama se peru krátce a zatím ne moc úspěšně. potřeboval bych aby fungovala klasická adresa typu: http://adresawebu.cz/…er/action/id, ale také http://adresawebu.cz/…er/action/id.

V obou případech se načte stejný presenter/akce, jen v případě druhém bude proměnná (třeba slug) obsahovat hodnotu z URL. :/

Vyzkoušel jsem kde co, prohledal ledas co, ale stále nejsem spokojený. Nevím, zda lze routu napsat přes definici nebo přes vlastní router.

pokud někdo tušíte víte či máte nějaký chytrý link, budu moc rád. A předem dík, za jakoukoli radu.

Jan Mikeš
Člen | 771
+
0
-

Podel se o kod sveho routeru, takhle nemuzeme hledat chyby v kodu :-)

siberin
Člen | 6
+
0
-

Zatím jsem došel pouze k následující úpravě, která funguje, ale netuším, zda je to zcela správně.

public function createRouter(Model\mCompanies $companies)
	{
		$router = new RouteList();
		$router[] = new Route('[<locale [a-z]{2}>/]<slug>/[<presenter=Default>[/<action=default>[/<id>]]]', array(
			'locale' => 'cs',
			'slug' => array (
				Route::FILTER_IN => function($slug) use ($companies){
						$company = $companies->getRows(array("slug" => $slug));

						if($company){
							return $slug;
						} else {
							return NULL;
						}
				},
			),
			'presenter' => $presenter,
			'action' => $action,
			'id' => $id,
		));

		$router[] = new Route('[<locale=cs [a-z]{2}>/][<presenter=Default>[/<action=default>[/<id>]]]');

		return $router;
	}

Chybí tam ještě FILTER_OUT u kterého vlastně nevím, jak by měl fungovat :)

Jan Mikeš
Člen | 771
+
0
-

Tyto řádky máš v kódu zbytečně (defaultní hodnotu id nechceš nastavovat a pro presenter a action máš nastaveno již v masce):

'presenter' => $presenter,
'action' => $action,
'id' => $id,

Co ti teda v tuto chvíli nefunguje nebo s čím potřebuješ poradit?

Ps. filterOut() logicky funguje jako opak k filterIn() :-)
filterOut() → transformuje id na slug
filterIn() → transformuje slug na id

U filter in, by jsi měl vracet id záznamu, ty tam vracíš slug, používáš jej jen pro ověření, že záznam existuje? To by podle mě měla být zodpovědnost presenteru a ne routeru.

Editoval Jan Mikeš (4. 12. 2016 16:23)

siberin
Člen | 6
+
0
-

Proto sem píšu, protože tomu moc nerozumím :)
Ano, v podstatě to používám na ověření, protože potřebuju, aby fungovala i varianta presenter/action bez zadaného slug a tedy aby to prošlo na další routu. pokud to jde udělat nějak lépe, jsem otevřen návrhům.

Jan Mikeš
Člen | 771
+
0
-

Pravděpodobně by to šlo udělat přes jednu routu, kde by byl parametr slug volitelný, pak filterIn()/filterOut() dává smysl, jinak by router mohl považovat v případě chybějícího slug parametru presenter jako slug.

Jasně, akorát zkus být co nejvíce konkrétní a jít do detailů, čemu přesně nerozumíš, pak ti bude moci kdokoliv pomoci mnohem lépe a rychleji ;).