Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

从OpenOffice Report的换页问题到OE Report Tags的实现原理.



  • 在使用OpenOffice sxw文件实现一个类似于Invoice报表的简单工资单报表时,遇见一个不能让每个工资单占据单独的一页的问题.就是需要每打印完一个工资单,如果页面还留有空白,需要产生新页,而不是在原页上继续产生内容.<br />我想要的内容(两条横线之间代表一页):<br />这是第一页<br />-------------------------<br />Payslip1<br />                xxxxxxxx<br />                xxxxxxxx<br /><br />(预留的空白)<br /><br />-------------------------<br /><br />这是第二页<br />-------------------------<br />Payslip2<br />              xxxxxxxxx<br />              xxxxxxxxx<br /><br />(预留的空白)<br />-------------------------<br /><br />但实际的效果是挤到了一起.<br />-------------------------<br />Payslip1<br />              xxxxxxxxxx<br />              xxxxxxxxxx<br /><br />PaySlip2<br />              xxxxxxxxxx<br />              xxxxxxxxxx<br />-------------------------<br />google了一下,搜到一些老外的解决方案,但都很模糊.不能解决我的问题.<br />最后找到的原因是 因为我把循环工资单对象的tag: "[[ repeatIn(objects, 'p') ]]" 放在了section(即openoffice中对应的区域,对应生成rml中的<section>标签)中间,导致所有对象都在section中[color=red]连续[/color]绘制,无法自动跳页.<br />而如果把 "[[ repeatIn(objects, 'p') ]]"放在sxw文件的第一行,生成的rml中"[[ repeatIn(objects, 'p') ]]"会在<story>标签中间,OE会为每个对象自动跳页.<br /><br />OK,到这里问题解决了.但是没明白report tag这东东到底是怎样实现的,黑盒对于程序员来说太可怕了.%>_<%. 研究下怎样它怎样实现的.<br />(注明: 以下内容并不一定完全正确,如果看官有兴趣一定要自己debug下代码,看看究竟.)<br /><br />OpenERP 涉及到rml使用的report tag的实现主要有两个类:<br /><br />1. ${OPENERP_PATH}/bin/report/preprocess.py::report类. 望文生义,它的主要功能是在对tag实际内容处理之前,进行预处理. 主要是 repeatIn,removeParentNode,setTag这三个tag.本质上是通过lxml对xml文件内容的更改.<br />比如:<br /> <para>This is a test[[ setTag('para','xpre') ]]</para> <br />处理之后会变成 <br /><para rml_tag="setTag('para','xpre')">This is a test[[ '' ]]</para><br />    <br /><tr><br />    <td>Row 1 [[repeatIn(o.order_line,'o')]] </td><br />    <td>Row 2</td><br /></tr><br />处理之后变成<br /><tr rml_loop="repeatIn(o.order_line,'o')"><br />        <td>Row 1 [['']] </td><br />        <td>Row 2</td><br /></tr><br />这里就说明了repeatIn放在<section>,<story>中会产生的效果.<br /><br />2.  ${OPENERP_PATH}/bin/report/report_sxw.py::rml_parse类. 每一个标签都对应着rml_parse类中的一个方法,使用的是模板语言的通用方法:把它们放到一个context中,在解析模板的时候去查找调用.<br /><br />[code]self.localcontext = {<br />            'user': user,<br />            'company': user.company_id,<br />            'repeatIn': self.repeatIn,<br />            'setLang': self.setLang,<br />            'setTag': self.setTag,<br />            'removeParentNode': self.removeParentNode,<br />            'format': self.format,<br />            'formatLang': self.formatLang,<br />            'logo' : user.company_id.logo,<br />            'lang' : user.company_id.partner_id.lang,<br />            'translate' : self.translate,<br />            'setHtmlImage' : self.set_html_image<br />        }[/code]<br /><br />举个例子 format标签的作用就是 去除字符串空格<br />[code]def format(self, text, oldtag=None):<br />        return text.strip()[/code]<br /><br />了解了这个实现方式,甚至可以在模板中间添加自己需要的新标签.<br /><br />写的不是特别清楚明白,不对的地方请大家指正.^^



  • 在使用OpenOffice sxw文件实现一个类似于Invoice报表的简单工资单报表时,遇见一个不能让每个工资单占据单独的一页的问题.就是需要每打印完一个工资单,如果页面还留有空白,需要产生新页,而不是在原页上继续产生内容.<br />我想要的内容(两条横线之间代表一页):<br />这是第一页<br />-------------------------<br />Payslip1<br />                xxxxxxxx<br />                xxxxxxxx<br /><br />(预留的空白)<br /><br />-------------------------<br /><br />这是第二页<br />-------------------------<br />Payslip2<br />              xxxxxxxxx<br />              xxxxxxxxx<br /><br />(预留的空白)<br />-------------------------<br /><br />但实际的效果是挤到了一起.<br />-------------------------<br />Payslip1<br />              xxxxxxxxxx<br />              xxxxxxxxxx<br /><br />PaySlip2<br />              xxxxxxxxxx<br />              xxxxxxxxxx<br />-------------------------<br />google了一下,搜到一些老外的解决方案,但都很模糊.不能解决我的问题.<br />最后找到的原因是 因为我把循环工资单对象的tag: "[[ repeatIn(objects, 'p') ]]" 放在了section(即openoffice中对应的区域,对应生成rml中的<section>标签)中间,导致所有对象都在section中[color=red]连续[/color]绘制,无法自动跳页.<br />而如果把 "[[ repeatIn(objects, 'p') ]]"放在sxw文件的第一行,生成的rml中"[[ repeatIn(objects, 'p') ]]"会在<story>标签中间,OE会为每个对象自动跳页.<br /><br />OK,到这里问题解决了.但是没明白report tag这东东到底是怎样实现的,黑盒对于程序员来说太可怕了.%>_<%. 研究下怎样它怎样实现的.<br />(注明: 以下内容并不一定完全正确,如果看官有兴趣一定要自己debug下代码,看看究竟.)<br /><br />OpenERP 涉及到rml使用的report tag的实现主要有两个类:<br /><br />1. ${OPENERP_PATH}/bin/report/preprocess.py::report类. 望文生义,它的主要功能是在对tag实际内容处理之前,进行预处理. 主要是 repeatIn,removeParentNode,setTag这三个tag.本质上是通过lxml对xml文件内容的更改.<br />比如:<br /> <para>This is a test[[ setTag('para','xpre') ]]</para> <br />处理之后会变成 <br /><para rml_tag="setTag('para','xpre')">This is a test[[ '' ]]</para><br />    <br /><tr><br />    <td>Row 1 [[repeatIn(o.order_line,'o')]] </td><br />    <td>Row 2</td><br /></tr><br />处理之后变成<br /><tr rml_loop="repeatIn(o.order_line,'o')"><br />        <td>Row 1 [['']] </td><br />        <td>Row 2</td><br /></tr><br />这里就说明了repeatIn放在<section>,<story>中会产生的效果.<br /><br />2.  ${OPENERP_PATH}/bin/report/report_sxw.py::rml_parse类. 每一个标签都对应着rml_parse类中的一个方法,使用的是模板语言的通用方法:把它们放到一个context中,在解析模板的时候去查找调用.<br /><br />[code]self.localcontext = {<br />            'user': user,<br />            'company': user.company_id,<br />            'repeatIn': self.repeatIn,<br />            'setLang': self.setLang,<br />            'setTag': self.setTag,<br />            'removeParentNode': self.removeParentNode,<br />            'format': self.format,<br />            'formatLang': self.formatLang,<br />            'logo' : user.company_id.logo,<br />            'lang' : user.company_id.partner_id.lang,<br />            'translate' : self.translate,<br />            'setHtmlImage' : self.set_html_image<br />        }[/code]<br /><br />举个例子 format标签的作用就是 去除字符串空格<br />[code]def format(self, text, oldtag=None):<br />        return text.strip()[/code]<br /><br />了解了这个实现方式,甚至可以在模板中间添加自己需要的新标签.<br /><br />写的不是特别清楚明白,不对的地方请大家指正.^^



  • 好帖,已置顶



  • 收藏,



  • 应该是加精, 而不是置顶了.... <br />不知道 BBS是否有这个功能...



  • 借地盘求助:<br /><br />用mako做OPENERP报告时, 打印出来PDF文件的底端出现文字切半现象,要不就是文字出现一半,还有一半看不到了。 怎么样设置才能解决?<br /><br />



  • 留个脚印,稍后学习、试试。



  • mark



  • 标记一下,我现在的单据做分页也是相当头疼


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待