红帽子工具:搬家编辑器兼容性问题 - 已修复
发表者:Catzwolf 于 2008/4/7 13:40:00 7861 阅读量很长时间以来,我一直试图理解搬家编辑器的工作原理。我对PHP或XOOPS的工作原理并不陌生,但这个问题的困扰让我真的非常沮丧,以至于我都想拔光头发(不管剩下多少),我差点就放弃了。坚持和盲目无知是我众多缺点中的两个,但它们却陪伴我走到了现在。
无论如何,让我们回到搬家编辑器的问题上来。在我重构WF-Channel的过程中,很多人请求我包含一个所见即所得编辑器,经过一番思考,我决定走搬家编辑器的道路。所以,像大多数人一样……我开始查找关于它是如何工作的以及如何将其整合到WF-Channel中的例子。
我要说我没有料到结果是这样的。几乎所有开发者都有自己的处理方式,没有一种方法或方法是一致的,我越看,就越感到困惑。我不敢想象一个对XOOPS和PHP知之甚少的人会怎么想,我真的非常担心。
问题源于目前实际可用的所有不同的编辑器,以及没有人费心去交流,以确定最优的方法(包括我自己)来统一和兼容整个问题,当然,DJ除外,他为此做出了贡献。
对我来说,搬家编辑器应该成为所有开发者的标准事实,如果用户需要一个专业编辑器,他们应该寻找做这些的开发者,并且用户应该自己安装这些编辑器。
无论如何,让我们回到搬家编辑器的问题上来。最初,这个类是为了XOOPS 2.2编写的,而不是2.016分支,这就是所有开发者出现问题的地方。如果你查看XOOPS 2.2的软件包,特别是XOOPS编辑器类,并与DJ公开的类进行比较,它们之间存在着某些差异;主要是2.2版本中包含但XOOPS编辑器软件包中缺失的文件。
在sampleform.php的示例中,它说明了以下是如何将此类添加到自己的模块中:
// 编辑器的选项
// 必选配置
$options['name'] ='required_element';
$options['value'] = empty($_REQUEST['message'])? "" / $_REQUEST['message'];
// 可选配置
$options['rows'] = 25; // 默认值 = 5
$options['cols'] = 60; // 默认值 = 50
$options['width'] = '100%'; // 默认值 = 100%
$options['height'] = '400px'; // 默认值 = 400px
// "textarea": 如果无法创建具有名字 $editor 的编辑器,则将使用 "textarea" 编辑器
// 如果没有设置 $onFailure,则使用第一个可用的编辑器
// 如果禁用 dohtml,则设置 $noHtml 到 true
$sample_form->addElement(new XoopsFormEditor(_MD_MESSAGEC, $editor, $editor_configs, $nohtml = false, $onfailure = "textarea"), true);
然而,如果在 2.018+ 分支上这样做,我会遇到以下错误
引用
致命错误:在 blah blah 中找不到类 'XoopsFormEditor'
唉,这是可以预料的。因为 XoopsForm 类中根本就没有包含此类的“挂钩”。当然,我可以在调用此行之前添加以下行
require_once XOOPS_ROOT_PATH.’/class/xoops_editor.php’;
引用
$sample_form->addElement(new XoopsFormEditor(_MD_MESSAGEC, $editor, $editor_configs, $nohtml = false, $onfailure = "textarea"), true);
但在现实中,我们实际上不需要这样做。如果 XoopsForm 类需要 XoopsEditor 正确工作,那么我们应该在 XoopsForm 类中已经有这样的机制,而不必开发者担心额外的代码行来使其工作。XoopsForm 类应该处理这个问题。
所以请记住,XoopsEditor 类最初是为 Xoops 2.20 编写的,Xoops 编辑器按上述方式正确工作,但,我想它在 Xoops 版本 2.18+ 上也能工作,无需添加大量可能导致兼容性问题的代码。
让我们看看新闻模块中的一个示例,如果类是为 2.00 和 2.20 分支编写的,Herve 的解决方案就不需要了。
$x22=false;
$xv=str_replace('XOOPS ','',XOOPS_VERSION);
if(substr($xv,2,1)=='2') {
$x22=true;
}
switch(strtolower(news_getmoduleoption('form_options'))) {
case 'koivi':
if(!$x22) {
if ( is_readable(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php')) {
include_once(XOOPS_ROOT_PATH . '/class/wysiwyg/formwysiwygtextarea.php');
$editor = new XoopsFormWysiwygTextArea($caption, $name, $value, '100%', '450px', '');
}
} else {
$editor = new XoopsFormEditor($caption, 'koivi', $editor_configs);
}
break;
}
return $editor;
如您所见,首先,我们需要检查正在使用哪个版本的Xoops,然后检查是否已安装另一个Koivi编辑器,如果没有,我们则使用默认设置。但这并不是开发者们的最佳解决方案。实际上,我们在框架内不需要安装两个不同的编辑器类。这正是所有混淆的来源,什么可以与什么协同工作?
当我从一个开发者的角度说出这些话时,我相信我不是唯一一个,每当有人让我在我的模块中添加一个所见即所得编辑器,我都会感到沮丧。为什么?因为Xoops框架中没有这样做的一种标准。不过现在有了。
实际上,答案非常简单,它为所有开发者提供了在2.00、2.20以及现在2.30版本中使用XoopsEditor框架内多种不同编辑器的方法,使得跨所有版本兼容Xoops,而无需创建他们自己的钩子来实现这一点。
具体操作如下
首先,我们需要修改以下文件
引用
XOOPS_ROOT_PATH.’/class/xoopsformloader.php’
然后将以下行添加到文件的末尾
include_once XOOPS_ROOT_PATH . '/ class/xoopsform/formeditor.php';
include_once XOOPS_ROOT_PATH . '/ class/xoopsform/formselecteditor.php';
然后将上述文件从2.20版本复制到您使用的2.00分支中。
希望DJ能在他的优秀的XoopsEditor类中包含这些内容,并且开发者开始在自己的模块中使用上述方法包含编辑器,从而恢复一些一致性,减轻Xoops中兼容性问题的影響。
希望这能帮助到大家。