Problém načtením správného presenteru ve vlastním routeru
- unset
- Člen | 16
Ahoj, zkouším si napsat vlasní router ale narazil jsem na jeden problém. V DTB mám uložené informace o jednotlivých stránkách které rozlišuji na dynamické(možnost editace v administraci) a statické(latte šablony bez možnosti editace). V tabulce mám uložený i slug pro jednotlivé stránky podle kterého si pak vytvářím url tímto způsobem:
RouterFactory:
$router[] = $front = new RouteList('Front');
$front[] = new DynamicRouter($this->menu);
$front[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
Ve vlasním routeru mám:
function match(IRequest $httpRequest){
$slug = $httpRequest->getUrl()->getQueryParameter('slug');
$row = $this->menu->getBySlug($slug);
if(!$row) {
return null;
}
$presenter = $row->presenter;
$params = $httpRequest->getQuery();
$params['action'] = 'default';
$params['slug'] = $slug;
return new Request(
$presenter,
$httpRequest->getMethod(),
$params,
$httpRequest->getPost(),
$httpRequest->getFiles(),
[Request::SECURED => $httpRequest->isSecured()]
);
}
function constructUrl(Request $appRequest, Url $refUrl) {
$params = $appRequest->getParameters();
$slug = isset($params['slug']) ? $params['slug'] : null;
$action = isset($params['action']) ? $params['action'] : null;
if($action !== 'default' || !is_string($slug)) {
return null;
}
unset($params['slug'], $params['action']);
$url = new Url($refUrl->getBaseUrl() . $slug);
$url->setQuery($params);
return $url->getAbsoluteUrl();
}
Url se mi vytvoří přesně jak chci například example.cz/kontakt ale laděnka mi vyhodí chybu že nemůže načíst presenter kontakt viz chyba:
Cannot load presenter 'Front:Kontakt', class 'App\Presenters\FrontModule\KontaktPresenter' was not found.
což je jasný když ten presenter nexistuje pototže tato stránka by si měla načítat DynamicPresenter. Nevíte proím někdo kde dělám chybu? Děkuji
- David Matějka
- Moderator | 6445
ten slug „kontakt“ mas v path a ne v query parameters. viz treba https://github.com/…omRouter.php#L33
- unset
- Člen | 16
@DavidMatějka Díky už to funguje správně. Jen bych se ještě chtěl zeptat jak vyřešit v menu classu active pokud se zrovna nacházím na danné stránce. Zkoušel jsem něco jako:
{ifCurrent $item['href'] slug => $item['slug']}class="active"{/ifCurrent}
Ale určitě mám spatně parametry uvnitř ifCurrent. Díky za radu
- Myiyk
- Člen | 321
@unset
{if $control->isCurrent(...) || $control->isCurrent(...) || $control->isCurrent(...)}
...
{/if}
je to sice škaredé, ale značně jednodušší než vymýšlet nějakou
komponentu. Možná něco použitelného je v Doplňcích.
Třeba tohle https://componette.org/search/?…,
ale nezkoušel jsem to, tak nevím.
Editoval Myiyk (29. 12. 2015 17:59)