1

我有自定义 Joomla(v1.5) 组件,目前正在使用组件的路由器。问题是我无法从 SEF url 中删除 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;

}

有任何想法吗?您的帮助将不胜感激。

4

1 回答 1

3

router.php从您的文件开始的最佳位置是阅读这篇文章(它有点过时但仍然不错),然后查看 com_content 的router.php文件 ( components/com_content/router.php)。您会注意到文章确实实现了您想要的,因此最好查看工作代码并从中获得。

更长的答案:

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

  2. Joomla 中的 SEF URL!1.5 等由各个元素的别名组成

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

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();并将id当前菜单项中的查询与传入的数组中id的值进行比较来查找它可能出现的菜单项来构建路由$query.

如果您有匹配项,您可以使用来自菜单路径的别名和配方别名来构建分段。(并在您的方法中反转该过程ParseRoute($segments))。

因此,从上面的示例中,您可以构建一个指向 Grilled Snapper 食谱的 SEF URL,如下所示recipes/seafood/grilled-snapper

部分 ID 移除

现在假设您还有另一个食谱(例如“Garlic Prawns”别名“ garlic-prawns ” ),它没有直接链接到菜单,但会出现在“海鲜”类别博客页面中。在这种情况下,你最终会得到 recipes/seafood/2:garlic-prawns

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

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

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

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

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

于 2012-05-05T06:03:32.957 回答