读了一下openerp新版本的代码,的确有不少的改进。尤其是web client,基本上是推倒重写的。
看官方的论坛上很多人在问如何在web client上实现报表的直接打印,想想现在的打印的确是不方便,总是把文件下载下来,然后打开文件打印。
html的报表容易想到,因为可以直接在web client打开一个新窗口,用js进行打印。于是就改改openerp代码,实现一个简单的html报表的。供大家参考。
时间仓促,勿笑话。
(我用的web client是embedded模式)
OE新版(6.1)的web client的整个结构和以前都不一样了,所以要先研究报表的controller.
没什么好说的。
改完,重启服务,测试。发现点击报表按钮后,浏览器无任何反映,也没有打开新窗口。
看来6.1的确是不一样。
跟踪代码,发现报表这个action在web client的处理函数名为ir_actions_report_xml。
内部又调用:
看名字就知道,这货肯定把所有的报表下载下来,而不是打开新窗口。考虑修改。
get_file函数通过jquery调用了服务端的report view.我们也需要做同样的事情:
在core.js里:
ok, 可以在报表模板里写任何js东西,包括打印的代码。
我并不是用js代码直接打印,是通过Lodop控件,推荐大家使用。
可以直接打印,套打,导出excel。。。。
至此,就可以完成html报表的直接打印了。
看官方的论坛上很多人在问如何在web client上实现报表的直接打印,想想现在的打印的确是不方便,总是把文件下载下来,然后打开文件打印。
html的报表容易想到,因为可以直接在web client打开一个新窗口,用js进行打印。于是就改改openerp代码,实现一个简单的html报表的。供大家参考。
时间仓促,勿笑话。
(我用的web client是embedded模式)
OE新版(6.1)的web client的整个结构和以前都不一样了,所以要先研究报表的controller.
在Reports类里,看到:
('Content-Disposition', 'attachment; filename="%s.%s"' % (action['report_name'], report_struct['format']))
这样的http header的定义。这是要直接下载。修改先:
header_list = [
('Content-Type', report_mimetype),
('Content-Length', len(report))]
if report_struct['format'] not in ['html']:
header_list.append(('Content-Disposition', 'attachment; filename="%s.%s"' % (action['report_name'], report_struct['format'])))
return req.make_response(report,
headers=header_list,
cookies={'fileToken': int(token)})
没什么好说的。
改完,重启服务,测试。发现点击报表按钮后,浏览器无任何反映,也没有打开新窗口。
看来6.1的确是不一样。
跟踪代码,发现报表这个action在web client的处理函数名为ir_actions_report_xml。
内部又调用:
self.session.get_file({
url: '/web/report',
data: {action: JSON.stringify(action)},
complete: $.unblockUI,
success: function(){
if (!self.dialog && on_closed) {
on_closed();
}
self.dialog_stop();
},
error: session.webclient.crashmanager.on_rpc_error
})
看名字就知道,这货肯定把所有的报表下载下来,而不是打开新窗口。考虑修改。
post_data = {
url: '/web/report',
data: {action: JSON.stringify(action)},
complete: $.unblockUI,
success: function(){
if (!self.dialog && on_closed) {
on_closed();
}
self.dialog_stop();
},
error: session.webclient.crashmanager.on_rpc_error
};
if(action.report_type == 'mako2html'){
self.session.open_report_page(post_data)
}else{
self.session.get_file(post_data)
}
get_file函数通过jquery调用了服务端的report view.我们也需要做同样的事情:
在core.js里:
/**
*Open an html report.
*未处理error
**/
open_report_page: function(options) {
var token = new Date().getTime();
params = options.data;
params['session_id'] = this.session_id;
params['token'] = token;
$.post(options.url, params, function(data){
report_window=window.open('','','width=100,height=100');
report_window.document.write(data);
report_window.focus();
options.complete();
if (options.success) { options.success(); }
});
},
ok, 可以在报表模板里写任何js东西,包括打印的代码。
我并不是用js代码直接打印,是通过Lodop控件,推荐大家使用。
可以直接打印,套打,导出excel。。。。
至此,就可以完成html报表的直接打印了。