删除joomla v1.5路由器中的id变量

时间:2012-05-04 07:31:32

标签: joomla joomla1.5

我有自定义的Joomla(v1.5)组件,目前正在使用组件的路由器。问题是我无法从SEF网址中删除ID号。我明白了:

http://myaddress.com/componentalias/17-city-alias/130-item-alias

我想得到什么:

http://myaddress.com/componentalias/city-alias/item-alias

看看下面的router.php方法:

function ComponentnameBuildRoute(&$query) {

    $segments = array();

    if(isset($query['city_id'])){               
        $segments[] = $query['city_id'];                    
        unset($query['city_id']);
    }

    if(isset($query['item_id'])){
        $segments[] = $query['item_id'];          
        unset($query['item_id']);
    }


    if(isset($query['task'])){
        switch($query['task']){
            case 'pay':
                $segments[] = JText::_('payment');
                unset($query['task']);
                break;  
        }
    }

    unset($query['view']);

    return $segments;
}
/*
 * Function to convert a SEF URL back to a system URL
 */
function ComponentnameParseRoute($segments) {

    $var = array();

    if(isset($segments[0])){
        $cityData = explode(':',$segments[0]);
        if(isset($cityData[0])){
            $vars['city_id'] = $cityData[0];
        }
    }

    if(isset($segments[1])){
        $itemData = explode(':',$segments[1]);
        if(isset($itemData[0])){
            $vars['item_id'] = $itemData[0];
        }
    }

    if(isset($segments[2])){
        switch($segments[2]){
            case JText::_('payment'):
                $vars['task'] = 'pay';
                break;  
        }
    }


    return $vars;

}

有什么想法吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

开始使用router.php文件的最佳位置是reading this article(它有点过时但仍然很好),然后查看com_content的router.php文件(components/com_content/router.php)。您会注意到文章确实达到了您想要的最佳状态,可以查看工作代码并从中获得。

更长的答案:

  1. 如果存在直接指向该项目的菜单项,则只能删除内容元素路径中的项目ID变量,否则无法找到该项目。

    < / LI>
  2. Joomla中的SEF网址! 1.5等是由各个元素的别名

  3. 组成的

    例如。如果我有这个菜单结构:

    Recipes                (The menu)
    -- Seafood             (<-- Category blog where category alias is `seafood` )
      -- Grilled Snapper      (<-- Recipe Item where item alias is `grilled-snapper` )
    -- 'Other category'    (<-- Another Category blog )
    

    完整ID删除

    如果您正在为配方构建SEF URL,则可以通过获取网站菜单$menu = &JSite::getMenu();并比较查询{{1}来查找可能显示的菜单项来构建路径。在传入的id数组中的id值的当前菜单项中。

    如果匹配,则可以使用菜单路径和配方别名中的别名来构建段。 (并在$query方法中颠倒过程。)

    因此,从上面的示例中,您可以为Grilled Snapper配方构建一个SEF URL,其类似于:ParseRoute($segments)

    部分ID删除

    现在说你还有另一个配方(例如'Garlic Prawns'别名大蒜虾),它没有直接链接到菜单,但会显示在“海鲜”类别博客页面中。在这种情况下,您最终会得到recipes/seafood/grilled-snapper

    如果您没有匹配项(例如 Garlic Prawns ),如果您的组件具有类别博客等列表视图或我们的示例配方类别页面,您可以建立部分匹配...基本上在这种情况下,您查看当前菜单项并确定它是否是包含内容项的列表/类别视图。

    如果是,则类别/列表视图的路径形成初始段,但由于该文章没有菜单项,您仍然必须使用URL的最后一个元素中的项目ID。 / p>

    没有内容项目或列表/类别视图的菜单项

    当内容项直接链接(例如来自文章,模块或搜索结果)并且没有指向它或可能包含它的菜单项时,您仍然可以创建一个没有id的URL但是你将以直接组件访问URL的形式提供路径。

    例如。 recipes/seafood/2:garlic-prawns其中/component/recipes/recipe/ice-cream-sundae是组件的名称,recipes是视图,recipe是文章的别名。