Joomla router.php - 自定义网址

时间:2013-08-04 14:35:33

标签: php joomla routing joomla2.5 joomla3.0

我一直在安静地花些时间弄清楚它是如何工作的 - 所以我想在这里问一下这个问题。

我知道如何在router.php的帮助下在Joomla中自定义URL - 至少我是这么认为的。创建像这样的东西很简单

domain.com/country/id

示例:

domain.com/germany/12

然而,你不会知道id代表一个城市。所以在这个例子中我们假设id为12的城市是柏林。

因此,对于我的自定义组件(名为:countries),我希望显示以下内容:

for view = countries(1st level)

domain.com/country

即:

domain.com/germany

for view = city(2nd level)

domain.com/country/city-id

即:

domain.com/country/berlin-12

(或者只是:domain.com/country/berlin - 但我认为ID是自定义组件工作所必需的 - 以及页面上任何读取ID以知道该做什么的相关模块)

到目前为止我有什么:

function CountriesBuildRoute(&$query)
{
    $segments = array();
    //if(isset($query['view'])) {
    //    $segments[] = $query['view'];
    //    unset( $query['view'] );
    //}
    if (isset($query['task'])) {
        $segments[] = implode('/',explode('.',$query['task']));
        unset($query['task']);
    }
    if (isset($query['id'])) {
        $segments[] = $query['id'];
        unset($query['id']);
    }
        if (isset($query['name'])) {
        $segments[] = $query['name'];
        unset($query['name']);
    }

    unset( $query['view'] );    

    return $segments;
}


function CountriesParseRoute( $segments )
{
       $vars = array();
       $app =& JFactory::getApplication();
       $menu =& $app->getMenu();
       $item =& $menu->getActive();
       // Count segments
       $count = count( $segments );
       //Handle View and Identifier
       switch( $item->query['view'] )
       {
               case 'countries':
                       if($count == 1) {
                               $vars['view'] = 'city';
                       }

                       break;
               case 'city':
                       $id   = explode( ':', $segments[$count-2] );
                       $name   = explode( ':', $segments[$count-1] );
                       $vars['id']   = $id[0].'-'.$name;
                       break;
       }
       return $vars;
}

我从查看国家/地区调用城市网页的方式如下:

<a href="<?php echo JRoute::_('index.php?option=com_countries&view=city&id=' . (int)$item->id) .'&name='. $item->city_name; ?>">

如果有人可以提供帮助,那会很棒!干杯

1 个答案:

答案 0 :(得分:0)

如果你想从网址获取ID,你必须添加每个国家/地区菜单项或创建将在数据库中搜索项目ID的rooter(大型网站的坏主意)。这还需要将您的主页设置为您的某个组件视图。最简单的方法。

构建路由器时,需要两个功能。首先返回SEF网址CountriesBuildRoute,第二个将SEF网址翻译回查询CountriesParseRoute。你实际上认为在这个级别编写SEF比较困难。我不会给你写整个路由器但只指向正确的方向。

在Joomla 1.5中,你想要的更容易。如果你有时间从一些Joomla 1.5组件(com_weblinks)查看rooter。 CountriesBuildRoute返回将构建您的网址的数组。例如,当您返回$query数组时,如下所示:array('country','berlin')网址将如您所愿:domain.com/country/berlin。但是逆转这个过程(你会在CountriesParseRoute中做的事情)会变得更难。你必须检查第一段是否是一个国家(如果第二段应该是城市)。

因此,在函数CountriesBuildRoute中,检查传递的视图,并直接构建$segments数组,就像您想要的网址或选定视图一样。请记住,该数组中的单个元素将是URL中的单个元素。

在函数CountriesParseRoute中检查第一个数组元素是否为国家(数据库检查,缓存国家/地区列表,有很多方法可以执行此操作),那么您必须对数组中的第二个元素执行相同的操作(如果是存在)。

我总是先按照自己的意愿创建BuildRoute。然后花费数小时来制作解析路线,尽可能精确有效。如果你想做好路由器,你可以花上几个小时甚至几天。