Tri ruzne routy ve stejném presenteru rozlisene podle action

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

Zdravím,
routování zatím moc nerozumím, tak se chci zeptat jak napsat routu.

Mám presenter, který řeší typy ubytování a jednotlivé ubytování a chtěl bych následující výstupy:

Ubytovani:default
`neco.cz/ubytovani`
Ubytovani:type
`neco.cz/ubytovani/hotely`
Ubytovani:detail
`neco.cz/ubytovani/hotely/konkretni-hotel`

Routovani resim (asi spatne) podle přednášky Honzi Smitka a podle toho, co jsem vyčetl z dokumentace.

class RouterFactory
{
	public $accommodation;
	public $page;

	public function __construct(\AccommodationModel $accommodation, \PageModel $page)
	{
		$this->accommodation = $accommodation;
		$this->page = $page;
	}

	public function createRouter()
	{
		$accommodation = $this->accommodation;
		$router[] = new Route('<presenter (ubytovani)>/[<action type>/]<id>',
		    array(
			'module' => 'Frontend',
			'presenter' => array(
			    Route::VALUE => 'Homepage',
			     Route::FILTER_TABLE => array(
				 'stranky' =>'Pages',
				 'ubytovani' =>'Accommodation',
			     )
			),
			'id' => array(
				Route::FILTER_IN => function ($id) use ($accommodation)
				{
					if (is_numeric($id))
					{
						return $id;
					} else
					{
						dump($id);
						dump($accommodation->getAccmmodationByTypeSlug($id));
//						return $accommodation->getAccmmodationByTypeSlug($id)->id;
					}
				},
				Route::FILTER_OUT => function ($id) use ($accommodation)
				{
					if (!is_numeric($id))
					{
						return $id;
					} else
					{
						if ($accommodation->getAccommodationByType($id))
						{
							return $accommodation->getAccommodationByType($id)->fetch()->slug;
						} else
						{
							return null;
						}
					}
				}
			)
		    ));

		$router[] = new Route('<presenter (ubytovani)>/[<action=detail detail|default>/]<id>',
		    array(
			'module' => 'Frontend',
			'presenter' => array(
			    Route::VALUE => 'Homepage',
			     Route::FILTER_TABLE => array(
				 'stranky' =>'Pages',
				 'ubytovani' =>'Accommodation',
			     )
			),
			'id' => array(
				Route::FILTER_IN => function ($id) use ($accommodation)
				{
					if (is_numeric($id))
					{
						return $id;
					} else
					{
						return $accommodation->getBySlug($id)->id;
					}
				},
				Route::FILTER_OUT => function ($id) use ($accommodation)
				{
					if (!is_numeric($id))
					{
						return $id;
					} else
					{
						if ($accommodation->getRows($id))
						{
							return $accommodation->getRows($id)->slug;
						} else
						{
							return null;
						}
					}
				}
			)
		    ));

Výstup pak mám:
Ubytovani:default – v pořádku
Ubytovani:type – na tuhle routu to nikdy nespadne a spadne to až na tu druhou routu, kde to hodí chybu
Ubytovani:detail – skoro dobre, výstup je: ubytovani/konkretni-hotel

Byl bych moc rád, kdyby mě někdo poradil jak docílit výše požadovaných výstupů.
Díky.

Misneit
Člen | 2
+
0
-

Pokud chceš tebou zmiňovanou adresu ubytovani/hotely odkazující na Ubytovani:type, action vůbec nedávej do adresy a nastav ho jako parametr Routy.
Myslím, že FILTER_TABLE je v tvém případě taky zbytečný. Pleteš všechno dohromady a děláš to zbytečně složitě. Nějak nechápu jestli máš názvy presenterů česky nebo anglicky.

/* Route pro Ubytovani:type */
$router[] = new Route('<presenter ubytovani>/<id>',
            array(
            'module' => 'Frontend',
            'action' => 'type', ... //<------------

Jinak akce detail a default bych ti doporučil rozdělit do dvou Rout. Pokud s routováním začínáš bude to tak lepší a neuděláš chybu.

llsm
Člen | 121
+
0
-

Misneit napsal(a):

Myslím, že FILTER_TABLE je v tvém případě taky zbytečný. Pleteš všechno dohromady a děláš to zbytečně složitě.

Souhlasím, měl by ses zastavit a ještě jednou si pročíst a promyslet, jak routy fungují a jak bys měl docílit toho co chceš, teprve pak to začít bastlit.

Misneit napsal(a):

Jinak akce detail a default bych ti doporučil rozdělit do dvou Rout. Pokud s routováním začínáš bude to tak lepší a neuděláš chybu.

Také souhlasím, je rozhodně snažší udělat dvě jednodušší routy a třeba pak se je snažit spojit do sebe, pokud to má nějaké opodstatnění.

P.S. jinak máš pochvalu, že si na to udělal nové téma a nedal to do toho včerejšího.

Oli
Člen | 1215
+
0
-

Diky chlapi :-)
nakonec jsem to vyřešil bez toho presenteru type.

proste jsem v route rekl, ze to je routa jen pro presenter ubytovani a první routa měla vynucenej slug a druhá bez něj. čili:

$router[] = new Route('<presenter ubytovani>/<parent>[/<id>]',
            array(
            'module' => 'Frontend',
            'action' => 'detail',
            ...

$router[] = new Route('<presenter ubytovani>',
            array(
            'module' => 'Frontend',
            'action' => 'default',
            ...