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)