【问题标题】:How do I add a CKEditor plugin from within a plugin?如何从插件中添加 CKEditor 插件?
【发布时间】:2017-05-25 21:29:59
【问题描述】:

我正在开发一个 CKEditor 插件,我想成为提供多个插件的工具,这些插件都是正确编辑体验所必需的。基本上我希望用户能够包含一个“the_framework”插件,该插件又添加了 10 个插件(每个插件都有工具栏按钮和可能的上下文菜单),提供完整的编辑支持。我不希望“插件”配置负责加载这些插件。就我而言,这真的是一个全有或全无的提议。

我尝试让主插件使用CKEDITOR.plugins.addExternal 添加外部插件,但它们无法加载。我现在意识到这是因为pluginsextraPlugins 配置没有命名外部插件,所以Editor.loadPlugins 从不尝试它们。但是,当我的主插件加载并执行 onLoad 时,更改配置已经太迟了。

我对 multiple plugin definitions in one plugin file 很好,但如果编辑器配置没有明确命名它们,它似乎仍然无法工作。

如何从另一个插件加载插件?

【问题讨论】:

    标签: ckeditor ckeditor4.x


    【解决方案1】:

    经过更多调试,我确定这是不可能的。

    我意识到要加载注册为外部的“子插件”,我只需要在注册后使用插件名称调用CKEDITOR.plugins.load。这与编辑器调用的方法相同,但是,编辑器会跟进许多额外的步骤,包括加载语言文件和关键回调(beforeInitinitafterInit)。

    editor.js loadPlugins 函数是所有动作发生的地方,但它只接受 Editor 参数而没有要加载的插件列表,因为编辑器的配置用于确定要加载的插件。确定列表后,它们都将并行加载。如果子插件从一开始就不在这个数组中,即使主插件稍后手动加载它们,它们也永远不会被编辑器完全初始化。

    我想出的唯一解决方法是在加载 CKEditor 源代码后加载一个额外的脚本,理想情况下是与主插件一起分发的脚本。该脚本设置外部子插件定义(实际上位于名为“master_plugin/plugins”的本地子文件夹中)并注册一个instanceCreated回调,它基本上查看新编辑器的配置并确定子插件是否需要在编辑器初始化之前添加到列表中。如果任何这种情况发生在插件内部,而不是额外的脚本,那就太晚了,它会失败。

    更新

    实际上有必要在instanceCreated 回调中注册一个configLoaded 侦听器,因为当instanceCreated 发生时,用户的配置尚未加载到编辑器中。 customConfigLoaded 事件也太早接收用户的配置,所以任何对pluginsextendedPlugins 的修改仍然会丢失。令人惊讶的是,configLoaded 事件在 编辑器使用了几个配置选项(readOnly、enterMode、shiftEnterMode、tabIndex、skin,也许还有其他)之后被触发,但 plugins 还没有被触及。

    configLoaded 事件是我能找到的唯一挂钩点,可以保证对页面提供的配置进行编辑。使用config.customConfig 选项,可以在editorConfig 函数中侦听customConfigLoaded 并获取完整配置,因为CKEditor 仅将页面配置合并到其自己的customConfigLoaded 侦听器中。 (操作顺序使这成为可能。)

    回到通过单个插件(附加包)加载多个插件的最初目标,这是可能的,但显然不是插件系统设计的意图。

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多