Birt制作表格分页信息,通过Script脚本把组件的设置值传递到js脚本变量中
页面效果:
<!--[endif]-->
组件脚本变量似乎于javascript不能用,要获取组件设置的属性还需要绕些弯弯,下面以制作表格分页信息为例说明。制作表格及样式的部分在些就省略不提了,大家都懂的。
本文的分页信息放到Master Page里,以便在每一页都可以看得到:
<!--[endif]-->
图中标示的部分是一个Text组件,选择HTML类型,输入如下内容:
<div id="pageInfo" />
<script type="text/javascript">
// 脚本先于pageNumber和totalPage执行,所以需要延时。
setTimeout(function(){
// pageNumber和totalPage是report-viewer/NavigationbarFragment.jsp里的元素,分别显示当前页和总页数。
var pageNumber = parseInt(document.getElementById("pageNumber").innerText);
var totalPage = parseInt(document.getElementById("totalPage").innerText);
// pageSize来自于位于table头部的text(html类型)的脚本(非js脚本)。
// 通过table的onPrepare脚本获取其设置的pageBreakInterval(分页间隔,即分页大小)值,然后通过table里的text元素将其读出并传到js脚本里(保存为js公共域的变量即可),需保证其在本text标签前完成渲染。
var firstIndex = pageSize * (pageNumber - 1) + 1;
var lastIndex = pageSize * pageNumber;
lastIndex = lastIndex > total ? total : lastIndex;
var str = "power by fbpang 共 " + total + " 条记录,当前显示 " + firstIndex + " ~ " + lastIndex + " 条记录 第 "
+ pageNumber + " 页,共 " + totalPage + " 页";
document.getElementById("pageInfo").innerText = str;
}, 100);
</script>
脚本里主要解决的就是获取当前分面(pageNumber)、分页总数(totalPage)和分页大小(pageSize)。
获取当前分面和分页总数可查看NavigationbarFragment.jsp文件,在WebRoot/report-viewer/birt/pages/control目录下(birt3.7.2,其他版本的自己找),这个文件是报表驱动(report engine)里的文件,用于控制分页的导航页,即下图部分:
<!--[endif]-->
打开NavigationbarFragment.js文件,找到如下代码:
<TD WIDTH="100%" NOWRAP>
<B>
<%
if ( attributeBean.getBookmark( ) != null )
{
%>
<%=
BirtResources.getMessage( "birt.viewer.navbar.prompt.one" )
%>
<SPAN ID='pageNumber'></SPAN>
<%= BirtResources.getMessage( "birt.viewer.navbar.prompt.two" )%>
<SPAN ID='totalPage'></SPAN>
<%
}
else
{
%>
<%= BirtResources.getMessage( "birt.viewer.navbar.prompt.one" )%>
<SPAN ID='pageNumber'><%= ""+attributeBean.getReportPage( ) %></SPAN>
<%= BirtResources.getMessage( "birt.viewer.navbar.prompt.two" )%>
<SPAN ID='totalPage'></SPAN>
<%
}
%>
</B>
</TD>
这就是下图所标示部分的代码:
<!--[endif]-->
其中pageNumber是当前页码,totalPage是分页总数,在js脚本里通过如下代码获取:
var pageNumber = parseInt(document.getElementById("pageNumber").innerText); var totalPage = parseInt(document.getElementById("totalPage").innerText);
获取分页大小有些绕弯,在table的onPrepare脚本里获取分页间隔(pageBreakInterval,也就是分页大小)的值:
reportContext.setGlobalVariable("pageBreakInterval",this.getUserProperty("pageBreakInterval"));
分页间隔(pageBreakInterval)是在table的Page Break属性里设置的,如下图:
<!--[endif]-->
再在table的列头里添加一个Text组件,组件不写任何值,其任务就是做组件Script脚本和html页面js脚本的信使:
<!--[endif]-->
在其onPrepare脚本里写下如下代码,其目的是通组件Script脚本将获取的table属性保存到js脚本变量以备使用,因为table的onPrepare先于其里面的组件的onPrepare执行,所以可以这样获取值:
this.contentType = "html";
this.content = "<script type=\"text/javascript\">var pageSize = "
+ reportContext.getGlobalVariable("pageBreakInterval") + "</script>";
然后就可以在Master Page里的Text使用了,使用setTimeout延迟100ms是因为Master Page里的Text会先于NavigationbarFragment.jsp里的分页导航渲染,为保证读取到当前分页和分页总数,必须延迟这段代码的执行。
Birt报表提供了分页导航功能,其已满足用户的使用,似乎没有必要在弄一个显示分页信息的东西出来,但是本文只是在描述这种组件属性值的获取以及在js中的使用的方法。
初学birt,对脚本的使用不太明了,文中这种方式显得太过幼稚,难登诸位大神的法眼。
本文只是学习笔记,记录下来与大家分享讨论,如果大家有更优雅的方式请不吝赐教。