Problém načtením správného presenteru ve vlastním routeru

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

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

ten slug „kontakt“ mas v path a ne v query parameters. viz treba https://github.com/…omRouter.php#L33

unset
Člen | 16
+
0
-

@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

CZechBoY
Člen | 3608
+
0
-

Je to klasickej if…
{ifCurrent odkaz}co se ma provest{/ifCurrent}

<a n:href="Home:register" {ifCurrent Home:register}class=active{/ifCurrent}>register</a>
unset
Člen | 16
+
0
-

Už se mi to podařilo opravit měl jsem tam překlep v kódu po předchozích úpravách. Jen bych se chtěl ještě zeptat jak řešíte ifCurrent když máte dropdown menu. Jak udělat aby jsme měl označený clasou activ u element do kterého patří označená část v menu. Děkuji

Myiyk
Člen | 321
+
0
-

@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)