www.dnnworkflow.cn

在DotNetNuke中利用Reports模块拼凑数据(二)


    在(一)中, 我们描述了如何在一分钟之内(如果你SQL语句足够熟练的话),将已有的数据重新打乱、组合、排列,等等,Whatever you want,总之,是用已有的数据,组合成一个新的数据模块。我们介绍了Reports,这个模块非常方便,也极其简单,就是把我们用SELECT语句选择 出来的列,全部都放在一个模块之内,其实,这就是一个非常开放的模块、也非常好用的模块,如果我们自己开发的模块,可以达到这种效果的话,那么,应该就算 是非常成功了。

    Reports的新版(大概是4.0以后的版本,07年的版本还无此功能),已经可以定义Visualizer了,也 就是列表的显示方式也是开放的,可以用一般的Grid,也可以用更为丰富的显示模式,比如我们自己定义的一个XSL文件或者HTML文件来解析数据。这样 的扩展非常好,我的RedstartForm模块在编辑界面上可以由用户自行建立ascx文件,实现动态的展现;但是列表界面还没有做到,希望可以将这个 特性引入进来。

    不但是Reports模块,UDT模块也早就有了可以扩展的列表样式,用户可以自行定义;不过遗憾的是UDT的Edit界面还不是动态的,希望新版的UDT,也就是Forms & List在这方面可以加强。

    在(一)中提到,可以读取当前用户的一些“待办”的信息,敏感的读者会问:用户的信息在哪里呢?

    是的,这也就是Reports的参数,Reports已经提供了部分参数,如下面的语句中展示的:


        Public Shared Function BuildParameters(ByVal SrcModule As PortalModuleBase) As Dictionary(Of StringObject)
            
Dim dict As New Dictionary(Of StringObject)
            
If SrcModule IsNot Nothing Then
                dict.Add(
"PortalID", SrcModule.PortalId)
                dict.Add(
"TabID", SrcModule.TabId)
                dict.Add(
"ModuleID", SrcModule.ModuleId)
                dict.Add(
"UserID", SrcModule.UserId)
            
End If
            
Return dict
        
    只有靠模块提供的参数,我们才能去“识别”一些动态的信息,比如:当前登录的用户、当前的模块、页面等等,只有四个,当然有点少,不过,既然我们可以自己在模块的配置中自行编写SQL语句,那么,有了UserID,原则上就可以知道所有的用户信息了。

    我们假设有一个Reports模块,是现实当前用户的一些数据的,那么,我们就可以在页面上增加一个Reports模块,然后,其SQL语句这样编写:


SELECT * FROM Users WHERE UserID=

    大家有兴趣的话可以自己试一下,就可以出现如下的运行结果:

    这就是一个最简单的利用参数的例子了;当然,Title都是E文的,用AS给一个中文的字段就可以了;一大堆没有的字段,那么,在SELECT的时候,指定只选择固定的字段就可以了,如:

     SELECT DisplayName AS 名称 FROM Users WHERE UserID=@UserID

    类似的参数运用,我们还可以在IFrame模块中看到,IFrame支持的参数更多一些,大家请看一下下图:

    下拉列表中,就是IFrame模块提供给用户的参数。很多是吗?嗯,那是因为在IFrame模块中,就不能写SQL语 句去读取其他的内容了,所以,能列出来的就尽量列出来;不过,在我使用IFrame模块的时候,仍然改动了代码,为之增加了PortalAlias这个参 数(原本的IFrame模块是没有这个参数的)。之所以增加这个参数,是为了访问本机上的另外一个Web系统(非DotNetNuke)。为什么要增加这 个参数呢?因为我的系统可能是被用户从局域网访问的,也可能是被用户从互联网访问的;可能是用户从IP地址访问的,也可能是用户从机器名访问的(在 Host的“网站设置——网站管理——域名绑定”中绑定了所有的可能),这个时候,如果用户从局域网里面访问DotNetNuke,但是IFrame嵌套 的Web系统却走固定的互联网地址的话,就不太好了,所以,增加了一个PortalAlias的参数,当然,这个是另外的一个话题了。

    在我开发RedstartForm这个工作流模块的时候,也用到了参数,但是,我的参数却是这样定义的:{UserID} {ModuleID},也就是用大括号将之括起来,在括号之中的才识别为参数,而在括号之外的则不识别为参数,在这里,我有我的考虑,等到时机成熟的时候,我们再介绍那个模块的参数处理机制。
 posted on 2008-10-27 15:54  DnnWorkflow  阅读(1216)  评论(0编辑  收藏  举报