codecamp

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功能,这个方法都会被调用。<br><br>

 


Joomla Web services API规范
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

处理URL请求参数

Joomla 错误和调试

Joomla 缓存

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }