来源
第一次看见这个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 46
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.源码结构
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"?>
<extension
type="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 helper
if(!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学习笔记