首先做一下关于Joomla路由的科普。
Joomla可以在每一个组件中实现了组件自己的路由解析功能,以K2为例,文件对应
components/com_k2/router.php
里面有2个函数是生成(build)url链接和解析(parse)浏览器访问链接用的,
分别是:
function K2BuildRoute(&$query)
和
function K2ParseRoute($segments)
命名规则就是组件名+BuildRoute(&$query) 和 组件名+ParseRoute($segments)。
简单介绍到这里,大家都知道链接的生成和解析都在这个文件里了,那么我们来看看它究竟写了什么,我们需要做什么改动才能实现移除id,得到一个漂亮的url地址。
打开router.php文件可以看里面以if ($params->get('k2Sef')) 为条件分开了两部分,这个是K2 使用更高级Sef策略的参数(其实没看出来,也没深入读它这段代码),默认的话是没开启的,因此是作用在else部分,但是为了兼容,一会的修改会两部分都修改(内容一样)。但是很重要一点,getItemId函数被放入了if部分,因此需要我们将其移出来,放到if/else外面,实现共用。如下:
if ($params->get('k2Sef')){//这里省略...//从if这里面找到的function getItemId($alias){...}} else{//这里省略...}/*** Get id K2.** @param string $alias The k2 item alias** @return integer*/function getItemId($alias){$id = null;$db = JFactory::getDBO();$query = "SELECT id FROM #__k2_items WHERE alias = ".$db->quote($alias);$db->setQuery($query);try{$id = $db->loadResult();}catch (Exception $e){$this->setError($e->getMessage());return false;}return $id;}
既然有生成链接和解析链接,那我们就需要做两处修改,对它生成的链接移除id,然后在解析的时候把id给补充回去。
- 生成链接中移除id
找到function k2BuildRoute(&$query)里面的
if (isset($query['id'])){$segments[] = $query['id'];unset($query['id']);}
改成:
if (isset($query['id'])){$segments[] = $query['id'];unset($query['id']);//Remove id from item urlif($segments[0] == 'item') {$parts = explode(':', $segments[1]);$segments[1] = $parts[1];}}
也就是后面加入了一个判断,如果是item类型(文章),就把它的url路径用冒号拆开,然后只取后面的部分(这个是基于它的id:item-alias这样的路径原理做的),也就是:
最后路径地址从1:php-tools-debug会变成php-tools-debug,实现id的移除。
- 解析链接中补充id
找到function k2ParseRoute($segments)中的elseif ($segments[0] == 'item')里面的
default :$vars['id'] = $segments[1];unset($vars['task']);break;
改成:
default :$segments[1] = str_replace(':', '-', $segments[1]);$itemId = getItemId($segments[1]);//Add itemId back for parse$vars['id'] = $itemId.':'.$segments[1];unset($vars['task']);break;
也就是对item类型(文章)的路径,通过访问的链接得到别名,然后再通过别名得到id,再拼装成它本来的样子,提供给它的程序去解析。
总的来说,就是我们通过修改实现了一个中间转换,如下:
本来是:
1-php-tools-debug
我们去掉了前面部分,得到:
php-tools-debug
当用户通过php-tools-debug访问的时候,我们得把它给改回去,因此通过getItemId('php-tools-debug')得到itemId=1,然后拼接起来:
1-php-tools-debug(程序里是id:,浏览器显示是id-)
然后再进入k2的程序中去解析,得到正确的结果。
前面说到的if和else两部分的这块都一样,你们自己改改就好了。
附件是修改前router.orig.php和修改后的router.modify.php文件。
两个文件对应的是k2 v2.6.8版,但是相应这部分在旧版本中没有改动,其他版本用户可以自行修改,建议用户都自行修改。
附件:K2移除链接中的id
未经同意禁止转载!
转载请附带本文原文地址:简单修改实现移除k2 url链接中的id,首发自 Zjmainstay学习笔记




