Universální nastavení route pro admin, page slug a presentery obecně
- mackiee
- Člen | 5
Zdravím,
snad by mi někdo mohl pomoci, nevím si už rady.
Mým cílem je docílit toho, aby router nejdrive zkoumal jestli existuje stránka v databázi (dle URL) a pokud ne, tak aby se podíval jestli existuje adekvátní presenter. Nedaří se mi toho docílit, současně mi to sice funguje, ale musím každý (front) presenter explicitně v routeru uvést (např. viz Users). Prostě ta poslední routa se nespustí i když presenter existuje a když ji dám před tu routu co spouští ty stránky tak se zase nespustí ta :-( Poradí někdo prosím?
Současný router vypadá takto:
<?php
/**
* @return Nette\Application\IRouter
*/
public function createRouter()
{
$this->checkRedirect($_SERVER['REQUEST_URI']);
$router = new RouteList();
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
// admin route
$router[] = new Route('admin/<presenter>/<action>/[<id>/]', array(
'module' => "admin",
'presenter' => 'Adminhome',
'action' => 'default',
'id' => NULL,
));
// front route
$router[] = new Route('user/<action>/[/<id>]', array(
'presenter' => 'User',
'action' => 'default',
'id' => NULL,
));
// front route
$router[] = new Route('product/<action>[/<id>]', array(
'presenter' => 'Product',
'action' => 'default',
'id' => NULL,
));
$pages = $this->db; // must have for PHP 5.2?
$router[] = new Route('<id .+>', array(
'presenter' => 'Page',
'action' => 'default',
'id' => array(
Route::FILTER_IN => function($id) use ($pages){
if(is_numeric($id)){
return $id;
} else {
$page = $pages->query('SELECT id FROM pages WHERE url = ?', $id)->fetch();
if($page){
return $page->id;
} else {
return false;
}
}
},
Route::FILTER_OUT => function($id) use ($pages){
if(!is_numeric($id)){
return $id;
} else {
return $pages->table('pages')->get($id)->url;
}
},
),
));
// front route
$router[] = new Route('<presenter>/<action>/[/<id>]', array(
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
return $router;
}
?>
- sKopheK
- Člen | 207
V routeru se do detailu nevyznám, ale přijde mi, že když se to
„chytne“ na tu routu <id .+>
, což je jakákoliv URL ve
tvaru web.cz/cokoliv
, už se pouští Page presenter s akcí
default a řeší se jen, co bude v tom parametru id
.
Tohle určitě už někdo řešil, tak bych si počkal na názor někoho zkušenějšího.
- mackiee
- Člen | 5
sKopheK napsal(a):
přijde mi, že když se to „chytne“ na tu routu<id .+>
, což je jakákoliv URL ve tvaruweb.cz/cokoliv
, už se pouští Page presenter s akcí default a řeší se jen, co bude v tom parametruid
.
Ano přesně tak, ale když pravidla otočím, tak mi laděnka říká, že neexistuje presenter prostě – nespustí tu další routu…
Tohle určitě už někdo řešil, tak bych si počkal na názor někoho zkušenějšího.
Snad :-)
- Michal Vyšinský
- Člen | 608
Ahoj, mělo by pomoci ve filterIn vracet NULL namísto FALSE. Viz tato diskuse: https://forum.nette.org/…d-nevyhovuje#…
- mackiee
- Člen | 5
Michal Vyšinský napsal(a):
Ahoj, mělo by pomoci ve filterIn vracet NULL namísto FALSE. Viz tato diskuse: https://forum.nette.org/…d-nevyhovuje#…
Ano, funguje! Zázrak – moc děkuju! :-)
routy tedy mohu již otočit a nemusím zmiňovat presentery explicitně, pokud by to někdo potřeboval tak to mám takto:
<?php
/**
* @return Nette\Application\IRouter
*/
public function createRouter()
{
$this->checkRedirect($_SERVER['REQUEST_URI']);
$router = new RouteList();
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
// admin route
$router[] = new Route('admin/<presenter>/<action>/[<id>/]', array(
'module' => "admin",
'presenter' => 'Adminhome',
'action' => 'default',
'id' => NULL,
));
$pages = $this->db; // must have for PHP 5.2?
$router[] = new Route('<id .+>', array(
'presenter' => 'Page',
'action' => 'default',
'id' => array(
Route::FILTER_IN => function($id) use ($pages){
if(is_numeric($id)){
return $id;
} else {
$page = $pages->query('SELECT id FROM pages WHERE url = ?', $id)->fetch();
if($page){
return $page->id;
} else {
return NULL;
}
}
},
Route::FILTER_OUT => function($id) use ($pages){
if(!is_numeric($id)){
return $id;
} else {
return $pages->table('pages')->get($id)->url;
}
},
),
));
// front route
$router[] = new Route('<presenter>/<action>/[/<id>]', array(
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
return $router;
}
?>