routovani pro vice modulu a zobrazeni adresy bez tecky

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

Ahoj,
vytvarim prvni vetsi projekt v nette, jedna se o aplikaci, ktera zobrazuje data pro uzivatele a ma zaroven backend, kam se pristupuje pres prihlaseni a data pro uzivatele se tam „vari“.
Zacal jsem aplikaci vyvijet jako dva samostatne projekty vyuzivajici stejnou databazi, nedavno jsem se ale rozhodl obe casti spojit a z backendu a frontendu udelat moduly.

Vytvoril jsem si dva adresare v app, AdminModule a FrontModule, do nich jsem nakopiroval presentery a templaty obou casti aplikace.

Potreboval bych poradit s nastavenim rout, ktere se mi chovaji ponekud podivne a ja nejsem s to prijit na to, kde je chyba.

Routy

$router[] = new Route('produkty/<category>[/page-<page>]', 'Front:CategoryView:default');
$router[] = new Route('produkty/<category>/<subcategory>[/page-<page>]', 'Front:SubCategoryView:default');
$router[] = new Route('informace/<action>', 'Front:StaticView:Informace');

se staraji o zobrazeni katalogu produktu + statickych stranek (StaticView + jeho sablony). Dosud vse v poradku.

Problem je v tom, ze po nastaveni modulu mi routa

$router[] = new Route('<presenter>/<action>[/<id>]', 'Front:Homepage:Default');

vytvari adresu ve tvaru /front.cart, kdezto ja ji chci mit zobrazenou pouze jako /cart.

Vsechny routy:

$router = new RouteList;
$router[] = new Route('', 'Front:Homepage:Default', Route::ONE_WAY);
$router[] = new Route('produkty/<category>[/page-<page>]', 'Front:CategoryView:default');
$router[] = new Route('produkty/<category>/<subcategory>[/page-<page>]', 'Front:SubCategoryView:default');
$router[] = new Route('informace/<action>', 'Front:StaticView:Informace');
$router[] = new Route('<presenter>/<action>[/<id>]', 'Front:Homepage:Default');

Druhy problem nastava s naroutovanim backendu, ktey chci mazacky skryt do slozky /admin.
Backend funguje na klasicke strukture <presenter>/<action>[/id]. Ovlada ho routa

$router[] = new Route('admin/<presenter>/<action>[/<id>]', 'Admin:Overview:default');

ktera funguje (do adminu se dostanu, naloguju a podobne – v teto casti mi ani nevadi zapis adresy ve tvaru /admin/admin.customers/list), ale zaroven mi rozhodi chovani frotendu.

Po prichodu na web (v adresnim radku nic, nez adresa aplikace) se mi vygeneruje adresa /admin/front.homepage/ (ale zobrazi v poradku homepage z frontendu) – tady pochopitelne nechci generovat zadnou viditelnou subadresu, odkazy na Category, SubCategory a Static view funguji spravne (adresy bez admin.neco nebo front.neco), ale odkaz na jakykoliv jiny presenter, napriklad

<a n:href = "Cart:default">kosik</a>

mi sice zobrazi spravny presenter/action, ale vygeneruje mi k ni adresu /admin/front.cart/

Routy po pridani routy pro obsluhu backendu

$router = new RouteList;
$router[] = new Route('', 'Front:Homepage:Default', Route::ONE_WAY);
$router[] = new Route('produkty/<category>[/page-<page>]', 'Front:CategoryView:default');
$router[] = new Route('produkty/<category>/<subcategory>[/page-<page>]', 'Front:SubCategoryView:default');
$router[] = new Route('informace/<action>', 'Front:StaticView:Informace');
$router[] = new Route('admin/<presenter>/<action>[/<id>]', 'Admin:Overview:default');
$router[] = new Route('<presenter>/<action>[/<id>]', 'Front:Homepage:Default');

Nemuzete me prosim nakopnout?
Dekuju

Tomáš Kolinger
Člen | 136
+
0
-

Já to řešil tak, že jsem si moduly definoval zvlášť, jako „listy“:

$router[] = $backendRouter = new RouteList("Backend");
$backendRouter[] = new Route("admin/index.php", "Index:", Route::ONE_WAY);
$backendRouter[] = new Route("admin[/<presenter>][/<action>][/<id>]", "Index:");

$router[] = $frontRouter = new RouteList("Front");
$frontRouter[] = new Route("index.php", "Index:", Route::ONE_WAY);
$frontRouter[] = new Route("<presenter>[/<action>][/<id>]", "Index:");

Tím by mělo odpadnout generování adres typu modul.presenter… Při linkování v šabloně/presenteru se ti při neuvedení automaticky přiřadí modul, ve kterém je daný presenter. Když chceš linkovat do jiného modulu, tak ho prostě zapíšeš „:Modul:Presenter:action“…

Samozřejmostí je umístění presenterů do správných složek a hlavně namespaces: FrontModule a BackendModule (to ale nejspíš máš).

Editoval Tomáš Kolinger (9. 3. 2012 12:13)

elden46
Člen | 37
+
0
-

Děkuju, to je přesně to, co jsem hledal! Úplně mi uniko, že se dá routelist zkonstruovat s parametrem pro modul.