Routování statické stránky

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

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
+
0
-

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)

Aurielle
Člen | 1281
+
0
-

srigi: Nette\String::webalize()?

rixi
Člen | 109
+
0
-

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
+
0
-

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
+
0
-

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)