2014年03月30日 23:00:00

简单修改实现移除k2 url链接中的id

作者: 

简单修改实现移除k2 url链接中的id

首先做一下关于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外面,实现共用。如下:

  1. if ($params->get('k2Sef'))
  2. {
  3. //这里省略...
  4. //从if这里面找到的function getItemId($alias){...}
  5. } else
  6. {
  7. //这里省略...
  8. }
  9. /**
  10. * Get id K2.
  11. *
  12. * @param string $alias The k2 item alias
  13. *
  14. * @return integer
  15. */
  16. function getItemId($alias)
  17. {
  18. $id = null;
  19. $db = JFactory::getDBO();
  20. $query = "SELECT id FROM #__k2_items WHERE alias = ".$db->quote($alias);
  21. $db->setQuery($query);
  22. try
  23. {
  24. $id = $db->loadResult();
  25. }
  26. catch (Exception $e)
  27. {
  28. $this->setError($e->getMessage());
  29. return false;
  30. }
  31. return $id;
  32. }

既然有生成链接和解析链接,那我们就需要做两处修改,对它生成的链接移除id,然后在解析的时候把id给补充回去。

  1. 生成链接中移除id
    找到function k2BuildRoute(&$query)里面的
  1. if (isset($query['id']))
  2. {
  3. $segments[] = $query['id'];
  4. unset($query['id']);
  5. }

改成:

  1. if (isset($query['id']))
  2. {
  3. $segments[] = $query['id'];
  4. unset($query['id']);
  5. //Remove id from item url
  6. if($segments[0] == 'item') {
  7. $parts = explode(':', $segments[1]);
  8. $segments[1] = $parts[1];
  9. }
  10. }

也就是后面加入了一个判断,如果是item类型(文章),就把它的url路径用冒号拆开,然后只取后面的部分(这个是基于它的id:item-alias这样的路径原理做的),也就是:
最后路径地址从1:php-tools-debug会变成php-tools-debug,实现id的移除。

  1. 解析链接中补充id
    找到function k2ParseRoute($segments) 中的elseif ($segments[0] == 'item')里面的
  1. default :
  2. $vars['id'] = $segments[1];
  3. unset($vars['task']);
  4. break;

改成:

  1. default :
  2. $segments[1] = str_replace(':', '-', $segments[1]);
  3. $itemId = getItemId($segments[1]);
  4. //Add itemId back for parse
  5. $vars['id'] = $itemId.':'.$segments[1];
  6. unset($vars['task']);
  7. 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学习笔记
阅读( 5845 )
看完顺手点个赞呗:
(1 Vote)

1.PHP cURL群:PHP cURL高级技术
2.正则表达式群:专精正则表达式
3. QQ联系(加请说明):QQ联系博主(951086941)
4. 邮箱:zjmainstay@163.com
5. 打赏博主:

网站总访问量: