Routování bez přesměrování, vyžaduji podstrčení

Daewoo
Člen | 33
+
0
-

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

zkus obratit poradi tech rout:

/admin/...
/[slug]/[slug]/[slug]
/[slug]/[slug]
/[slug]
Daewoo
Člen | 33
+
0
-

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.