官方系列教材 - G计划

Joomla开发手册

joomla中的路由系统的可以创建SEF(搜索引擎友好)的URL。从 1.5 版开始,Joomla!能够创建和解析任何格式的URL,包括 SEF URL.这不依赖于 Web 服务器 URL 重写功能,只要PHP开始mod_rewrite模块,即使服务器类型不是Apache也是可以。SEF URL 遵循一定的固定模式,但用户可以为 URL 的每个段定义一个简短的描述性文本(别名)。

一般,SEF URL 的本地部分(域名之后的部分)称为路由(route)。创建和处理 SEF URL 称为路由(routing),相关代码称为路由器(router)。

在Joomla中,每一个组件负责处理自己的SEF URL,如果你是组件开发者,为了支持SEF URL,你就需要创建自己组件的router.

概念


假设您遵循标准开发实践,你的组件现在使用的是系统的URL模式,类似于

http://www.example.com/index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50

现在你的目标是将这个URL转换为下面的形式:

http://www.example.com/sport/nba-list/team

为了实现这个目标,作为开发人员,你现在需要做两件事:

1,告诉系统你当前需要转换的URL链接

2,告诉系统如何转换

如何告诉系统当前需要转换的URL.

在实际上是非常困难并且低效的让joomla系统自主计算哪些文本是URL。为此,开发者在生成URL的时候需要手动的调用  \Joomla\CMS\Router\Route::_()方法。示例如下:

echo \Joomla\CMS\Router\Route::_('index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50');

为了方便,开发者可以省略掉option和Itemid这两个参数。option参数默认为当前正在被执行组件的名称,Itemid参数默认为菜单项的ID.省略后如下:

echo \Joomla\CMS\Router\Route::_('index.php?view=article&id=1&catid=20');

  一般来说,您应该只将其应用于用户和/或搜索引擎能够看到的 URL中,对于系统使用的URL是不需要转换的,比如重定向的URL。

如果用户在后台的全局射中关闭了启用SEF URLS的选项,\Joomla\CMS\Router\Route::_() 将不会进行转换,直接输出原始的URL.

写一个路由器


 下一步,你需要做的就是写一个路由器。路由器的写法如下;

1,在组件的根目录下创建一个router.php的文件。如:/components/com_yourcomponent/router.php

2,编辑router.php文件,在里面定义一个类,类的名称为[组件的名称]Router。如(com_content组件则类名为 ContentRouter),并且这个类必须继承 Joomla\CMS\Component\Router\RouterInterface 。

3,在类中需要实现3个方法,分别是build(&$query),parse($segments),preprocess($query)。

 

 build(&$query) 的功能是 将 URL 参数数组转换为将生成 SEF URL 的segment段数组。转换的工作流程如下:

【原始的URL】 http://www.example.com/index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50
↓【调用】 \Joomla\CMS\Router\Route::_
【生成】$query = array('view' => 'article', 'id' => 1, 'catid' => 20)
↓ 【调用】你组件的路由器 [componentname]Router::build
【生成】$segments = array(20, 1);
↓ 【自动调用】joomla内部的路由系统
【生成】http://www.example.com/example-menu-item/20/1

 

 parse($segments) 的功能是 将 segment(段)数组参数数组转换URL参数 。转换的工作流程如下:

【原始的URL】http://www.example.com/example-menu-item/20/1
↓ 【自动调用】Joomla内部的路由系统解析
【生成】$segments = array(20, 1);
↓ 【调用】你组件的路由器 [componentname]Router::parse
【生成】$query = array('view' => 'article', 'id' => 1, 'catid' => 20)
  preprocess($query) 的功能是对URL进行预处理。无论是否开始SEF URL功能,这个方法都会被调用。

 

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前

第3章 处理URL请求参数

第5章 日志

第6章 错误和调试

第10章 缓存

第14章 路由系统