2017-05-25 30 views
0

我正在開發一個CKEditor插件,我希望能夠提供多種插件來滿足正確的編輯體驗。基本上我希望用戶能夠包含一個「the_framework」插件,該插件又增加了10個插件(每個插件都帶有工具欄按鈕和可能的上下文菜單),提供了完整的編輯支持。我不希望「插件」配置負責加載這些插件。對我而言,這是一個完全或全無的命題。如何從插件中添加CKEditor插件?

我試過讓主插件添加與CKEDITOR.plugins.addExternal的外部插件,但他們不加載。我現在意識到這是因爲pluginsextraPlugins配置沒有命名外部插件,因此Editor.loadPlugins從不嘗試它們。但是,當我的主插件加載並執行onLoad時,更改配置已經太晚了。

我很好,有multiple plugin definitions in one plugin file,但它似乎仍然不會工作,如果編輯器配置沒有明確命名他們全部。

如何從另一個插件加載插件?

回答

0

經過一些調試後,我確定這是不可能的。

我意識到要加載註冊爲外部的「子插件」,我只需在註冊它們後用插件的名稱調用CKEDITOR.plugins.load即可。這與編輯器調用的方法相同,但是,編輯採取了許多額外的步驟,包括加載語言文件和關鍵回調(beforeInit,initafterInit)。

editor.jsloadPlugins功能是,所有的動作發生,但它只能接受一個Editor說法沒有插件列表加載,因爲編輯的配置用於確定要加載的插件。一旦列表確定後,它們全部並行加載。如果子插件從一開始就不在這個數組中,即使主插件稍後手動加載它們,也不會使用編輯器完全初始化它們。

我想出的唯一解決方法是在加載CKEditor源代碼後加載一個額外的腳本,理想情況下是使用主插件分發的腳本。該腳本設置外部子插件定義(實際上位於名爲「master_plugin/plugins」的本地子文件夾中)並註冊回調,該回調基本上查看新編輯器的配置並確定子插件是否需要在編輯器初始化之前添加到列表中。如果有任何這種情況發生在一個插件中,則與額外的腳本相比,這太遲了,並且會失敗。

UPDATE

它實際上是需要註冊的instanceCreated回調內部configLoaded監聽器,因爲當instanceCreated出現在用戶的配置還沒有加載到編輯器。 customConfigLoaded事件對於接收用戶的配置還爲時尚早,因此對pluginsextendedPlugins的任何修改仍將丟失。令人驚訝的是,configLoaded事件被觸發後編輯器使用了幾個配置選項(只讀,enterMode,shiftEnterMode,tabIndex,皮膚,也許其他),但plugins尚未觸及。

configLoaded事件是我可以找到的唯一鉤子點,以保證編輯頁面提供的配置。使用config.customConfig選項,將有可能在editorConfig函數內偵聽customConfigLoaded並獲得完整配置,因爲CKEditor僅在其自己的customConfigLoaded偵聽器中合併了頁面配置。 (操作順序使這成爲可能。)

回到最初通過一個插件(附加包)加載許多插件的目標,但插件系統的設計可能顯然沒有任何意圖。