教程栏目

joomla中文网出品的官方教程

看一下我们自己写的组件产生的URL. http://localhost/j25/component/download/?view=itemdetail&id=1 。看一下joomla开启SEF核心文章组件产生的URL:http://localhost/j25/2014-02-17-10-21-18/69-quick-icons.很容易就能看到区别了。在本节中,我们要解决的问题就是统一这两种URL.然我们的组件产生的URL也和系统核心文章组件产生的URL一样。

当我初次看到这个 http://localhost/j25/component/download/?view=itemdetail&id=1 的时候,我很惊奇,为什么前面一部分(http://localhost/j25/component/download/)是符合核心组件的URL,而后面一部分(?view=itemdetail&id=1) 却不符合.稍稍思考后,我们可以发现,其实前面一部分应该是菜单组件负责产生的URL.而后面一部分是我们自己的组件COM_DOWNLOAD产生的 URL. 后面一部分的意思是说,现在系统请求的itemdateai页面,并且传递过来的参数是id=1. 这里也隐含的说明了一个原则,每一个组件负责产生自己的URL.当然系统负责将option=XXX部分给自动去掉。

有了上面的初步分析,我们看一下相关的理论:

  •  Joomla认为每一组件应该负责处理自己的SEF URL。
  •  组件通过JRoute::_()方法告诉joomla,这是一个URL,有可能需要被处理。
  •  Joomla保证它会去寻找每一个组件的 /components/com_yourcomponent/router.php文件,并且调用该文件里面的 [componentname]BuildRoute(&$query),[componentname]ParseRoute($segments)这两个方法。

 

因此,如果我们要让我们的组件产生SEF的URL.也需要做两件事

将你要的URL用JRoute::()包含起来。就像下面一样:

 

<a href=<?php echo JRoute::_("index.php?option=com_download&view=itemdetail&id=$item->id") ?>>

 

 在你的组件目录下新建一个router.php文件(只需要在前台就行了)

比喻我现在演示的是com_download组件。所以我要建的文件为\components\comd_download\router.php

 

完成上面的两个事情之后,我们就需要考虑一下router.php的内容了。一个典型的router.php文件的内容如下:

<?php

	function DownLoadBuildRoute(&$query)
	{
		$segments = array();
		if(isset($query['view']))
		{
			$segments[]=$query['view'];
			unset($query['view']);
		}
		
		if(isset($query['id']))
		{
			$segments[] = $query['id'];
			unset($query['id']);
		}
		return $segments;
	}
	
	function  DownLoadParseRoute($segments)
	{
		$vars = array();
		switch($segments[0])
		{
			case 'itemdetail':
				$vars['view']= 'itemdetail';
				$id = explode(';',$segments[1]);
				$vars['id'] =(int)$id[0];
				break;
			case 'showitemlist':
				break;
			default:break;
		}
		return $vars;
	}
?>

 上面的代码功能比较简单,DownLoadBuildRoute方法的参数 &$query注意是引用传递参数,这个$query拥有我们“index.php?option=com_download& view=itemdetail&id=$item->id”链接中的所有参数,我们可以在$query中获得参数。然后将这个参数 从$query中撤销。因为默认情况下,$query中的参数都会显示在URL中。

我们可以简单的把DownLoadRoute的过程理解为从URL中获得参数的过程,只不过这个URL不是我们在浏览器地址栏中看到的那一个URL而是我们在JRoute中写的机器可读的URL.

DownLoadParseRoute可以理解为将参数还原的过程。这个函数的返回值将会被系统重新写入到机器可读的URL中,这样我们的组件就可以正常工作了。由此可见,这两个方法需要紧密的配合使用。

看一下添加了router.php之后的效果:

http://localhost/j25/showitemlist/itemdetail/1

现在的URL看起来干净多了。


 

疑问:

在实际的代码过程中,如果我们没有将URL放到JRouter_()下输入,发现系统也能够正常解析。这个真的有点说不通。

<a href="/component/download/?view=itemdetail&id=&lt;?php_echo_$item-=&gt;id;?=&gt;=">

 

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

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

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级