Drupal 7聚合JS文件后浏览器提示Ckeditor未定义问题咨询
Drupal 7开启JS/CSS聚合后编辑角色CKeditor未定义问题排查
问题诱因
- 权限关联的JS聚合规则差异:Drupal 7的JS聚合逻辑会根据当前访问用户的角色、权限匹配可加载的JS资源列表,再生成对应的聚合文件。如果CKeditor核心JS、依赖插件的加载逻辑绑定了仅限高权限角色的权限判断,或者编辑角色缺失
access ckeditor、对应文本格式的使用权限,编辑角色的JS资源列表就会缺失CKeditor相关代码,聚合后自然找不到全局变量。 - 聚合生成时序问题:如果站点开启了页面缓存、JS预聚合功能,优先用匿名用户/低权限角色的资源列表预生成了编辑页的聚合包,后续编辑角色访问时直接调用了没有CKeditor代码的旧聚合包,也会触发报错。
- 聚合路径过滤bug:老旧版本的Drupal 7核心、CKeditor模块存在聚合路径过滤bug,会把
sites/all/libraries下的CKeditor原生JS文件误判为非站点资源,过滤出聚合列表,仅当管理员访问时触发了模块的强制加载逻辑才会引入,低权限角色访问时就被过滤掉。
解决方法
前置校验
先临时关闭JS聚合功能,确认编辑角色可以正常使用CKeditor,排除权限本身配置错误的问题。
正式修复方案
- 校验基础权限配置:登录后台进入「人员」-「权限」页面,确认编辑角色已经勾选以下权限:
访问CKeditor(CKeditor模块的基础访问权限)- 站点正在使用的富文本格式(如Full HTML、Filtered HTML)对应的
使用XXX文本格式权限
保存权限后清空所有缓存再测试。
- 强制CKeditor JS全局加载:如果权限配置正常,可以在主题的
template.php文件中添加钩子,强制所有有权限使用富文本的角色加载CKeditor核心JS,避免聚合时被过滤:
将代码中的function YOUR_THEME_NAME_preprocess_page(&$variables) { // 仅对有权限访问CKeditor的用户加载核心JS if (user_access('access ckeditor')) { drupal_add_js(libraries_get_path('ckeditor') . '/ckeditor.js', array( 'weight' => -100, 'preprocess' => TRUE )); } }YOUR_THEME_NAME替换为站点当前使用主题的机器名,保存后清空所有缓存、重新生成聚合文件即可。 - 修复聚合路径过滤问题:如果使用的是老旧版本的核心或CKeditor模块,优先升级到Drupal 7核心最新稳定版、CKeditor模块最新7.x版本,升级后清空所有缓存重新生成聚合文件。
- 排除第三方聚合模块冲突:如果使用了AdvAgg等第三方聚合模块,先关闭JS预生成功能,用编辑角色账号访问一次编辑页触发聚合文件重新生成后再开启,也可以直接在聚合模块配置中把CKeditor的JS路径加入强制聚合白名单。
内容的提问来源于stack exchange,提问作者Rajkumar Dasgupta
相关产品推荐
相关产品推荐

