odoo notify and warning client action

odoo后台接口如果出现错误可以简单抛出一个UserError异常给前端进行处理
但是有些时候可能只是一个通知或者警告给用户,不需要错误这么重的模态强交互,也不用影响主流程

从odoo8的addons/web/static/src/js/chrome.js源码中可以发现这个功能曾经拥有

本次以notify通知为例,其对应到odoo9之后的移植代码为:

相对应后台调用统一封装方法:

 

odoo form view document multi upload

odoo表单相关的附件文档如果过多,逐个本地选择上传也是一种负担,比较好的方式是适配现代H5浏览器文件选择对话框原生的多选功能,这可以大大提高多文件操作效率

基础结构:file元素添加multiple属性

事件支持:

odoo custom web window title

odoo窗口标题的修改方法有很多,但最灵活的还是后台开发者模式动态修改视图里的title,这就需要先搭一座便桥先:

上述是桥接视图方便随时修改,接着还需要将原生前端硬编码优雅的架构到一起

如果还想追求到极致的话,下一步就是再将其整合到res_config通用设置里,特别适合SAAS运营的场景:)

odoo form view pic url widget

原生表单视图的image组件只能使用binary类型字段存储本地图片,而互联网应用一般都使用cdn,如第三方的七牛云存储,其在odoo中的表现形式其实是一个char类型的url,并不会占用自身服务器的存储,这就需要量身为其定制一种外链图片的widget:

之后就可以在表单视图中直接使用诸如<field name=”pic_url” widget=”pic”/>形式的网络图片字段组件

odoo views client reload action

odoo原生常用的reload动作,是整个框架的刷新,源码如下:

还有一个reload_context动作,整体刷新前会先刷新session上下文是否正常,源码如下:

现在需要对一些轻量级的通用场景进行视图层级的数据重载刷新支持,以提高用户体验的舒适度,核心代码如下:

之后就可以在odoo任何层级应用代码里跟调用reload和reload_context一样快捷方便的使用reload_view动作

odoo search view default show filters advanced menu

odoo搜索视图默认是隐藏高级搜索菜单栏,虽然可以打开记住状态,但换台电脑或浏览器默认又是关闭,这就需要改变其缺省机制,源码如下:

odoo tree view pagination disable unlimited

odoo列表视图分页默认80条记录,但可以点击切换选择200、500、2000、无限制,相关源码如下:

如果系统运行许久积累了大量数据,特别是互联网海量应用,这个无限制就造成了一个性能上的隐患

这里通过继承渲染分页方法,在点击分页信息动态生成记录条数选择的事件上优雅的移除掉最后一个无限制选项

odoo china baidu maps api

odoo原生内置google maps,导致中国大部分区域不仅无法正常使用,用户浏览器一直加载到超时还拖慢了网站整体

相关源码:

可见针对联系人扩展了静态地图和外链地图两个接口,其参数都是通过模块自身的国家、邮编、城市、街道等地址相关字段构成

了解上诉原理之后,参照百度地图开放平台API,梳理出相近接口的参数异同点后,完全可以改造成具有中国特色的odoo maps

核心代码:

最后顺便将其整合到odoo开源模块Website China Features里,有需要可直接从官方应用市场下载使用
https://apps.odoo.com/apps/modules/9.0/website_china_features/

ECShop动静分离transport.js get jsonp跨域对接

ECShop transport.js定义了Ajax Transport

其中run方法实现了类似jQuery $.ajax的功能但缺少了对jsonp方式的支持

可以在第一个get方法判断入口前新增下列代码:

巧妙的将原来ajax get方法对接上jquery script jsonp实现
排除一些自制的特殊调用:比如callback的第二个参数以及this的深度使用
其它上层Ajax.call相关调用就不用一一更新了

odoo开发支持国际化语言的第三方应用

英语开发并安装好应用的单语言版本
普通视图元素的string、help、sum、confirm、placeholder属性文本自动导出
QWeb模版(包括服务端和客户端两个部分),如果没有用t-translation=”off”关闭翻译,
则title、alt、label、placeholder属性文本也会自动导出
关于模型字段(Model Field),如果模型没有标注_translate = False:则string和help属性默认可导出;selection类型字段文本也可导出;translate属性设置为True,则所有存在值(values)都会导出
_constraints和_sql_constraints约束中的help、error信息会导出
其它代码里显式调用国际化字符串获取接口的参数值一同导出

管理员设置
翻译(Translations)=》导入/导出(Import / Export)=》导出翻译(Export Translations)
语言(Language)选择新语言翻译模版(New Language Empty translation template)
文件格式(File Format)选择PO File
导出应用(Apps To Export)里选择您的模块
导出(Export)=>下载《模块名.pot》文件

模块新增i18n目录
将上一步导出的文件移进去作为基准翻译模版
以此模版为基础简单的另存为其它语言文件如:zh_CN.po
或者使用PO editor等编辑软件所译即所得自动生成
还可以当前目录直接运行msginit命令默认生成操作系统对应的语言版本文件

与直接模版另存为比较多了以下三项区别:

根据语言文件内的各项原文本msgid部分翻译成对应的msgstr值
加载翻译分别选择各种语言并覆盖已存在的术语(odoo9更新模块也可达到部分效果)
选择不同的用户语言即可整体确认翻译质量

应用发布
odoo9和odoo8的翻译文件不太兼容,主要是因为各自对msgid的引用方式不同
需要分别针对不同版本的系统制作翻译文件并发布到对应分支上