如何通过覆盖Odoo.define中的函数来禁用Odoo JavaScript净化

How to disable Odoo JavaScript sanitization by overriding functions from odoo.define

本文关键字:Odoo 函数 JavaScript 净化 何通过 覆盖 define      更新时间:2023-09-26

Odoo 9中有一个所见即所得编辑器,它在任何空行上添加<p>标记,并用它们包围几乎每一行。这完全破坏了模板。因此,如果你有一个很好的电子邮件模板,例如你的发票电子邮件,即使你在发送之前没有手动编辑任何内容,他们也会被这个编辑器清除。

我们如何禁用所见即所得编辑器的这种行为?

编辑
有问题的函数是text_to_html,可以在addons/web_editor/static/src/js/backend.js中找到。你可以通过简单地将其剥离为这样的东西来禁用它的过度行为:

text_to_html: function (text) {
        var value = text || "";
        return value;
    }

但是,在核心文件中这样做将在下一次更新时覆盖更改。所以我现在的问题是,从自定义模块覆盖这个函数的正确方法是什么。我熟悉添加新模型的基本Odoo模块,但我不确定如何覆盖odoo.define定义的Odoo JavaScript,到目前为止还没有找到相关文档。

派对迟到了一点,但如果这对某人有帮助的话。。。

首先,它已经在ODOO GitHub存储库中修复了,下面使用的代码就是从那里开始的。如果你能更新ODOO。如果不能,您应该创建新的模块并将其安装在ODOO中。如果你不知道如何参考文档。

将包含以下内容的JavaScript文件放入模块:

odoo.define('web_editor_sanitize_fix.backend', function (require) {
    'use strict';
    var core = require('web.core');
    var backend = require('web_editor.backend');
    backend.FieldTextHtmlSimple.include({
        text_to_html: function (text) {
            var value = text || "";
            try {
                $(text)[0].innerHTML;
                return text;
            } catch (e) {
                if (value.match(/^'s*$/)) {
                    value = '<p><br/></p>';
                } else {
                    value = "<p>"+value.split(/<br'/?>/).join("<br/></p><p>")+"</p>";
                    value = value.replace(/<p><'/p>/g, '').replace('<p><p>', '<p>').replace('<p><p ', '<p ').replace('</p></p>', '</p>');
                }
            }
            return value;
        }
        });
});

我还没有测试代码,但它应该可以工作。