红帽子工具:搬家编辑器兼容性问题 - 已修复

发表者: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中兼容性问题的影響。

希望这能帮助到大家。