来源
第一次看见这个3D旋转球标签云模块是在风雪之隅的博客里面,当时就被它吸引了,于是动手弄了一个博客园标签云出来,现在自己使用Joomla搭建个人博客,目的是整合个人手中的资源,自然也少不了它,于是,K2 SWF标签云模块便诞生了!
用途
K2 SWF标签云模块用于自动调取K2的标签,放入3D旋转球中,形成3D旋转球标签云效果,点击标签云上的标签可以快速进行K2标签搜索。
遇到的问题
K2 SWF标签云模块调用的tagcloud.swf是来自网络的,而它会自动将中文转码成gbk编码,因此,假定k2标签为“搜索”,那么,
正确路径应该是(UTF-8):index.php?option=com_k2&view=itemlist&task=tag&tag=%E6%90%9C%E7%B4%A2而现在变成了(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
$path = urldecode($uri->getPath()); //Line 46if($path != iconv('utf-8', 'utf-8', $path)) $path = iconv('gb2312', 'utf-8', $path); //Add
评价
两种修复的方法都只是权宜之计,真正修复的应该是tagcloud.swf,但是这已经是成品swf,对于我来说是能力范围之外了,也只好作罢T_T
扩展开发思想
Joomla扩展开发应该在不改动Joomla核心源码的前提下进行,但可以通过插件方式达到某种改动的效果!
比如在文章输出之前做点什么调整,那就可以通过插件的onContentPrepare方法对文章内容做调整。
Joomla模块开发
源码解析
1.源码结构
mod_k2swftag|--assets 样式/JS/Media目录|----swfobject.js js生成swf类文件|----tagcloud.swf 标签云使用swf文件|--helper.php 模块核心数据处理文件|--index.html 直接访问目录默认访问文件|--k2_router.php k2_router.php用于覆盖原k2 router.php|--language 语言包文件|----en-GB|------en-GB.mod_k2swftag.ini 前台调取语言包文件|------en-GB.mod_k2swftag.sys.ini 后台调取语言包文件|--mod_k2swftag.php 模块入口文件|--mod_k2swftag.xml 模块XML参数文件|--tmpl 模块输出布局目录|----default.php 模块默认输出布局文件|----index.html 模块核心数据处理文件
2.核心文件介绍
modules/mod_k2swftag/mod_k2swftag.xml
XML文件负责模块安装的引导和模块后台参数的显示工作。
<?xml version="1.0" encoding="utf-8"?><extensiontype="module"version="3.1"client="site"method="upgrade"><name>mod_k2swftag</name><author>Zjmainstay</author><creationDate>2013.9</creationDate><copyright>Copyright (C) 2013 Open Source Matters. All rights reserved.</copyright><license>GNU General Public License version 2 or later; see LICENSE.txt</license><authorEmail>admin@zjmainstay.cn</authorEmail><authorUrl>zjmainstay.cn</authorUrl><version>1.0.1</version><description>MOD_K2SWFTAG_XML_DESCRIPTION</description><-- 文件列表,这里列出来的才会保留在安装后的模块目录里 --><files><filename module="mod_k2swftag">mod_k2swftag.php</filename><filename>index.html</filename><filename>k2_router.php</filename><filename>helper.php</filename><folder>tmpl</folder><folder>language</folder><folder>assets</folder></files><languages folder="language/en-GB"><language tag="en-GB">en-GB.mod_k2swftag.ini</language><language tag="en-GB">en-GB.mod_k2swftag.sys.ini</language></languages><-- 后台参数 --><config><fields name="params"><fieldset name="basic"><field name="width"type="text"default="200"label="MOD_K2SWFTAG_WIDTH_LABEL"description="MOD_K2SWFTAG_WIDTH_DESC"/><field name="height"type="text"default="200"label="MOD_K2SWFTAG_HEIGHT_LABEL"description="MOD_K2SWFTAG_HEIGHT_DESC"/><field name="tag_color"type="text"default="#FFFFFF"label="MOD_K2SWFTAG_TAG_COLOR_LABEL"description="MOD_K2SWFTAG_TAG_COLOR_DESC"/><field name="tag_font_size"type="text"default="8pt"label="MOD_K2SWFTAG_TAG_FONT_SIZE_LABEL"description="MOD_K2SWFTAG_TAG_FONT_SIZE_DESC"/></fieldset></fields></config></extension>
modules/mod_k2swftag/mod_k2swftag.php
模块同名PHP文件是整个模块的入口文件,它负责调用helper.php中的处理方法获取数据,然后再调取布局输出模块数据。
<?php/*** @package Joomla.Site* @subpackage mod_k2swftag** @author Zjmainstay* @link http://zjmainstay.cn* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.* @license GNU General Public License version 2 or later; see LICENSE.txt*/defined('_JEXEC') or die;// Include helperif(!class_exists('ModK2swftagHelper')) require __DIR__ . '/helper.php';//获取参数,$params是每个模块的参数变量$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));//获取标签云$tags = ModK2swftagHelper::getTags($params);//输出模块require JModuleHelper::getLayoutPath('mod_k2swftag', $params->get('layout', 'default'));
modules/mod_k2swftag/helper.php
模块数据处理文件
<?php/*** @package Joomla.Site* @subpackage mod_k2swftag** @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.* @license GNU General Public License version 2 or later; see LICENSE.txt*/defined('_JEXEC') or die;/*** Helper for mod_k2swftag** @package Joomla.Site* @subpackage mod_k2swftag* @since 1.5*/class ModK2swftagHelper{public static function getTags(&$params){$db = JFactory::getDbo();$query = $db->getQuery(true);//从k2_tags表中获取所有发布的标签$query->select('id,name')->from('#__k2_tags')->where('published=1');//执行数据库查询,得到以id为下标的对象数组$tags = $db->setQuery($query)->loadObjectList('id');//获取参数中的字体大小参数,默认8pt$fontsize = $params->get('tag_font_size','8pt');//站点域名$domain = rtrim(JURI::base(),'/');//单个标签格式化字符串$tagTpl = "<a href='%s' class='tag' title='%s' style='font-size: %s;'>%s</a>";$tagString = '<tags>';foreach ($tags as $tagId => $tag) {//使用格式化字符串方式得到每一个标签参数$tagString .= vsprintf($tagTpl,array('href'=>$domain . JRoute::_('index.php?option=com_k2&view=itemlist&task=tagid&tagid='.$tag->id),//'href'=>$domain . JRoute::_('index.php?option=com_k2&view=itemlist&task=tag&tag='.$tag->name),'title'=>$tag->name,'fontsize'=>$fontsize,'text'=>$tag->name,));}$tagString .= '</tags>';return urlencode($tagString);}}
modules/mod_k2swftag/tmpl/default.php
模块输出布局文件
<?php/*** @package Joomla.Site* @subpackage mod_k2swftag** @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.* @license GNU General Public License version 2 or later; see LICENSE.txt*/defined('_JEXEC') or die;JFactory::getDocument()->addScript('/modules/mod_k2swftag/assets/swfobject.js');$swfUrl = JURI::root().'modules/mod_k2swftag/assets/tagcloud.swf';$height = $params->get('height',200); //获取高度参数$width = $params->get('width',200); //获取宽度参数$color = $params->get('color','#FFFFFF'); //获取背景颜色参数?><div class="k2swftag<?php echo $moduleclass_sfx ?>" <?php if ($params->get('backgroundimage')) : ?> style="background-image:url(<?php echo $params->get('backgroundimage');?>)"<?php endif;?> ><div id="k2swftag<?php echo $module->id;?>"></div><script type="text/javascript">var tags = "<?php echo $tags; ?>"; //标签云参数var swfObj<?php echo $module->id;?> = new SWFObject("<?php echo $swfUrl;?>", "tagcloudflash", "<?php echo $width; ?>", "<?php echo $height;?>", "9", "<?php echo $color;?>");var widget_k2swftag<?php echo $module->id;?> = swfObj<?php echo $module->id;?>;widget_k2swftag<?php echo $module->id;?>.addParam("allowScriptAccess", "always");widget_k2swftag<?php echo $module->id;?>.addVariable("tcolor", "0x333333"); //标签字体颜色widget_k2swftag<?php echo $module->id;?>.addVariable("hicolor", "0x000000"); //鼠标选中标签边框颜色widget_k2swftag<?php echo $module->id;?>.addVariable("tspeed", "100"); //旋转速度widget_k2swftag<?php echo $module->id;?>.addVariable("distr", "true");widget_k2swftag<?php echo $module->id;?>.addVariable("mode", "tags");widget_k2swftag<?php echo $module->id;?>.addVariable("tagcloud", tags);widget_k2swftag<?php echo $module->id;?>.write("k2swftag<?php echo $module->id;?>");</script></div>
项目开源地址:Joomla-K2-SWFTag
未经同意禁止转载!
转载请附带本文原文地址:Joomla模块开发之K2 SWF标签云模块,首发自 Zjmainstay学习笔记




