我如何在 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,
});
});
我有一个简单的问题。
我正在使用 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,
});
});