Problém se zanořenými moduly
- Filip Procházka
- Moderator | 4668
Zdravím,
následující routy mi negenerují URL jaké potřebuji a nedaří se mi
přijít nato proč
$router[] = new Route('//uc.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
'module' => 'Front:UserControl',
'presenter' => 'Dashboard',
'action' => 'preview',
'language' => array(
Route::VALUE => 'cs',
'fixity' => Route::CONSTANT,
)
));
$router[] = new Route('//forum.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
'module' => 'Front:Forum',
'presenter' => 'Topics',
'action' => 'default',
'language' => array(
Route::VALUE => 'cs',
'fixity' => Route::CONSTANT,
)
));
$router[] = new Route('//admin.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
'module' => 'Admin',
'presenter' => 'Dashboard',
'action' => 'preview',
'language' => array(
Route::VALUE => 'cs',
'fixity' => Route::CONSTANT,
)
));
$router[] = new Route('[!<language [a-z]{2,4}>/]<presenter>/<action>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
'language' => array(
Route::VALUE => 'cs',
'fixity' => Route::CONSTANT,
)
));
$router[] = new Route('<? index\.(php|html?) ?>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
), Route::ONE_WAY);
struktura:
app
- AdminModule
- FrontModule
- - ForumModule
- - - presenters
- - - templates
- - UserControlModule
- - - presenters
- - - templates
- - presenters
- - templates
jsem na www.
mám vygenerované odkazy v pořádku:
:Front:About:contacts
→ /cs/about/contacts
:Front:UserControl:Setup:
→ uc.web.loc/cs/setup/
:Front:Forum:Topics:
→ forum.web.loc/cs/
//:Front:About:contacts
→
www.web.loc/cs/about/contacts
//:Front:UserControl:Setup:
→
uc.web.loc/cs/setup/
//:Front:Forum:Topics:
→ forum.web.loc/cs/
kliknu na odkaz na subdoménu uc.
a mám odkazy:
:Front:About:contacts
→ /cs/about/contacts
(tady se
potřebuju vrátit na :Front)
:Front:UserControl:Setup:
→ /cs/setup/
:Front:Forum:Topics:
→ forum.web.loc/cs/
//:Front:About:contacts
→
uc.web.loc/cs/about/contacts
(tady se potřebuju vrátit na
:Front)
//:Front:UserControl:Setup:
→
uc.web.loc/cs/setup/
//:Front:Forum:Topics:
→ forum.web.loc/cs/
když jdu hlouběji tak ok, ale jak chci nahoru tak mi to nevygeneruje správné url :(
už mám z toho v hlavě kukačky :) neví někdo? O:)
Editoval HosipLan (19. 9. 2010 18:47)
- Vyki
- Člen | 388
Osobně jsem nikdy v routách nepoužil to klíčové slovo module. Vždycky to definuji v klíčí presenter asi nějak takto:
<?php
//match: http://test.l/<module.submodule.subsubmodule.presenter>/<action>
$router[] = new Route('<presenter>/<action>', array(
'presenter' => 'First:Second:Default',
'action' => 'defaction',
));
//First = FirstModule
//Second = FirstModule\SecondModule
//Default = FirstModule\SecondModule\DefaultPresenter
//defaction = FirstModule\SecondModule\DefaultPresenter::defaction()
?>
A funguje mi to i pro zanořené moduly. Nemohl by být zádrhel někde v tom? Hází ti to nějakou chybovou hlášku?
Editoval Vyki (19. 9. 2010 19:03)
- Filip Procházka
- Moderator | 4668
Pokud odmažu všechny module
a napíšu je do
presenter
tak to udělá naprostej hokej v odkazech
- Vyki
- Člen | 388
Když ta routa je takto
<?php
$router[] = new Route('//uc.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
//'module' => 'Front:UserControl', Front:UserControl přesunuto do klíče presenter před Dashboard
'presenter' => 'Front:UserControl:Dashboard',
'action' => 'preview',
'language' => array(
Route::VALUE => 'cs',
'fixity' => Route::CONSTANT,
)
));
?>
Tak by to mělo fungovat stejně jako ta původní routa. A co ti to píše za chyby?
Editoval Vyki (19. 9. 2010 19:51)
- Filip Procházka
- Moderator | 4668
chyby to samozřejmě nepíše žádné, jenom mi to generuje nesmyslné routy
jde o to že když jsem v submodulu tak se mi nedaří vygenerovat odkaz na
jeho rodičovský modul
z :Front:UserControl:Setup:default
nevygeneruju odkaz
na :Front:Homepage:default
a vadí mi že do url cpe do klíče presenter
i cestu
k modulu, kdyby to šlo zakázat tak bych se nejspíš o kousek pohl, ale
nikde jsem žádnou takovou direktivu nenašel
- Vyki
- Člen | 388
Když používáš moduly a submoduly a máš v definici routy v klíči
module dán nějaký modul jako výchozí, ale v samotné definici masky routy
nikde nemáš <module>
, tak se patrně použije pro parametr
module ta vždy ta výchozí hodnota.
EDIT: Sice se ti tam cpe celá cesta ale to můžeš eliminovat:
<?php
Route::addStyle('#pres');
Route::setStyleProperty("#pres", Route::FILTER_IN, callback('aliasToPresenter'));
Route::setStyleProperty("#pres", Route::FILTER_OUT,callback('presenterToAlias'));
$router[] = new Route('<presenter #pres>[/<action>[/<id>]]', array(
'action' => 'default',
'id' => NULL,
));
function aliasToPresenter($alias)
{
$aliases = array(
'obchody-a-sluzby' => 'Shops:Category',
'akce' => 'News:Default',
'auth' => 'Admin:Auth',
'pracovni-prilezitosti' => 'Page:Works',
);
if(isset($aliases[$alias]))
return $aliases[$alias];
else
return NULL;
}
function presenterToAlias($presenter)
{
$aliases = array(
'Shops:Category' => 'obchody-a-sluzby',
'News:Default' => 'akce',
'Admin:Auth' => 'auth',
'Page:Works' => 'pracovni-prilezitosti',
);
if(isset($aliases[$presenter]))
return $aliases[$presenter];
else
return NULL;
}
?>
Editoval Vyki (19. 9. 2010 19:56)
- Filip Procházka
- Moderator | 4668
ale příjde mi nelogické, že
mám routu, která má platit pouze pro moduly
:Front:UserControl:*
a routu pro :Front:Forum:*
a až pod tím je univerzálnější routa :Front:*
jsem ve :Front:
a odkazy generuje správně
přejdu do modulu :Front:UserControl:
a všechno jako by se
generovalo zničeho nic „relativně“ ikdyž vyžaduju absolutní url
„//“ aby mi to přepínalo subdoménu
- Filip Procházka
- Moderator | 4668
tuhle techniku s překladovým slovníkem znám, ale to nechci použít.
problém jsem teď na haluz vyřešil tím, že jsem obecnou routu přepsal na:
$router[] = new Route('//www.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
'language' => array(
Route::VALUE => 'cs',
'fixity' => Route::CONSTANT,
)
));
díky za pomoc :)