Joomla:jroute & 在菜单层次结构中向上导航

Posted

技术标签:

【中文标题】Joomla:jroute & 在菜单层次结构中向上导航【英文标题】:Joomla: jroute & navigating back up in menu hierarchy 【发布时间】:2011-04-02 08:00:55 【问题描述】:

我在 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 );

并且(正确地)生成如下 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,因为发布者的菜单项位于时事通讯菜单下...显然必须有一种方法可以做到这一点,因为菜单项和面包屑模块​​都想出来了...

谢谢

【问题讨论】:

您应该包括(部分)您的路由器代码。这是此错误的最可能来源。 【参考方案1】:

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

【讨论】:

谢谢——这只是在这里编写代码时的一个错字(我现在已经修复了)。实际代码正确地取消了 publisherid

以上是关于Joomla:jroute & 在菜单层次结构中向上导航的主要内容,如果未能解决你的问题,请参考以下文章

在 Joomla 中以编程方式创建菜单层次结构

joomla 菜单管理器自定义组件

Joomla:主页网址

Joomla 外部链接 -

Joomla 3.0 缺少菜单参数

Joomla 3 无法点击子菜单