【问题标题】:Joomla router.php - custom urlsJoomla router.php - 自定义网址
【发布时间】:2013-08-04 14:35:32
【问题描述】:

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

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

domain.com/country/id

示例:

domain.com/germany/12

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

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

对于视图=国家(第一级)

domain.com/country

即:

domain.com/germany

for view=city(第二级)

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

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

【问题讨论】:

  • 两个问题:这就是您将拥有的组件的所有 url 吗?您是否有指向任一视图的菜单项?
  • 嗨,David - 抱歉回复晚了,正在做一个不同的项目,你知道它是怎么回事......现在这不是我拥有的唯一 URL,也没有指向它的菜单。它在组件内。

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


【解决方案1】:

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

当您构建路由器时,您需要两个功能。首先将返回 SEF url CountriesBuildRoute,然后将 SEF url 转换回查询 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。然后花几个小时使解析路径尽可能精确和有效。如果你想制作一个好的路由器,你可以花几个小时甚至几天的时间。

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2011-09-23
    • 2011-08-23
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多