Routování statické stránky
- gavec
- Člen | 68
Mám takový problém vytvořil jsem několik statický stránek takovým
způsobem, že jsem vytvořil pro každou stránku vlastní presenter
s akcí.
Teď bych ale chtěl upravit url do nějakého uživatelsky
příjemného tvaru.
V případě že se presenter jmenuje „SidloSpolecnostiPresenter.php“ je jasné, že v bez jakékoliv routy bude url vypadat takto: http://www.....cz/…spolecnosti/
Ja bych ale potřeboval vytvořit takovou routu, která místo „…sidlo-spolecnosti“ vytvoří třeba „…xxx“. Prostě abych si mohl zvolit cokoliv budu chtít.
Zatím moje routa vyadá takto, ale nevypadá moc funkčně.
$router[] = new NRoute('xxx/', array(
'presenter' => 'SidloSpolecnosti',
'action' => 'default',
));
Jedná se o nette 2.0 na PHP 5.3
Za každou radu budu rád.
- srigi
- Nette Blogger | 558
Nerob to takto: Presenter/akcia ⇒ URL. Je to taka zvlastna chyba, ktoru robi kopec zaciatocnikov.
Nadefinuj si taketo routy:
$router[] = new Route('<slug [a-z0-9_-]+>', array(
'presenter' => 'Default',
'action' => 'page',
));
$router[] = new Route('index.php', array(
'presenter' => 'Default',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>[/<id>]', array(
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
A v Default Presenteri si sprav akciu/render v cca takomto tvare:
public function renderPage($slug)
{
$page = Model::findBySlug($slug);
if (!$page) {
throw new BadRequestException('Page not found!', 404);
}
$this->template->page = $page;
}
K tomu je vhodna DB tabulka:
id | integer |
slug | varchar(255) |
title | varchar(255) |
text | text |
Nemusis tak vobec pridavat novy Presenter/akciu, vzdy ked kces pridat novu stranku. Slug generuj z title pomocou tejto funkcie (odpoveda to route).
Editoval srigi (22. 3. 2011 8:29)
- rixi
- Člen | 109
Pouzil som toto velmi pekne a jednoduche riesenie, ale nefunguje pokial by som chcel mat este dalsie podstranky typu domain.com/slug/subslug). Je mozne aj toto nejak vyriesit? Pokial by mal niekto funkcne riesenie alebo by ma k tomu rieseniu v routu a presenteru niekto nakopol, bol by som tomu velmi vdacny.
- Aurielle
- Člen | 1281
Vytáhni si z toho co potřebuješ, nad tvoje potřeby je tam ještě funkčnost navíc (zvlášť u filter in zajišťuje vytáhnutí správných nadřazených IDček, protože slugy nejsou unikátní – jsou unikátní jen v jedné úrovni). Taky musíš počítat jen s jedním parametrem, uvedené funkce používám ve FilterRoute, ne přes normální filtry.
// Filter IN
$catFilterIn = function($slug, $params, $origParams) {
$lang = \Avalon\Models\Language::findByIso($params['lang']);
if(!$lang)
return NULL;
$temp = explode('/', $slug);
$path = array();
$result = \CmsModule\Category::findAll()
->where('[slug] IN %l', $temp)
->and('[language] = %i', $lang->id)
->orderBy('[lft]')
->fetchAssoc('slug[]');
foreach($temp as $part) {
// Match found
if(isset($result[$part])) {
foreach($result[$part] as $part2) {
if($part2->parent_id === 1) { // ROOT ID
$path[] = $part2;
}
else {
$lastPart = end($path);
if($part2->parent_id === $lastPart->id) {
$path[] = $part2;
}
}
}
} else {
return NULL;
}
}
return end($path)->id;
};
// Filter OUT
$catFilterOut = function($id, $params, $origParams) {
static $cache = array();
if($id === 1) { // ROOT - no linking
return NULL;
}
$curId = $id;
$return = '';
do {
if(!isset($cache[$curId])) {
$row = \CmsModule\Category::findById($curId);
if(!$row)
return NULL;
$cache[$curId] = $row;
}
$return = $cache[$curId]->slug . '/' . $return;
if($cache[$curId]->parent_id === 1) // ROOT ID
break;
$curId = $cache[$curId]->parent_id;
}
while(TRUE);
$return = trim($return, '/');
return $return;
};
- vlcakkazan
- Člen | 1
Statické stránky s jedním presenterem (Homepage) a bez jména presenteru
v URL:
Soubor bootstrap.php obsahuje routy:
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<action>', 'Homepage:default');
V URL jsou nyní pouze akce, tedy jména příslušných šablon. Dejme
tomu, že web má dvě stránky.
Pak v adresáři templates/Homepage jsou šablony default.latte a druha.latte,
každá má obsah dané strany. V menu (v šabloně @layout.latte) se
pak na ně odkazuje:
<li><a n:href="default" >Home</a></li>
<li><a n:href="druha" >Druhá</a></li>
Editoval vlcakkazan (30. 9. 2012 15:20)