教程栏目

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升级

第18章 其他系统迁移

第19章 流量翻倍计划