上次介绍FineReport的JS API中的第一类开发--FR,这次就来介绍一下FS和contentWindow类的开发。
1 FS
FS是数据决策系统中的js接口,比如说FS.tabPane.addItem,先介绍几类操作:
1.1 FS.Trans.signOut()
退出决策平台系统
1.2 FS.tabPane._doCloseTab(FS.tabPane._getSelectedTab())
关闭当前决策平台的标签
1.3 FS.tabPane.addItem({title:"baidu",src:"http://www.baidu.com"})
在决策平台中打开新标签页
1.4示例
前面两个接口很简单,这里不再举例说明,下面详细介绍一下第三个接口,即在数据决策系统中打开一个新tab。
1.4.1 描述
数据钻取是使用超级链接实现,打开方式有三种,当前窗口,对话框,新窗口。前面2种方式很好理解,第三种在新窗口中打开,即在浏览器端打开一个新的tab页面,如果是在数据决策系统中使用,希望实现在决策系统框架下新增一个tab页签,而不是在浏览器端重新打开一个窗口,这个该怎么实现呢?
1.4.2 模板
下面以%FR_HOME%\demo\basic\DetailedDrillA.cpt为例,该模板中实现了在当前窗口的钻取功能,下面将在当前窗口打开换成在新的tab页面中打开。
1.4.3 超级链接
打开模板,进入A4单元格的超级链接设置界面,如下图:
将订单明细的钻取修改成在数据决策中打开一个新的tab页面,新tab页面的标题为订单明细。
新增一个JavaScript的超级链接,添加参数ID,参数值为当前单元格的值,即ID=$$$,如下图:
通过
window.parent.FS.tabPane.addItem({title:"baidu",src:"http://www.baidu.com"})
实现在新的tab中打开页面。
title:订单明细
src:订单明细模板的路径
具体如下图:
这里要注意,src最后的&符号为参数的传递,即将当前单元格的值传递给参数ID,然后再src的路径后面拼接字符串,将ID参数的值传递给需要打开的新模板中的订单号参数。
代码如下:
window.parent.FS.tabPane.addItem({title:"订单明细",src:"${servletURL}?reportlet=demo/basic/DetailedDrillB.cpt&订单号="+ID})
1.4.4 效果查看
2 contentWindow
2.1介绍:
contentWindow是在web页面集成的时候,将FineReport报表嵌入在iframe中,调用报表对象时使用的接口,比如说:document.getElementById('reportFrame').contentWindow,其中document.getElementById('reportFrame')是获取iframe对象,contentWindow是报表对象,相当于html中的window对象。
在普通模板的JS脚本中可以直接使用contentWindow下的属性,如直接使用contentWindow中的contentPane,而不用写contentWindow,这是因为js脚本本身就在FR模板中执行。
网页中使用iframe嵌入报表,如果文档包含框架(frame或iframe标签),框架中嵌入了FR报表,则会创建一个contentWindow对象先获取iframe,再调用contentWindow,然后使用contentWindow下面的属性
var contentWindow = document.getElementById("reportFrame").contentWindow.XXX;
不论是web页面集成里面还是直接在FR模板之中,contentWindow下面最常用的属性当属contentPane,所以下面将详细介绍contentPane。
contentPane是contentWidow下面的最常用的一个属性,为存放报表内容的容器。
2. 2引用contentPane
在普通模板的JS脚本中直接使用contentPane就能获取到该对象。
如果报表嵌在网页的iframe中,首先在iframe中获取contentWindow,然后获取属性contentPane对象,如下:
var contentPane = document.getElementById('reportFrame').contentWindow.contentPane;
比如,需要在网页中获取报表填报页面的一个按钮,并执行点击事件:
document.getElementById('reportFrame').contentWindow.contentPane.getWidgetByName('控件名').fireEvent('click')
FineReport的填报预览及表单预览下contentPane下都会有一个curLGP对象,即current logicpane。
2.3 引用curLGP
在cpt模板的JS脚本中可以使用contentPane.curLGP来获取该对象。
如果报表嵌在网页的iframe中,在iframe外获取curLGP对象如下:
var contentPane = document.getElementById('reportFrame').contentWindow.contentPane.curLGP;
2.4 write
填报预览时,curLGP下有一个write对象。
2.4.1 引用write
在cpt模板的JS脚本中可以使用contentPane.curLGP.write来获取该对象。
如果报表嵌在网页的iframe中,在iframe外获取write对象如下:
var contentPane = document.getElementByID('reportFrame').contentWindow.contentPane.curLGP.write;
2.5 form
表单预览或参数界面,都有一个form对象。
2.5.1引用form
在cpt模板的JS脚本中可以使用this.options.form来获取该对象,如获取参数界面下拉框p1这个控件:
var widget=this.options.form.getWidgetByName(p1)
如果报表嵌在网页的iframe中,在iframe外获取form对象如下:
var contentPane = document.getElementByID('reportFrame').contentWindow.contentPane.curLGP.form;