官方系列教材 - 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)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级

第18章 其他系统迁移

第19章 流量翻倍计划

第20章 wordpress主题开发教程