Routy – parametr, který v url musí být vždy

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

Píšu vícejazyčný web, kde mám některé stránky natažené z databáze (Homepage:default – jedna šablona) a jiné s vlastní logikou (a šablonou) (Homepage:home, Homepage:news). Některé ze stránek natažených z databáze mají levé menu, v databázi mají název ve tvaru stránka_podstránka, ale chtěl bych aby v url byly ve tvaru /jazyk/stránka/podstránka místo /jazyk/stránka_podstránka.

Zatím mám routy asi takhle:

$router[] = new Route('[index.php]?view=<page>', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('<lang=en>/news/', 'Homepage:news');
$router[] = new Route('<lang=en>/home/', 'Homepage:home');
$router[] = new Route('<lang=en>/<page>/[<page_under=>/]', 'Homepage:default');
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

omlouvám se za čanglické názvy :)

Bohužel když jdu na stránku /en/stránka, tak mě to přesměruje na /stránka a když na /en/stránka/podstránka, tak mě to také přesměruje na /stránka/podstránka, ale presenter si pak myslí že stránka je jazyk a podstránka stránka :( A news a home se mi přesměruje na /, takže zase špatně, chtěl bych /en/home a /en/news. Jak mám parametr lang nastavit, aby se v url používal pořád. PS: lang mám jako persistentní proměnou.

nanuqcz
Člen | 822
+
0
-

Než odpoví někdo zkušenější, můžeš místo <lang=en>/ zkusit jen <lang>/, nebo [!<lang=en>/]

(hlavně ten druhý způsob mě zajímá jestli bude fungovat, podle dokumentace by měl)

Editoval xxxObiWan (27. 8. 2011 20:32)

dan542
Člen | 5
+
0
-

Zajímavé je že když použiji '[!<lang=en>/][<page>/][<page_under=>/]', tak fungují stránky, bohužel podstránky ne – vynechávají /en/ (na [!<lang=en>/] nezáleží). Pro routy na news a home jak [!<lang=en>/], tak <lang> přesměrovávají na /en/, vždy se zobrazí news (jsou před home). Po nahrazení [news/], [home/] za news/, home/ nefunguje vůbec, ale podstránky ano…

Editoval dan542 (27. 8. 2011 21:00)

dan542
Člen | 5
+
0
-

Vyřešeno, tohle

$router[] = new Route('[index.php]?view=<page>', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('[!<lang=en>/]news/', 'Homepage:news');
$router[] = new Route('[!<lang=en>/]home/', 'Homepage:home');
$router[] = new Route('[!<lang=en>/]<page>/[<page_under=>/]', 'Homepage:default');
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

mi funguje.

nanuqcz
Člen | 822
+
0
-

Jj, přesně takhle jsem to myslel :-)

dan542
Člen | 5
+
0
-

Měl bych ještě jeden dotaz, ale nechce se mi zakládat nové téma. Nebylo by z hlediska struktury aplikace lepší mít 3 presentery: DatabasePagePresenter (ten by načítal stránky z db), NewsPresenter a HomePresenter? Teď totiž řeším, že když jsem na stránce news, a chci si určitou novinku rozkliknout, tak mi jako nejčistčí řešení připadá přidat novou šablonu. Bez přidání šablony mě napadá, že bych šabloně předal parametr, a v šabloně bude if, které rozhodne jak to má vykreslit. To druhé řešení se mi však vůbec nelíbí.

Editoval dan542 (28. 8. 2011 17:34)

nanuqcz
Člen | 822
+
0
-

Máš pravdu, to první řešení (se třemi presentery) je čistší ;-) Vlastně takhle se to normálně řeší, určitě bych to předělal.

dan542
Člen | 5
+
0
-

Tak dík, předělám to. Původně jsem si totiž myslel, že budu mít jen dva presentery: HomepagePresenter a AdminPresenter, ale na to jsou moduly…

Editoval dan542 (28. 8. 2011 17:37)