TYPO3 8.x中CKEditor插件标签data属性被剥离问题求助
我之前在TYPO3 8.x环境下开发类似CKEditor插件时,遇到过完全一样的data属性丢失问题!关闭对话框时代码显示正常,但保存重载后属性就没了,这通常是CKEditor前端过滤和TYPO3后端HTML净化双重作用的结果,给你几个可行的解决步骤:
1. 确保CKEditor配置正确允许属性
首先检查插件和全局CKEditor配置,确保data-hint-content属性被明确允许:
插件内的命令配置
你已经在插件里加了allowedContent,可以保留并确认写法准确:
editor.addCommand('tooltip', new CKEDITOR.dialogCommand('tooltip', { allowedContent: 'span[data-hint-content]; sup' }));
全局YAML配置改用extraAllowedContent
TYPO3 8.x中直接覆盖allowedContent可能会和默认配置冲突,建议用extraAllowedContent来追加规则,避免覆盖原有允许的内容:
editor: config: extraAllowedContent: 'span[data-hint-content]; sup'
如果需要允许所有data-*属性,也可以写成span[data-*]。
2. 配置TYPO3后端的HTML属性过滤
这是很多人忽略的点:即使CKEditor允许了属性,TYPO3后端的HTML净化机制也可能在保存时过滤掉自定义data-*属性。你需要修改TYPO3的属性允许列表:
方式1:通过config.yaml配置RTE proc
在站点的config.yaml中添加RTE的proc配置,把data-hint-content追加到允许的属性列表里(注意保留原有属性,不要直接替换):
RTE: default: proc: allowAttribs: 'class,id,style,data-hint-content'
方式2:通过PHP钩子扩展允许属性
如果YAML配置不生效,可以在你的扩展的ext_localconf.php里添加钩子,动态修改允许的属性:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_parsehtml.php']['modifyAllowedAttribs'][] = function(&$allowedAttribs) { // 给span标签添加允许的data属性 if (!in_array('data-hint-content', $allowedAttribs['span'] ?? [])) { $allowedAttribs['span'][] = 'data-hint-content'; } return $allowedAttribs; };
3. 强制清除TYPO3缓存
TYPO3会缓存CKEditor的配置和RTE设置,修改配置后一定要清除所有缓存(包括页面缓存、配置缓存和RTE缓存),否则新的配置不会生效。
额外检查:确认对话框插入代码的正确性
最后检查插件对话框的onOk函数,确保你正确给span元素设置了data-hint-content属性,比如:
onOk: function() { var editor = this.getParentEditor(); var hintContent = this.getValueOf('basic', 'hintContent'); // 假设你的对话框字段名是hintContent var span = editor.document.createElement('span'); span.setAttribute('data-hint-content', hintContent); // 可以添加样式或其他属性 span.setHtml(this.getValueOf('basic', 'tooltipText')); editor.insertElement(span); }
按照这几步操作后,应该就能解决保存后data属性丢失的问题了!
内容的提问来源于stack exchange,提问作者swiener

