CKEditor API
CKEditor API 是 Drupal 8 中的新功能。
请注意,这里仅适用于 Drupal 8 的 CKEditor 模块 API,而不是 CKEditor JavaScript 库的 API —— 相关内容请参见 http://docs.ckeditor.com/。
有关该模块功能的更多信息,请参见 文本编辑器模块文档。
API 特性
按使用频率从低到高排列:
CKEditor 皮肤
Drupal 8 的 CKEditor 默认使用 Moono 皮肤。这对大多数站点来说已经足够,因为它是相对中性的皮肤。但某些站点希望获得更好的集成效果,这时您可以安装 其他皮肤 —— 甚至可以是您自己创建的皮肤。
为此,可以实现 hook_editor_js_settings_alter():
function hook_editor_js_settings_alter(array &$settings) {
foreach (array_keys($settings['editor']['formats']) as $text_format_id) {
if ($settings['editor']['formats'][$text_format_id]['editor'] === 'ckeditor') {
$settings['editor']['formats'][$text_format_id]['editorSettings']['skin'] = 'SKIN_NAME,ABSOLUTE_URL_TO_SKIN';
}
}
}
CKEditor iframe CSS
加载到 CKEditor iframe 实例中的 CSS,例如 /node/add/article 页面中的编辑器(即非内联编辑),可能需要调整,使 CKEditor iframe 的样式符合前端样式(适合喜欢所见即所得的用户),或者能展示结构(适合喜欢简洁编辑器的用户)。
- 前端主题 CSS
几乎所有前端主题都有针对段落、引用、图片标题等的 CSS 样式。因此,所有前端主题都必须告知 CKEditor iframe 实例加载这些 CSS 文件,以确保内容创建者所编辑的内容(文本/标记)样式一致。 他们可以在 *.info.yml 文件中指定 ckeditor_stylesheets 键。这里列出的 CSS 资源也会加载到 CKEditor iframe 中。请参见 Bartik 的示例。同时参考指南 如何让 CKEditor 与前端主题一致(“WYSIWYG 是谎言”)!
- 模块 CSS
在前端加载 CSS 的模块可以使用 hook_ckeditor_css_alter(),从而将该 CSS 加载到 CKEditor iframe 实例中。
CKEditor 插件
为 CKEditor 添加更多功能!
\Drupal\ckeditor\CKEditorPluginInterface:Drupal 插件,与 CKEditor 插件 一一对应,使 Drupal 能够识别可用的 CKEditor 插件。这就是所谓的“CKEditor 插件插件”的原因。
- 您还可以实现四个额外的接口:
1. \Drupal\ckeditor\CKEditorPluginButtonsInterface:允许定义插件提供的按钮,以便用户可以通过拖拽界面配置 CKEditor 工具栏。
示例:\Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo 提供了工具栏按钮(下拉列表)。
2. \Drupal\ckeditor\CKEditorPluginContextualInterface:允许插件根据上下文自动启用,例如:其他插件按钮启用时、某个过滤器启用时、某个插件设置为特定值时,或多种情况组合。
示例:\Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalImageCaption 在图像按钮启用且启用对齐或标题过滤器时会自动启用。
3. \Drupal\ckeditor\CKEditorPluginConfigurableInterface:允许插件定义参数表单,用于配置该插件的任何设置。
示例:\Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo 插件允许配置可应用的样式。
4. \Drupal\ckeditor\CKEditorPluginCssInterface(自 8.1.0 起):允许插件定义额外的 CSS,以加载到 CKEditor iframe 实例中。
示例:\Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalImageCaption 插件会加载额外的 CSS。
- 插件实现必须使用 @CKEditorPlugin 注解,以便被发现。
注解中定义的插件 ID 必须与插件的 JavaScript 中定义的插件名一致:
// PHP 注解中的 pluginId 必须与这里定义的一致。
CKEDITOR.plugins.add('pluginId', { ... });
- 可以通过 hook_ckeditor_plugin_info_alter() 修改已发现插件的注解元数据。
- \Drupal\ckeditor\CKEditorPluginBase 提供了默认实现,因此插件无需实现每个方法。这意味着它针对最常见情况进行了优化:它仅对提供按钮的插件有用。
最后但同样重要的是,在实现新的文本编辑器插件时,您可能还需要确保其配置的用户体验良好。参见 ckeditor.drupalimage.admin.js 和 ckeditor.stylescombo.admin.js 示例。注意,这个方面(仅此方面!)可能会在 https://www.drupal.org/node/2567801 中更改。
调试
Drupal 8 包含一个自定义优化版的 CKEditor。请参见 core/assets/vendor/ckeditor/build-config.js。该文件的文档也解释了如何将 Drupal 8 中内置的 CKEditor 构建(优化为生产环境)替换为开发构建(未压缩)。