proč když nenajde presenter, nepokračuje v routách dál?
- SyXcz
- Člen | 75
Zdravím,
mám menší dotaz… mám web (zatím na localhostu), kde mam i některé
stránky statické, takže je mám jednoduše v databázi a v routách je mam
nastavený tak, aby se mi načítaly rovnou jako root/staticka_stranka, ale
když chci ve stejném modulu použít navíc i možnost jinýho presenteru,
nejde to…
uvádím tu důležitou část rout:
<?php
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('<page>', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'default',
'page' => 'home',
));
?>
nahoře je klasická routa (základní) a dole jsou ty statické stránky… když ty vrchní routy zmažu, statický weby fungujou krásně, ale nemám možnost použít jinej presenter než tenhle Default…
Proč, když v první routě nenajde presenter, tak nepokračuje dál ??
zkoušel jsem i smazat z první routy <?php ‚presenter‘ ⇒ ‚Default‘ ?> že bych tím vymezil presenter jako povinný, a že by v routách pokračoval dál… ale pořát nejde… timhle jsem sice zprovoznil presenter ale zase nefungujou <page>
Edit: mno fungujou, ale pouze jako root/default/?page=home
Editoval SyXcz (30. 10. 2010 20:54)
- SyXcz
- Člen | 75
tak teď nevim jestli jsem tě dobře pochopil, anebo už mi to nějak nemyslí z toho neustálýho přemejšlení :)
routy sem prohodil, a pokud jsem do pochopil dobře, tak za page dal že tam nesmí být lomítko
<?php
$router[] = new Route('<page>[^/]', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'default',
'page' => 'home',
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
?>
ale timhle stylem mi začne generovat i ty presentery bez lomítka… i když odkaz vytvoří ve stylu root/Presenter/ tak po kliknutí mě stejně hodí na root/presenter, což je pro něj :Web:Defaul: page=presenter
- Vyki
- Člen | 388
Vyzkoušej dát page jako povinný parametr, tím že zakomentuješ jeho výchozí hodnotu
<?php
$router[] = new Route('<page>', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'default',
//'page' => 'home',
));
?>
EDIT: .. a nech ho nad tou druhou routou. A ještě mě napadá, že není
úplně v pořádku, že jsou ty výchozí hodnoty parametrů stejné. To kam
se budou odkazovat přes ten zjednodušený tvat bych dál do zvláštního
action.
Pak by to mohlo vypadat takto:
<?php
// matchne example.com/testovacistranka
// link budes generovat jako {link :Web:Default:page, 'testovacistranka'}
$router[] = new Route('<page>', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'page', //v presenteru default si vytvoris action, která to obslouží
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Web',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
?>
Editoval Vyki (30. 10. 2010 22:49)
- SyXcz
- Člen | 75
stále bez výsledku…
mno nic nakonec jsem to udělal tak, že jsem před ty statický stránky hodil preffix „info-“, jsou to stejně většinou stránky s informacema, třeba místo „o-me“ bude „info-o-me“ anebo „info-kontakt“, to pro mě neni tak tragický..
ale třeba do budoucna by bylo dobrý znát odpověď…
anebo kdyby byl někdo schopnej upravit „Nette\Application\Route“ tak, že by třída kontrolovala existenci presenteru, a případně pokračovala dál…
Debugbar mi ukazuje routu „yes“ a „may“ (možná), tak by v případě že neexistuje presenter třeba mohla kouknout jestli souhlasí ta druhá možná routa…
mno nevim, zas tak do hloubky v tom nejsem odborník :)
- SyXcz
- Člen | 75
Vyki napsal(a):
A ještě mě napadá, že není úplně v pořádku, že jsou ty výchozí hodnoty parametrů stejné. To kam se budou odkazovat přes ten zjednodušený tvat bych dál do zvláštního action.
mno tak jsem to zkusil a ani to negeneruje routy,
hlásí error:%20Unable%20to%20pass%20parameters%20to%20action%20'Web:Default:page',%20missing%20corresponding%20method.
Edit: jaj sem neudělal action v presenteru… mno ale stejně mi to ty presentery pořát háže ho tý actionPage
Editoval SyXcz (30. 10. 2010 23:13)
- assassik
- Člen | 43
Místo <page>[^/]
by mělo být
<page [^/]+>
ne?
Nebude to pak dělat problém s Homapage:stranka atd… ale Homepage:default to
bohužel pořád matchne když není action povynný.
Asi bych to viděl na vlastní router pokud tam nechceš mít ty prefixy.
Stačilo by něco jednoduchýho ve stylu
(existuje stránka v DB ? načte z DB
: zkusim najít presenter )
V tomhle nejsem zrovna expert, ale někde na foru tu něco určitě bude.
Editoval assassik (31. 10. 2010 9:07)
- Aurielle
- Člen | 1281
Co použít vlastní styl?
Route::addStyle('#cat');
Route::setStyleProperty('#cat', Route::FILTER_IN, callback('FlashGames\RouterHelper::getCat'));
Route::setStyleProperty('#cat', Route::FILTER_OUT, callback('FlashGames\RouterHelper::getCatPath'));
$router[] = new Route('<category #cat>', array(
'module' => 'Games',
'presenter' => 'Category',
'action' => 'view',
));
A obslužné funkce:
public static function getCat($url)
{
$row = Models\Category::findBySlug($url);
if($row === NULL)
return NULL;
return $row->id;
}
public static function getCatPath($id)
{
$row = Models\Category::findById($id);
if($row === NULL)
return NULL;
return $row->slug;
}