vuvivian's blog

越努力,越幸运.

  1. 1. 任务栏Systray
  2. 2. 添加一个新得任务栏项目
  3. 3. 排序Ordering
  4. 4. 翻译管理
  5. 5. 会话Session
  6. 6. 添加信息到会话中

任务栏Systray

Systray是界面菜单栏的右侧部分,Web客户端在其中显示一些小部件,如消息菜单。
当菜单创建SystrayMenu时,它将查找所有已注册的小部件,并将它们作为子小部件添加到适当的位置。
目前没有针对Systray小工具的特定API。它们应该是简单的小部件,并且可以像使用trigger-up方法的其他小部件一样与环境通信。

添加一个新得任务栏项目

没有Systray注册表。添加小部件的正确方法是将其添加到类变量systraymenu.items中。

1
2
3
4
5
6
7
var SystrayMenu = require('web.SystrayMenu');

var MySystrayWidget = Widget.extend({
...
});

SystrayMenu.Items.push(MySystrayWidget);

排序Ordering

在将小部件添加到自己之前,Systray菜单将按Sequence属性对项目进行排序。如果原型上不存在该属性,则将使用50。因此,要将Systray项目定位在靠后,可以设置一个非常高的序列号(反之,将其放在靠前的是一个较低的序列号)。
MySystrayWidget.prototype.sequence = 100;

翻译管理

有些翻译是在服务器端进行的(基本上是由服务器呈现或处理的所有文本字符串),但是静态文件中有需要翻译的字符串。它目前的工作方式如下:

  • 每个可翻译字符串都带有特殊的函数_t(可在js模块web.core中找到)
  • 服务器使用这些字符串生成正确的PO文件。
  • 每当加载Web客户机时,它将调用route/web/web client/translations,它返回所有可翻译术语的列表
  • 在运行时,每当调用函数时,它都会在该列表中查找以查找转换,如果找不到转换,则返回它或原始字符串。

请注意,在文档翻译模块中,从服务器的角度对翻译进行了更详细的解释。
javascript中的翻译有两个重要功能:_t和_lt。区别在于_lt是以懒惰的方式进行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
var core = require('web.core');

var _t = core._t;
var _lt = core._lt;

var SomeWidget = Widget.extend({
exampleString: _lt('this should be translated'),
...
someMethod: function () {
var str = _t('some text');
...
},
});

在本例中,由于在加载模块时翻译尚未准备就绪,因此必须使用_lt。
注意,翻译功能需要注意。参数中给定的字符串不应是动态的。

会话Session

Web客户端提供了一个特定的模块,其中包含一些特定于用户当前会话的信息。一些显著的键是:

  • uid:当前用户的id(来自于表 res.users 的ID)
  • user_name: 用户的名字,字符串类型
  • 用户上下文(context [用户id,语言和时区])
  • partner_id: 与当前用户关联的合作伙伴的ID
  • db:当前使用的数据库名字

添加信息到会话中

加载/web路由后,服务器将在模板中插入一些会话信息和脚本标记。信息将从模型ir.http的方法session_info中读取。因此,如果要添加特定信息,可以通过重写session_info方法并将其添加到字典中来完成。

1
2
3
4
5
6
7
8
9
10
11
from odoo import models
from odoo.http import request


class IrHttp(models.AbstractModel):
_inherit = 'ir.http'

def session_info(self):
result = super(IrHttp, self).session_info()
result['some_key'] = get_some_value_from_db()
return result

现在,通过在会话中读取该值,可以在javascript中获取该值:

1
2
3
var session = require('web.session');
var myValue = session.some_key;
...

请注意,此机制旨在减少Web客户端准备就绪所需的通信量。它更适合于计算成本较低的数据(缓慢的session_info调用将延迟为每个人加载Web客户端),以及在初始化过程早期需要的数据。

本文最后更新于 天前,文中所描述的信息可能已发生改变