2

我一直在安静地研究它是如何工作的——所以想在这里问这个问题。

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

domain.com/country/id

例子:

domain.com/germany/12

但是,您不会知道 id 代表城市。所以在这个例子中,假设 id 为 12 的城市是柏林。

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

视图=国家(第一级)

domain.com/country

IE:

domain.com/germany

对于视图=城市(第 2 级)

domain.com/country/city-id

IE:

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; ?>">

如果有人可以提供帮助,那就太棒了!干杯

4

1 回答 1

0

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

构建路由器时,您需要两个功能。第一个将返回 SEF url CountriesBuildRoute,第二个将 SEF url 转换回 query CountriesParseRoute。在这个级别上编写 SEF 比您实际认为的要难。我不会给你写整个路由器,只会给你指出正确的方向。

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

因此,在函数中CountriesBuildRoute检查传递了什么视图并$segments直接构建数组,就像您希望您的 url 或所选视图一样。请记住,该数组中的单个元素将是 URL 中的单个段。

在函数CountriesParseRoute中检查第一个数组元素是否是一个国家(数据库检查,缓存的国家列表,有很多方法可以做到这一点)然后你必须对数组中的第二个元素做同样的事情(如果它存在的话)。

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

于 2013-08-10T23:30:38.153 回答