看一下我们自己写的组件产生的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=<?php_echo_$item-=>id;?=>=">
评论 (0)