Pořadí modulů v routě a URL

ajda2
Člen | 66
+
+1
-

Čaute,
vytvořil jsem si namespace / adresářovou strukturu aplikace, která je ve tvaru:

/Modules/<Název modulu>/
	FrontModule
	AdminModule

Bohužel se mi však nedaří najít tvar pro obecnou routu, která by generovala tvar URL

/admin/<Název Modulu>/<Presenter>/<action>

Tedy v opačném pořadí.

Nette mi routy generuje s tečkou, např.

gallery.admin/gallery

Není někde ukázka, jak toho docílit?
V Dokumentaci se běžně tento tvar Module/Front/Presenter uvádí a nemyslím si, že pak tvoří každou routu ručně..
Děkuji za pomoc, jsem už bezradný.

David Grudl
Nette Core | 8218
+
0
-

Kde se v dokumentaci uvádí?

ajda2
Člen | 66
+
0
-

Například tady je uveden tvar Module/Admin, respektive Forum/Admin
https://doc.nette.org/…tion/routing#…

Tady už je to zase opačně
https://doc.nette.org/…eating-links#…

Nedokážete mi někdo poradit, jak vytvořit masku routy, které by vytvářelo routy:

/admin/module/presenter/action

Samozřejmě můžu napsat routy pro každý Modul a Presenter ručně, ale určitě to půjde zapsat nějak obecně.
Jen na to nemůžu přijít…
Když vytvořím routu

$routeList->addRoute("admin/<module>/<presenter>[/<action>][/<id>]", "Core:Admin:Homepage:default");

Tak získám routy např. ve tvaru

/admin/news.admin/news

Nevíte, jak to upravit, aby generovalo /admin/news/presenter?

Dává mi totiž smysl mít celý Module uzavřený v jednom namespace, včetně Presenterů, komponent apod., než mít FrontModule a v něm část Modulu a pak zase AdminModule.

David Grudl napsal(a):

Kde se v dokumentaci uvádí?

ajda2
Člen | 66
+
0
-

Jen pro pořádek uvedu, že jsem schopen požadovaný tvar zapsat ručně touto formou:

$adminRouter = $routeList->withModule("Page")
			->withModule("Admin");
		$adminRouter->addRoute("admin/page[/<action>][/<id>]", "Page:default");
		$adminRouter->addRoute("admin/page/<presenter>[/<action>][/<id>]", "Page:default");

Toto mi správně vygeneruje url

/admin/page

a

/admin/page/<presenter>

Jen to nejsem schopný převést do obecné formy, abych to nemusel pro každý Modul psát ručně.

David Grudl
Nette Core | 8218
+
+2
-

Píšu z hlavy, ale asi bych na to šel nějak přes globální filtry, tj

$routeList->addRoute("admin/<mod>/<presenter>[/<action>][/<id>]", [
	null => [
		Route::FILTER_IN => function (array $params): $params {
			$params['presenter'] = ucfirst($params['mod']) . ':Admin:' . $params['presenter'];
			unset($params['mod']);
			return $params;
		},
		Route::FILTER_OUT => function (array $params): $params {
			// opacna transformace, kdy z Mod:Admin:Presenter v $params['presenter'] udelam Presenter a vyrobim $params['mod'];
			return $params;
		},
	]
]);

module má speciální význam, tak raději parametr nazývám mod

ajda2
Člen | 66
+
0
-

Díky,
skrze globální filtr mě to nenapadlo řešit ;)

David Grudl napsal(a):

Píšu z hlavy, ale asi bych na to šel nějak přes globální filtry, tj

$routeList->addRoute("admin/<mod>/<presenter>[/<action>][/<id>]", [
	null => [
		Route::FILTER_IN => function (array $params): $params {
			$params['presenter'] = ucfirst($params['mod']) . ':Admin:' . $params['presenter'];
			unset($params['mod']);
			return $params;
		},
		Route::FILTER_OUT => function (array $params): $params {
			// opacna transformace, kdy z Mod:Admin:Presenter v $params['presenter'] udelam Presenter a vyrobim $params['mod'];
			return $params;
		},
	]
]);

module má speciální význam, tak raději parametr nazývám mod