我如何在 odoo 库环境之外仅使用 javascript 在 odoo13 中打开电子邮件编辑器之类的操作?

How do I do a use an action like opening an email composer in odoo13 with only javascript outside of the odoo library environment?

我有一个简单的问题。

我正在使用 odoo13 并且我利用了我自己的 javascript 库。换句话说,我不仅仅依赖于 odoo 库。

我想在按钮上添加一个动作并做一些简单的事情。例如:我想单击一个按钮并打开邮件编辑器,就像在“销售订单/通过电子邮件发送”按钮中所做的那样。

所以我使用 jQuery 作为例子并做这样的事情:

$('.something').on('click', function(){
    var el = $(this);
    var myConfig = {
        'name': 'Compose Email',
        'type': 'ir.actions.act_window',
        'res_model': 'mail.compose.message',
        'views': [(false, 'form')],
        'view_id': false,
        'target': 'new',
        'context': {}
    };
    var action = new WhatMustIDoHere('?????');
    action.run(myConfig);
    // the config above is supposed to be passed to the action and cause mail composer to pop-up
});

它完全超出了它通常关联的范围:

odoo.define('my_module.my_extended_action', function (require) {
'use strict';
    ...blah blah blah
});

...这需要一大堆模板,什么不需要。

相同代码的工作原理如下:您可以在视图中添加如下内容:

<button type="object" name"action_myActionNameWhichIsInPython">Click me</button>

... 然后在 python:

里面
@api.model
def action_myActionNameWhichIsInPython(self):
    return {
        name': 'Compose Email',
        'type': 'ir.actions.act_window',
        'res_model': 'mail.compose.message',
        'views': [(False, 'form')],
        'view_id': False,
        'target': 'new',
        'context': {}
    }

... 一切正常!但这不是我想要做的。我想采用 jQuery 方式,因为我使用一大堆库动态生成了内容,而哪些不依赖于 odoo 环境。

如果您查看我的代码,如果有人能指出正确的方向来替换“WhatMustIDoHere('?????')”,我将不胜感激。

所以我设法做了一些似乎有效的事情。我不确定这样做是否正确或最好,但我想与其他有抱负的程序员分享它。

我添加了一个扩展并创建了一个全局函数:

// set the action element functionality
odoo.define('my_module.whatever', function (require) {
  "use strict";
  var holder = require('web.SystrayMenu');
  var obj = require('web.Widget');
  var ext = obj.extend({
      template:'my_module._odoo_action_element', // This template is added in the templates file and it will be used globally
      events: {
          "click": "on_click",
      },

      on_click: function (e) {
        var el = $(e.currentTarget);
        var action = el.data('_action'); // This is added by the function marked as "_odoo_action" 
        if (action){
          this.do_action(action);
        }
      },
  });
  // add the element to the systray menu so that it can be available globally
  holder.Items.push(_utils.var.erp_systray);

  // create an external function to be used later
  window._odoo_action = function(action){
    $('._odoo_action_element').data('_action', action).click();
  }
});

然后我添加了将被注入到 systrayMenu 中的模板。它是隐藏的,因此不会可见。

<templates xml:space="preserve">
  <t t-name="my_module._odoo_action_element">
    <div class="_odoo_action_element" style="display: none !important;">
      
    </div>
  </t>
</templates>

最后,每当我想使用它时,我都可以这样做:

$('.some_element').on('click',  function(){
    window._odoo_action({
        'name': 'My  title',
        'type': 'ir.actions.act_window',
        'view_type': 'form',
        'view_mode': 'form',
        'res_model': 'mail.compose.message',
        'views': [(false, 'form')],
        'view_id': false,
        'target': 'new',
        'context': context,
    });
});