Statické stranky jak na ne?
- h4kuna
- Backer | 740
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
// 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)
- Panda
- Člen | 569
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).