Joomla:jroute&在菜单层次结构中导航回来

时间:2010-08-22 17:33:39

标签: seo menu joomla components hierarchy

我在Joomla 1.5网站上有一个简单的菜单层次:

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

使用菜单项或面包屑导航此层次结构时,SEF URL是预期的;

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

但是,当使用页面内的链接导航层次结构时,网址会变得混乱。请继续阅读以获取更多详情:)

页面由组件生成。我已经实现了一个JRouter来生成SEF URL。打开SEF后,我可以使用菜单项和标准面包屑正确导航层次结构。

但是,我还希望通过页面本身的链接进行导航(例如,通过链接到发布者页面上的所有发布者简报,或者通过简报页面链接回发布者的页面)。从发布者到简报时,这种方法很好。组件调用

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

和(正确)生成如下的网址:

/newsletters/pubA/letterA1.html

但是,当用户在简报页面上并希望返回发布者页面时,出现问题。出于某种原因,发布者的别名会在URL中的简报别名之后添加,就好像它位于层次结构中的简报之下。组件调用

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

但是(错误地)生成了如下网址:

/newsletters/pubA/letterA1/pubA.html

如果我再次从上面的网址转到简报,那么网址就会变为

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

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

此外,请注意导航 工作(意思是,正确的页面已打开) - 它只是看起来很奇怪的网址。

我看不出如何生成预期的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,因为发布者的菜单项位于简报菜单下...显然必须有一种方法可以实现这一点,因为菜单项和面包屑模块​​都能找到它...

由于

1 个答案:

答案 0 :(得分:0)

ComponentBuildRoute存在问题。在您处理publisherid的else if块中,您取消设置newsletterid。我不确定这是否是问题,但修复它将是解决此问题的第一步。