Routování bez přesměrování, vyžaduji podstrčení
- Daewoo
- Člen | 36
Ahoj,
snažím se zapracovat následující schéma:
/admin/... --- věci v administraci (dále už front)
/[slug] --- může být článek, kategorie článků, typ zájezdu, destinace i zájezd
/[slug]/[slug] --- může být článek v kategorii, destinace pro typ zájezdu, zájezdy do destinace
/[slug]/[slug]/[slug] --- je konkrétní zájezd, navíc daného typu, do destinace
Řeším routerem od Myiyk a ten funguje. Jediné nežádoucí chování je, že router na zvolený presenter přesměrovává (mám svoje presentery pro typ zájezdu, destinaci, zájezd, článek atd.), ale nepodstrkuje. Namísto URL /nazev-typu-zajezdu/anglie/supr-cupr-zajezd, kterou bych chtěl zachovat, mě Nette přesměruje na /zajezd?slug=supr-cupr-zajezd a tohle chování já nechci. Ideálně, ať rovnou ten presenter spustí.
Umožňuje router podstrkávání nebo musím vytvořit nějaký společný presenter kam to všechno budu sypat a až v něm to podstrkávání řešit (tohle řešení se mi nezdá moc čisté, po pravdě se mu chci maximálně vyhnout)?
Editoval Daewoo (29. 6. 2017 11:53)
- David Matějka
- Moderator | 6445
zkus obratit poradi tech rout:
/admin/...
/[slug]/[slug]/[slug]
/[slug]/[slug]
/[slug]
- Daewoo
- Člen | 36
Asi jsem to nenapsal dost dobře.
Zde je kód, který ty routy představuje (zkráceno pro přehlednost):
class RouterFactory
{
use Nette\StaticClass;
/**
* @return Nette\Application\IRouter
*/
public static function createRouter(\Myiyk\SeoRouter\Router $seoRouter)
{
$router = new RouteList;
$router[] = new Route('admin/<presenter>/<action>[/<id>]', ["module" => "Admin", "presenter" => "Homepage", "action" => "default"]);
$router[] = new Route('cron/<presenter>/<action>', ["module" => "Cron", "presenter" => "Homepage", "action" => "default"]);
$router[] = $seoRouter;
$router[] = new Route('<presenter>/<action>', ["module" => "Front", "presenter" => "Homepage", "action" => "default"]); // nutne kvuli n:href
return $router;
}
}
=== SeoRouterService.php
use Nette;
use Myiyk\SeoRouter\Action;
use Myiyk\SeoRouter\ISource;
class SeoRouterSource extends Nette\Object implements ISource
{
public function toAction(\Nette\Http\Url $Url)
{
$slug = substr($Url->getPath(), 1);
$action = $this->_getSystemPresenter($slug, $Url->getQueryParameters());
if ($action === null)
{
$action = $this->_getArticlePresenter($slug, $Url->getQueryParameters());
}
if ($action === null)
{
$action = $this->_getTripTypePresenter($slug, $Url->getQueryParameters());
}
if ($action === null)
{
$action = $this->_getDestinationPresenter($slug, $Url->getQueryParameters());
}
if ($action === null)
{
$action = $this->_getTripPresenter($slug, $Url->getQueryParameters());
}
$slugs = explode("/", $slug);
if ($action === null && count($slugs) > 1)
{
$action = $this->_getDestinationPresenter($slug[0], $Url->getQueryParameters(), $slug[1]);
}
if ($action === null && count($slugs) > 1)
{
$action = $this->_getTripPresenter($slug[0], $Url->getQueryParameters(), $slug[1], isset($slug[2]) ? $slug[2] : null);
}
return $action;
}
protected function _getArticlePresenter($slug, $params = [])
{
$page = $this->database->table("article")->where("slug = ?", $slug)->fetch();
if ($page)
{
$presenter = "Front:Page:default";
$params += ["id" => $page->id];
return new \Myiyk\SeoRouter\Action($presenter, $params);
}
return null;
}
...
}
Zde například dojde k přesměrování z URL: /slug-nejakeho-clanku na: /page?slug=slug-nejakeho-clanku.