2013年09月16日 16:11:31

Joomla模块开发之K2 SWF标签云模块

作者: 

本文介绍一下K2 SWF标签云模块的开发,同时也算是Joomla模块开发的教程。

来源

第一次看见这个3D旋转球标签云模块是在风雪之隅的博客里面,当时就被它吸引了,于是动手弄了一个博客园标签云出来,现在自己使用Joomla搭建个人博客,目的是整合个人手中的资源,自然也少不了它,于是,K2 SWF标签云模块便诞生了!

用途

K2 SWF标签云模块用于自动调取K2的标签,放入3D旋转球中,形成3D旋转球标签云效果,点击标签云上的标签可以快速进行K2标签搜索。

遇到的问题

K2 SWF标签云模块调用的tagcloud.swf是来自网络的,而它会自动将中文转码成gbk编码,因此,假定k2标签为“搜索”,那么,

  1. 正确路径应该是(UTF-8):index.php?option=com_k2&view=itemlist&task=tag&tag=%E6%90%9C%E7%B4%A2
  2. 而现在变成了(GBK):index.php?option=com_k2&view=itemlist&task=tag&tag=%CB%D1%CB%F7

当用户以GBK编码的k2标签路径通过FireFox进行访问时,就出现乱码了!(Chrome/IE访问正常)

解决

这个问题困扰了很久,为了达到标签过滤的功能,在暂时没法解决的情况下我选择了绕开问题解决,通过tagid来获取tagname然后再进行过滤,因此就衍生了k2_router.php这个文件,这个文件是基于k2 router.php修复,加入了tagid的解析,用于替换k2原有的router.php文件,达到tagid可解析的效果。
这个解决方法的弊端是需要覆盖k2 router.php文件,脱离了模块本身。

最后,经过排查发现问题出现在Joomla的路径解析上。Joomla只是对路径参数进行urldecode解码,可是,在Joomla基于UTF-8编码情况下解码GBK编码,解析出来的会是GBK编码的结果,但不进行转码修复的话,GBK编码的字符在UTF-8编码文件中使用就是乱码,并最终导致标签过滤查询的错误。
对于这个的修复,需要改动到Joomla源码核心文件/libraries/cms/router/site.php

  1. $path = urldecode($uri->getPath()); //Line 46
  2. if($path != iconv('utf-8', 'utf-8', $path)) $path = iconv('gb2312', 'utf-8', $path); //Add

评价

两种修复的方法都只是权宜之计,真正修复的应该是tagcloud.swf,但是这已经是成品swf,对于我来说是能力范围之外了,也只好作罢T_T

扩展开发思想

Joomla扩展开发应该在不改动Joomla核心源码的前提下进行,但可以通过插件方式达到某种改动的效果!
比如在文章输出之前做点什么调整,那就可以通过插件的onContentPrepare方法对文章内容做调整。


Joomla模块开发

源码解析

1.源码结构

  1. mod_k2swftag
  2. |--assets 样式/JS/Media目录
  3. |----swfobject.js js生成swf类文件
  4. |----tagcloud.swf 标签云使用swf文件
  5. |--helper.php 模块核心数据处理文件
  6. |--index.html 直接访问目录默认访问文件
  7. |--k2_router.php k2_router.php用于覆盖原k2 router.php
  8. |--language 语言包文件
  9. |----en-GB
  10. |------en-GB.mod_k2swftag.ini 前台调取语言包文件
  11. |------en-GB.mod_k2swftag.sys.ini 后台调取语言包文件
  12. |--mod_k2swftag.php 模块入口文件
  13. |--mod_k2swftag.xml 模块XML参数文件
  14. |--tmpl 模块输出布局目录
  15. |----default.php 模块默认输出布局文件
  16. |----index.html 模块核心数据处理文件

2.核心文件介绍
modules/mod_k2swftag/mod_k2swftag.xml
XML文件负责模块安装的引导和模块后台参数的显示工作。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <extension
  3. type="module"
  4. version="3.1"
  5. client="site"
  6. method="upgrade">
  7. <name>mod_k2swftag</name>
  8. <author>Zjmainstay</author>
  9. <creationDate>2013.9</creationDate>
  10. <copyright>Copyright (C) 2013 Open Source Matters. All rights reserved.</copyright>
  11. <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
  12. <authorEmail>admin@zjmainstay.cn</authorEmail>
  13. <authorUrl>zjmainstay.cn</authorUrl>
  14. <version>1.0.1</version>
  15. <description>MOD_K2SWFTAG_XML_DESCRIPTION</description>
  16. <-- 文件列表,这里列出来的才会保留在安装后的模块目录里 -->
  17. <files>
  18. <filename module="mod_k2swftag">mod_k2swftag.php</filename>
  19. <filename>index.html</filename>
  20. <filename>k2_router.php</filename>
  21. <filename>helper.php</filename>
  22. <folder>tmpl</folder>
  23. <folder>language</folder>
  24. <folder>assets</folder>
  25. </files>
  26. <languages folder="language/en-GB">
  27. <language tag="en-GB">en-GB.mod_k2swftag.ini</language>
  28. <language tag="en-GB">en-GB.mod_k2swftag.sys.ini</language>
  29. </languages>
  30. <-- 后台参数 -->
  31. <config>
  32. <fields name="params">
  33. <fieldset name="basic">
  34. <field name="width"
  35. type="text"
  36. default="200"
  37. label="MOD_K2SWFTAG_WIDTH_LABEL"
  38. description="MOD_K2SWFTAG_WIDTH_DESC"/>
  39. <field name="height"
  40. type="text"
  41. default="200"
  42. label="MOD_K2SWFTAG_HEIGHT_LABEL"
  43. description="MOD_K2SWFTAG_HEIGHT_DESC"/>
  44. <field name="tag_color"
  45. type="text"
  46. default="#FFFFFF"
  47. label="MOD_K2SWFTAG_TAG_COLOR_LABEL"
  48. description="MOD_K2SWFTAG_TAG_COLOR_DESC"/>
  49. <field name="tag_font_size"
  50. type="text"
  51. default="8pt"
  52. label="MOD_K2SWFTAG_TAG_FONT_SIZE_LABEL"
  53. description="MOD_K2SWFTAG_TAG_FONT_SIZE_DESC"/>
  54. </fieldset>
  55. </fields>
  56. </config>
  57. </extension>

modules/mod_k2swftag/mod_k2swftag.php
模块同名PHP文件是整个模块的入口文件,它负责调用helper.php中的处理方法获取数据,然后再调取布局输出模块数据。

  1. <?php
  2. /**
  3. * @package Joomla.Site
  4. * @subpackage mod_k2swftag
  5. *
  6. * @author Zjmainstay
  7. * @link http://zjmainstay.cn
  8. * @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
  9. * @license GNU General Public License version 2 or later; see LICENSE.txt
  10. */
  11. defined('_JEXEC') or die;
  12. // Include helper
  13. if(!class_exists('ModK2swftagHelper')) require __DIR__ . '/helper.php';
  14. //获取参数,$params是每个模块的参数变量
  15. $moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
  16. //获取标签云
  17. $tags = ModK2swftagHelper::getTags($params);
  18. //输出模块
  19. require JModuleHelper::getLayoutPath('mod_k2swftag', $params->get('layout', 'default'));

modules/mod_k2swftag/helper.php
模块数据处理文件

  1. <?php
  2. /**
  3. * @package Joomla.Site
  4. * @subpackage mod_k2swftag
  5. *
  6. * @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
  7. * @license GNU General Public License version 2 or later; see LICENSE.txt
  8. */
  9. defined('_JEXEC') or die;
  10. /**
  11. * Helper for mod_k2swftag
  12. *
  13. * @package Joomla.Site
  14. * @subpackage mod_k2swftag
  15. * @since 1.5
  16. */
  17. class ModK2swftagHelper
  18. {
  19. public static function getTags(&$params)
  20. {
  21. $db = JFactory::getDbo();
  22. $query = $db->getQuery(true);
  23. //从k2_tags表中获取所有发布的标签
  24. $query->select('id,name')->from('#__k2_tags')->where('published=1');
  25. //执行数据库查询,得到以id为下标的对象数组
  26. $tags = $db->setQuery($query)->loadObjectList('id');
  27. //获取参数中的字体大小参数,默认8pt
  28. $fontsize = $params->get('tag_font_size','8pt');
  29. //站点域名
  30. $domain = rtrim(JURI::base(),'/');
  31. //单个标签格式化字符串
  32. $tagTpl = "<a href='%s' class='tag' title='%s' style='font-size: %s;'>%s</a>";
  33. $tagString = '<tags>';
  34. foreach ($tags as $tagId => $tag) {
  35. //使用格式化字符串方式得到每一个标签参数
  36. $tagString .= vsprintf($tagTpl,array(
  37. 'href'=>$domain . JRoute::_('index.php?option=com_k2&view=itemlist&task=tagid&tagid='.$tag->id),
  38. //'href'=>$domain . JRoute::_('index.php?option=com_k2&view=itemlist&task=tag&tag='.$tag->name),
  39. 'title'=>$tag->name,
  40. 'fontsize'=>$fontsize,
  41. 'text'=>$tag->name,
  42. ));
  43. }
  44. $tagString .= '</tags>';
  45. return urlencode($tagString);
  46. }
  47. }

modules/mod_k2swftag/tmpl/default.php
模块输出布局文件

  1. <?php
  2. /**
  3. * @package Joomla.Site
  4. * @subpackage mod_k2swftag
  5. *
  6. * @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
  7. * @license GNU General Public License version 2 or later; see LICENSE.txt
  8. */
  9. defined('_JEXEC') or die;
  10. JFactory::getDocument()->addScript('/modules/mod_k2swftag/assets/swfobject.js');
  11. $swfUrl = JURI::root().'modules/mod_k2swftag/assets/tagcloud.swf';
  12. $height = $params->get('height',200); //获取高度参数
  13. $width = $params->get('width',200); //获取宽度参数
  14. $color = $params->get('color','#FFFFFF'); //获取背景颜色参数
  15. ?>
  16. <div class="k2swftag<?php echo $moduleclass_sfx ?>" <?php if ($params->get('backgroundimage')) : ?> style="background-image:url(<?php echo $params->get('backgroundimage');?>)"<?php endif;?> >
  17. <div id="k2swftag<?php echo $module->id;?>"></div>
  18. <script type="text/javascript">
  19. var tags = "<?php echo $tags; ?>"; //标签云参数
  20. var swfObj<?php echo $module->id;?> = new SWFObject("<?php echo $swfUrl;?>", "tagcloudflash", "<?php echo $width; ?>", "<?php echo $height;?>", "9", "<?php echo $color;?>");
  21. var widget_k2swftag<?php echo $module->id;?> = swfObj<?php echo $module->id;?>;
  22. widget_k2swftag<?php echo $module->id;?>.addParam("allowScriptAccess", "always");
  23. widget_k2swftag<?php echo $module->id;?>.addVariable("tcolor", "0x333333"); //标签字体颜色
  24. widget_k2swftag<?php echo $module->id;?>.addVariable("hicolor", "0x000000"); //鼠标选中标签边框颜色
  25. widget_k2swftag<?php echo $module->id;?>.addVariable("tspeed", "100"); //旋转速度
  26. widget_k2swftag<?php echo $module->id;?>.addVariable("distr", "true");
  27. widget_k2swftag<?php echo $module->id;?>.addVariable("mode", "tags");
  28. widget_k2swftag<?php echo $module->id;?>.addVariable("tagcloud", tags);
  29. widget_k2swftag<?php echo $module->id;?>.write("k2swftag<?php echo $module->id;?>");
  30. </script>
  31. </div>

项目开源地址:Joomla-K2-SWFTag



未经同意禁止转载!
转载请附带本文原文地址:Joomla模块开发之K2 SWF标签云模块,首发自 Zjmainstay学习笔记
阅读( 8868 )
看完顺手点个赞呗:
(2 votes)

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

阿里云幸运券分享
网站总访问量: