首先做一下关于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 url
if($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学习笔记