Statické stranky jak na ne?

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

Ahoj prosim potreboval bych pomoct, jak nejlepe navrhnout vytvareni, editaci, mazani a spravne prirazeni adresy (url) pro staticke stranky, neco jako tady na Nette wiki.

  • stranka je nekde v db
  • po prihlaseni je editabilni (zatim neni podstatne)
  • do budoucna nevim jak se budou jmenovat tzn neznam url a vse s tim spojene (presenter, sablony…)
  • nechci aby se mi vytvareli prazdne presentery

koncepce

  • trida (model) spravujici zjisteni zda stranka existuje, vytazeni z db, jeji vykresleni, pripadne ukladat do cache k tomu nejspise jedna sablona kam se vykresli obsah db + drobne kosmeticke (html) upravy

Moje napady

  • pres router to predat sprevnemu presenteru, ale to zase v url budu muset mit nejaky ‚priznak‘
  • doufal jsem ze nez to spadne do error presenteru ze to odchytim, avsak to mi prislo proti srsti

Jinak jak to resit?

Editoval matata (25. 2. 2010 19:49)

Panda
Člen | 569
+
0
-
// PageRoute.php

class PageRoute extends Route
{
	public function match(IHttpRequest $httpRequest)
	{
		$request = parent::match($httpRequest);

		if ($request === NULL)
			return NULL;

		$params = $request->getParams();
		$model = new PagesModel();
		if ($model->exists($params['uri']))
			return NULL;

		return $request;
	}
}
// bootstrap.ini

Route::addStyle('#pageUri', NULL);
Route::setStyleProperty('#pageUri', Route::PATTERN, '.+?');

$router[] = new PageRoute('<uri #pageUri>', array(
	'presenter' => 'Page',
	'action' => 'default'
));
// PagePresenter.php

class PagePresenter extends BasePresenter
{
	public function renderDefault($uri)
	{
		$model = new PagesModel();
		$this->template->page = $model->fetch($uri);
	}
}

Stačí pro představu?

Editoval Panda (25. 2. 2010 19:59)

h4kuna
Backer | 740
+
0
-

Diky moc, urcite mi to je jasnejsi a tusim jak dal,
avsak bych potreboval vysvetlit co se deje v bootstrapu.
Ke kazdemu radku dat nejaky komentar.
Pac mi to zatim nemaka, koukal jsem na to pres zapnuty RoutingDebugger a ani jednou mi to nezachytilo v tom spravnem miste.

Panda
Člen | 569
+
0
-

Ta konstrukce s tím Route::addStyle(...) atd. je kvůli možnosti mít speciální znaky v URI, například /, případně diakritiku. Pokud to nepotřebuješ, můžeš tu routu předefinovat prostě a jednoduše takto:

$router[] = new PageRoute('<uri>', array(
        'presenter' => 'Page',
        'action' => 'default'
));

A teď se tu podivnou konstrukci pokusím vysvětlit…

Route::addStyle('#pageUri', NULL);

Vytvoří nový „styl“ parametru s názevm #pageUri – to nám umožní definovat vlastní funkce pro filtraci parametru v URL, respektive nedefinovat žádné. Normálně se na parametry v routách aplikují filtry, které neumožňují používat výše zmíněné speciální znaky. NULL jako druhý argument říká, že styl nemá dědit vlastnosti od žádného jiného stylu a tím pádem nepřebírat ani žádné další filtry.

Route::setStyleProperty('#pageUri', Route::PATTERN, '.+?');

Nastaví samotný regulární výraz pro styl parametru, který matchne vše. Když jsem si s tím kdysi hrál, tak mi ke správné funkci pomohlo udělat výraz ungreedy, proto .+?.

$router[] = new PageRoute('<uri #pageUri>', array(
        'presenter' => 'Page',
        'action' => 'default'
));

A to je samotná routa, kde parametr uri používá nadefinovaný styl #pageUri.

Je to už nějaký čas, co jsem toto řešení použil, tak je možné, že si řešení moc nerozumí s aktuálním Nette (čti: s Nette mladším než půl roku).

h4kuna
Backer | 740
+
0
-

Zatim dekuji,

pohraju si s tim a kdyztak pisnu.