Router na sumboduly Modul:Admin|Front:Presenter

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

Jde nějak rozumně udělat univerzální routu, aby správně matchovala strukturu, v které mám moduly typu:

UserModule\AdminModule\UserPresenter.php
ForumModule\AdminModule\TopicPresenter.php

a chci mít adresy:
/admin/user/user
/admin/forum/topic

teď musím každou routu explicitně uvádět: tedy např.:

$forumList = new RouteList('Forum');
$forumList[] = $adminList = new NetteRouteListMock('Admin');
$adminList[] = new Route('/admin/forum/<presenter>/<action>[/<id>]', 'Topic:default');

Pak to funguje jak má, ale přece jen těch rout příbývá a a může to časem přinášet problémy, když těch modulů bude více a více.
Případně jde to nějak vyřešit vlastním routerem?

newPOPE
Člen | 648
+
0
-

Vlastnym routerom to das urcite :-)

Ci to pojde nejak za pomoci Route neviem nakolko potrebujes zamienat poradie :Foo:Admin:.. na /admin/foo.

Z hlavy by som to riesil miernou upravou Route tak aby to prehadzovala sama v pripade, ze tam uvidi /admin.

Jiří Nápravník
Člen | 710
+
0
-

Tak jsem to nakonec vykoumal celkem snadno to jde přes filtry, pokdu by nekdo řešil to samé:

public static function filterIn($module)
{
	return ucfirst($module) . ':Admin';
}

public static function filterOut($module)
{
	list($module) = explode(':', $module);
	return strtolower($module);
}
webdata
Člen | 153
+
0
-

To je to co hledam. Akorat me bude trosku trvat nez me docvakne kde se bere promena $module

Jiří Nápravník
Člen | 710
+
0
-

Proměnná $module se tam dostane automaticky, protože když uděláš něco takového:

$route = new Route('<module>/<presenter>/<action>/<id>', array(
    'module' => array(
        Route::FILTER_IN => 'filterInFunc',
        Route::FILTER_OUT => 'filterOutFunc',
    ),
    'presenter' => 'homepage',
    'action' => 'default',
    'id' => NULL,
));

tak na těch dvou filter funkcích máš to <module> jako parametr.

webdata
Člen | 153
+
0
-

Dík jak blázen – tohle je faktu super a je to přesně to co jsem potřeboval takže můžu mít uplně pěkně, alespoň pro mne (nevím jak ostatní) rozdělenou aplikaci už jen ten základ modulu a presenteru je good. Teď to mám takto:

app
	modules
		PageModule
			AdminModule
				presenters
					DefaultPresenter.php
					EditPresenter.php
					TrashPresenter.php
				templates
			models
			DI
			config
			presenters
			templates
			components
		UsersModule
			AdminModule
				presenters
				templates
			models
			DI
			config
			presenters
			templates
			compontents

Ještě jednou dik. Pro mne je tato struktura přehledná a můžu s minimální úpravou vzít „modul“ a použít ho jinde.

Jiří Nápravník
Člen | 710
+
0
-

Rozdělení mám hodně podobně. Prostě jen ty front presentery apod. dám do dalšího podmodulu

Mám jen

app
   PageModule
      AdminModule
           presenters
           templates
      FrontModule
           presenters
           templates
      components
      models
      DI

Já tohle hledal dlouho a překvapilo mě, že to nikdo neřešil a přitom je to takhle jednoduchý:-)

webdata
Člen | 153
+
0
-

Mozna to ma jeste chybicku:

domena.tld/admin/pages/

  • vola PagesModule/AdminModule/presenters/DefaultPresenter.php

domena.tld/admin/pages/edit/

  • vola PagesModule/AdminModule/presenters/EditPresenter.php

domena.tld/admin/pages/edit/save/

  • vola akci save v PagesModule/AdminModule/presenters/EditPresenter.php

Bohuzel tohle hodí ze neexistuje http požadavek
domena.tld/admin/pages/edit/25

  • vola PagesModule/AdminModule/presenters/EditPresenter.php

A musi se volat
domena.tld/admin/pages/edit/defautl/25

Jiří Nápravník
Člen | 710
+
0
-

No je to celkem pochopitelný, protože jsi jednu tu část <action> vyhodil. Já používám default pro přehled, takže tam neřeší nějak id apod. A edit mám jako metodu v presenteru

Napadá mě takový hack, jen z hlavy, co udělat filtr i pro action a pokud bude action číslo, tak vrátit default jako akci, pak by to mohlo fungovat. A ten druhý filtr pak tam budeš nejspíše potřebovat přístup i k další části url, k tomu <id> abys mohl vrátit jen to. Či-li tam buď parsovat router, anebo lépe použít tohle.

akadlec
Člen | 1326
+
0
-

Jiří Nápravník: Já tohle hledal dlouho a překvapilo mě, že to nikdo neřešil a přitom je to takhle jednoduchý:-)

ale řešil, a sám si do toho tématu přispíval ;)

Jiří Nápravník
Člen | 710
+
0
-

Do toho tématu jsem přispíval, až po tomhle mém, když ho webdata vykopl nahoru… A spise jsem se ptal, jestli to neni to same jako resim ja filtrama

duskohu
Člen | 778
+
0
-

Jiří Nápravník napsal(a):

Rozdělení mám hodně podobně. Prostě jen ty front presentery apod. dám do dalšího podmodulu

Mám jen

app
   PageModule
      AdminModule
           presenters
           templates
      FrontModule
           presenters
           templates
      components
      models
      DI

Já tohle hledal dlouho a překvapilo mě, že to nikdo neřešil a přitom je to takhle jednoduchý:-)

Ahoj, pouzivam tiez rovnaku strukturu Module/Submodule, Podarilo sa niekomu vyriesit to routovanie v tvare:

  • admin/page >> PageModule/AdminModule
  • page >> PageModule/FrontModule

za prdpokladu ze modulov ako PageModule bude viac? Ja som sa pokusil napisat router ktory by to riesil, ale bohuzial som pohorel. Neviem sa dopracovat k nejakemu cistemu rieseniu.

akadlec
Člen | 1326
+
0
-

No já to vyřešil tak že admin mám na subdoméně, ale tipuju že by to mělo fachčit i bez. A postup si tuším radil ty ;)

duskohu
Člen | 778
+
0
-

Ano radil som to ja, ale vobec sa mi to nepaci :-) Neskusali ste niekto rozchodit ten router? ja mam zatial urobenu jednu cast a to match, este musim nejako dokoncit constructUrl. A ked to bude hotove, tak nemam ani sajnu ako implementovat prekladove tabulky.

Editoval duskohu (22. 1. 2014 13:59)

akadlec
Člen | 1326
+
0
-

Nepaci se ti co? Ze se ty routy delaji pro jednotlive moduly? Ja zacal ty moduly predelavat na extensions tak bych se casem rad dopracoval k tomu ze si ty routy nadefinuju v jeho inicializaci

duskohu
Člen | 778
+
0
-

akadlec napsal(a):

Nepaci se ti co? Ze se ty routy delaji pro jednotlive moduly? Ja zacal ty moduly predelavat na extensions tak bych se casem rad dopracoval k tomu ze si ty routy nadefinuju v jeho inicializaci

Ako prerabas moduly na extension? :-o, Vsak v extension sa neda definovat presenter? Alebo da? To by som velmi rad vedel ako to robis?

duskohu
Člen | 778
+
0
-

Tak sa mi nejako podarilo dopisat ten modularRouter. Je to skor vezia –1.0 :-) sice to bude treba zrefaktorovat, ale funguje. Bol by som rad keby mal niekto zaujem a vedel by urobit nejak refactoring.

Co to vsetko vie?

Spracuvava to tuto strukturu:

app
   CmsModule
      AdminModule
           presenters
      FrontModule
           presenters
   ???Module
      AdminModule
           presenters
      FrontModule
           presenters

cize:

  • /admin/cms/… >> CmsModule/AdminModule/…
  • /cms/… >> CmsModule/FrontModule/…

Ma moznost nastavit default module pre admin a pre front, to znamena:

  • /admin >> nacita default admin module
  • / >> nacita default front module

Ma moznost pre kazdu akciu presentra nastavit parametre ktore sa budu zobrazovat za lomitkom:

  • /admin/homepage/edit/1

Nastavenie pouzivania lomitka na konci, alebo nie:

  • setUseSlash()

Co to vsetko treba doriesit?

  • refaktoring
  • translate
  • FILTER_IN, FILTER_OUT

Editoval duskohu (23. 1. 2014 12:44)

Jiří Nápravník
Člen | 710
+
0
-

Já mám taky moduly jako extensions, kde si nastavím routy jaké potřebuji pro daný modul (nad tím mám tedy nějaký AppModuleExtension, který má obecný router pro backend). Jinak já to dělám díky Flame\Modules http://blog.jsifalda.name/…e-nette-rout , ktrý umožňuje nastavit nejen routy pro moduly, ale i helpery,makra, doctrine entity, config file…