近来对我以前写的日志搬家插件(
链接)做了些改进,诸如允许管理员来帮用户搬家,保存原来博文的发布时间等,准备等成熟时放到Discuz官网的应用中心去。本文记录下在这过程中遇到的一些问题和解决方法。
在开发插件时,与插件有关的文件都在两个文件夹里。几乎所有与该插件相关的文件都在source/plugin下一个以该插件命名的子文件夹里,但语言包文件得放在data/plugindata下:
而当安装该插件到使用它的网站上去时,所有与该插件相关的文件都放在了前述第一个文件夹里。这些文件包括了在开发时在这个文件夹里的所有文件,以及一个xml格式的设置文件。Discuz在开发状态下提供了产生一个设置文件的方法(称为导出),它包含了原来语言包里的所有内容,以及一些其它可设置的项目。
1。支持多个版本
从在开发状态下的Discuz网站上导出的xml设置文件,可以拷贝到安装插件的网站上直接使用如果两个网站使用的同样版本的Discuz软件。但要使得尽可能多的网站使用该插件,则需要对导出的文件做些修改。比如在3.1版的网站上安装用3.2版导出的文件时,就会看到下面的警告:
其原因是导出文件有下面这行 (假如开发网站所使用的Discuz的版本是3.2):
如果该插件经测试后确定可以用于3.1的网站的话,我们可以把这行改为
这样在安装时就不会出现上述警告了。
2。如何修改设置文件
那么如何来修改设置文件呢?这里讨论下用UTF-8版的情形。这个XML设置文件的特点是它是用没有标签(BOM)的UTF-8编码格式储存的,而它的表头上这写着编码用iso-8859-1编码:
...
所以 Notepad 不是一个合适的编辑工具,因为它在保存时会自动添加BOM(参见
链接 )。一种工具是 Visual Studio, 如果我们直接在Visual Studio里把设置文件打开的话会看到文件里的汉字都是乱码,
因为Visual Studio按XML表头的编码(iso-8859-1)来解码了。我们可以在这里修改文件和保存。但是如果要修改汉字的话,要按下述的方式来打开文件:在菜单上选择 Open->File, 在文件选择框里单击来选定要打开的设置文件,再点击Open With->XML(Text) Editor with Encoding-> Choose "Unicode (UTF-8 without signature) - Codepage 65001) as Encoding:
另一种可用的工具是Notepad++。和上面解释过的同样原因,当文件打开时其中的汉字是乱码,要在菜单上选择Encoding->Encode in UTF-8后才能看到汉字。
在视窗系统下带BOM的设置文件也可正常使用,但在Linux下则会显示乱码。这就是为什么有时我在Notepad下修改了设置文件并测试后拷贝到Linux服务器上就出现乱码的原因。
3。允许管理员设置插件
有些使用插件的方式是需要安装插件的网站决定的。以我的日志搬家插件为例,有的网站也许会允许用户自行搬家,也有的网站也许希望由管理员来控制。所以我们要让使用该插件的网站来决定这些设置。在插件设计时,我们可以加入变量。在日志搬家插件里我加了两个按钮:
在使用该插件的网站上安装后就可以看到设置的地方:
那么如何来设置这些变量的缺省(default)值呢?在变量设计界面上并没有让你设缺省值的地方。事实上它用了设计网站上的设置处定的变量值作为了安装时变量的缺省值,这应该算是个自然的选择。如果要修改缺省值的话,可以改设计网站的设置,也可以改xml设置文件,这些变量也成了设置文件里的一部分(注意在下面的内容里第一个变量的缺省值是1,而第二个变量的缺省值是0):
-
-
-
那么插件是如何检查和利用这些变量的呢?下面是在脚本文件里使用的例子:
$allowUserToImport = $_G['cache']['plugin']['txgz_blog_importer']['import_by_user'];
if (!$allowUserToImport && $_G['adminid']!=1) {
showmessage(lang('plugin/txgz_blog_importer', 'import_deny'));
}
4。支持多种语言和字符编码
Discuz软件应不同网站的需求提供了简体GBK, 简体UTF-8, 繁体BIG5, 和繁体UTF-8四种形式的软件。如何让我们的插件可以安装在使用所有这些形式的网站上呢?我们可以在供下载的文件夹里放这四种形式的xml文件,然后安装网站会根据这些文件的文件名来决定哪个是适用于该网站的xml设置文件:
如何来产生这四个xml文件呢?由于我是在简体UTF-8环境下开发的,汉字用在线软件(
链接)来产生后加入了语言包(注意在保存语言包文件时应选择File->Advanced Save Options->Encoding: Unicode (UTF-8 without signature) - Codepage 65001,不然文件里的汉字保存后会变成问号),进而经导出产生了 discuz_plugin_txgz_blog_importer.xml,将导出文件做必要修改后可以改名为 discuz_plugin_txgz_blog_importer_SC_UTF8.xml。从简体UTF-8转繁体UTF-8可以用在线软件(
链接),由简体UTF-8转简体GBK,和由繁体UTF-8转繁体BIG5可以在Notepad+直接产生。比如在其中新加一个文件,在菜单上选择 Encoding->Character sets->Chinese->GB2312 (Simplified) 后,把简体UTF-8的内容拷贝上去,保存后就得到了简体GBK。
插件内的其它文件如PHP脚本文件,模板文件,JS脚本文件和风格文件都必须以ANSI编码储存才能同时被所有四种语言和字符编码系统使用。这也意味着插件中的JS脚本文件和风格文件不应含有任何汉字 (虽然Discuz软件里的个别JS脚本文件和风格文件含有汉字,但Discuz对每个系统提供了适合该系统的这些文件。现在我们要一套文件(除xml设置文件)适合所有系统,使用要求更为严格)。
如果是要将插件放到Discuz的应用中心上去,我们也可以不提供四个xml设置文件。而只提供一个名为discuz_plugin_txgz_blog_importer.xml的供简体GBK使用的xml文件,应用中心会自动产生这四个xml文件。
插件下载:
http://www.bian-wang.com/upload/txgz_blog_importer_160406.zip
4/16/2016 补充:看到Discuz网站上的一个讨论(
链接)给出了一个在插件中的javascript文件里使用语言包汉字的很好的解决方法:在html文件里调用语言包里的汉字来定义javascript变量值,而在javascript文件里调用这些变量。