2010-08-22 65 views
0

我有一个Joomla 1.5网站一个简单的菜单层次结构:的Joomla:JROUTE和导航菜单层次结构备份

[Newsletters] -> [publisher A] -> [Newsletter A1] 
           -> [Newsletter A2] 
       -> [publisher B] -> [Newsletter B1] 
           -> [Newsletter B2] 

当使用菜单项或面包屑,海基会的URL是否如预期驾驭这一层次;

/newsletters/pubA.html 
/newsletters/pubA/letterA1.html 
/newsletters/pubA/letterA2.html 
/newsletters/pubB.html 
/newsletters/pubB/letterAB.html 
/newsletters/pubB/letterAB.html 

但是,当使用页面内的链接浏览层次结构时,url的get会搞砸。请阅读以获得更多详细信息:)

页面由组件生成。我已经实现了一个JRouter来生成SEF URL。开启SEF后,我可以使用菜单项和标准面包屑正确导航层次结构。但是,我也希望通过页面上的链接(例如,链接到发布者页面上的所有发布者新闻组,或通过链接回到发布者的新闻稿页面)来进行导航。从发布者到新闻稿时,这可以正常工作。该组件调用

JRoute::_('index.php?option=' . $option . '&view=newsletter&newsletterid=' . $newsletterId); 

和(正确)生成一个URL,如:

/newsletters/pubA/letterA1.html 

然而,当一个用户是通讯页面上,想回去了出版商的页面,出问题。出于某种原因,发布者的别名在URL中的新闻通讯的别名之后被添加,就好像它位于层次结构中的通讯之下。该组件调用

JRoute::_('index.php?option=' . $option . '&view=publisher&publisherid=' . $publisherId); 

但(错误地)产生像URL:

/newsletters/pubA/letterA1/pubA.html 

如果我从上面的URL再次向前导航到一个通讯,则该URL变得

/newsletters/pubA/letterA1/letterA1.html 
/newsletters/pubA/letterA1/pubA.html 
/newsletters/pubA/letterA1/letterA1.html 
/newsletters/pubA/letterA1/pubA.html 

(即,它不会比一个或两个段“错误”更深)。

另外,请注意,导航确实工作(意思是,打开了正确的页面) - 这只是看起来很奇怪的URL。

我看不出如何生成预期的URL,如顶部所示;似乎没有办法指定'相对于'第一'段应该是什么'。我应该以某种方式攻入JSite :: getRouter()吗?

路由器代码非常简单。这是我第一次写路由器,所以我可能会搞砸了一些东西。我确实发现ParseRoute只能用一个段调用。

function ComponentBuildRoute(&$query) 
{ 
    $segments = array(); 
    if (isset($query['view'])) 
    { 
    if (isset($query['newsletterid'])) 
    { 
     $alias = { figure out newsletter alias from newsletter id } 
     $segments[] = $alias; 
     unset($query['newsletterid']); 
    }  
    else if (isset($query['publisherid'])) 
    { 
     $alias = { figure out publisher alias from publisher id } 
     $segments[] = $alias; 
     unset($query['publisherid']);   
    } 

    unset($query['view']); 
    } 

    return $segments; 
} 

function ComponentParseRoute($segments) 
{ 
    $vars = array(); 

    $id = { try to retrieve newsletter id matching alias in $segments[0] } 
    if (!empty($id)) 
    { 
    $vars['view'] = 'newsletter'; 
    $vars['newsletterid'] = $id;  
    return $vars; 
    } 
    $id = { try to retrieve publisher id matching alias in $segments[0] } 
    if (!empty($id)) 
    { 
    $vars['view'] = 'publisher'; 
    $vars['publisherid'] = $id;  
    return $vars; 
    } 

    return $vars; 
} 

我不想因为出版商的菜单项坐镇通讯菜单下使用绝对URL ......显然必须有这样的菜单项和面包屑模块​​两者的方式想通出...

谢谢

+0

你应该包括(一些)你的路由器代码。这是这个错误的最可能的来源。 – MvanGeest 2010-08-22 17:38:01

+0

完成 - 添加路由器代码。 – Jimmy 2010-08-22 18:36:46

回答

0

您的ComponentBuildRoute存在问题。在其他处理publisherid的块中,您未设置newsletterid。我不确定这是否是问题,但解决此问题将是解决此问题的第一步。

+0

谢谢 - 当我在这里编写代码时(这是我现在修复的),这只是一个错字。实际的代码正确地取消了publisherid – Jimmy 2010-08-22 19:19:44