Tri ruzne routy ve stejném presenteru rozlisene podle action
- Oli
- Člen | 1215
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
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
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
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',
...