代码之家  ›  专栏  ›  技术社区  ›  Jimmy

Joomla:jroute&在菜单层次结构中导航备份

  •  0
  • Jimmy  · 技术社区  · 16 年前

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

    然而,当使用页面内的链接浏览层次结构时,url会被弄乱。请继续阅读以了解更多详细信息:)

    但是,我也希望通过页面本身上的链接进行导航(例如,通过链接到发布者页面上的所有发布者的新闻稿,或者通过从新闻稿页面链接回发布者页面)。这在从出版商到时事通讯的过程中效果很好。组件调用

    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
    

    如果我从上面的URL再次向前导航到新闻稿,则该URL将变为

    /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 回复  |  直到 16 年前
        1
  •  0
  •   silvo    16 年前

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