Databazova route a zmena presenteru
- tomolas
- Člen | 66
Zdarvim,
trapim sa s podla mna urcite jednoducho riesitelnym problemom. Viem, ze sa tu
podobne temy riesili, ale nepodarilo sa mi podla toho dopracovat k nicomu
pojazdnemu. Chcel by som vytvorit routu, ktora bude komunikovat s databazou.
V db mam 2 druhy zaznamov. Jeden je plnohodnotny (obsahuje text stranky, ktory
sa potom proste vypise) a druhy obsahuje udaj o presenteri a akcii, ktora sa ma
o vyprodukovanie takej stranky postarat. Tu prvu cast (jedoduche vypisanie
stranky podla url v databaze) mam vyriesenu.
Pointa je, ze by som chcel k obom druhom stranok pouzivat rovnaku formu
url.
Napr:
url ⇒ spracovanie
‚kontakt‘ ⇒ jednoduchy vypis
‚galeria‘ ⇒ Gallery:default
‚novinky‘ ⇒ News:default
skusil som napisal vlastnu routu a teraz neviem prist na to, ci robim nieco uplne zle, alebo len trocha zle :)
Stranka vypise Nette\Application\InvalidLinkException a No route for Gallery:default(url=galeria)
bootstrap.php:
<?php
$router[] = new GeneratedPageRoute('<url ([a-zA-Z0-9_\-]+)>', array(
'presenter' => 'Page',
'action' => 'default',
'url' => ''
));
?>
GeneratedPageRoute.php:
<?php
/**
* Funguje, ak hladane url existuje ulozene v
* databaze a stranka je typu generated_page
*/
class GeneratedPageRoute extends Nette\Application\Route
{
public function match(Nette\Web\IHttpRequest $httpRequest)
{
$request = parent::match($httpRequest);
if ($request === NULL){
return NULL;
}
$params = $request->getParams();
$page = dibi::query("SELECT * FROM pages WHERE url=%s", $params['url'], "AND content_type='generated_page'")->fetch();
if (empty($page)){
return NULL; // ziaden match -> koncime
}
$request = new Nette\Application\PresenterRequest(
$page['presenter'],
$httpRequest->getMethod(),
$params,
$httpRequest->getPost(),
$httpRequest->getFiles(),
array('secured' => $httpRequest->isSecured())
);
return $request;
}
public function constructUrl(Nette\Application\PresenterRequest $request, Nette\Web\IHttpRequest $context)
{
$params = $request->getParams();
$uri = $context->getUri()->basePath . rawurlencode($params['url']);
unset($params['url'], $params['action']);
$query = http_build_query($params, '', '&');
if ($query !== '') $uri .= '?' . $query;
return $uri;
}
}
?>
Zaujimave je, ze popri chybovej stranke ladenky sa mi pri route v debug bare zobrazi: Matched ? yes. Class GeneratedPageRoute, Gallery:default, url = galeria.
Vedel by mi niekto poradit, v com je problem?
Budem velmi vdacny za kazdu pomoc!
- David Ďurika
- Člen | 328
cav,
ak som ta spravne pochopil, tak aj ja by som potreboval nieco podobne…
podarilo sa ti to uz vyriesit? ako si natom teraz?