利用基于 Macromedia Flash 的视图来呈现 Domino 视图的内容和合并 Domino 视图的设计。利用此解决方案,可以快速地为 Web 用户展示标准的 Domino 视图并方便地为 Lotus Notes 和 Web 客户机更新单个 Domino 视图的设计。
本文介绍如何基于平面 Domino 视图并在其中进行控制,将 IBM Lotus Domino 视图内容呈现在 Macromedia Flash 中。通过这种方法,只要更改 Domino 视图即可在 Lotus Notes 和 Flash 用户界面 (UI) 中维持相同的设计和内容。
通过采用此解决方案,不再需要在附加的视图中插入内联的 HTML 或 XML,就可以使用相同的方法在 Lotus Notes UI 和 Flash UI 中格式化内容。相反,创建这样一个 Domino 视图,它包括应用到列标题或行的格式化方法,例如字号、字体和字体灰度,UI 就可以共享相同的格式化方法。利用此方法在 Web 客户机中使用 Flash,可以将 Domino 视图的字体嵌入到 Flash 影片中,可以在 Web 客户机中完美地呈现。
本文描述名为 FlashNotesView 的 Flash 解决方案。它读取纯 Domino 视图的内容和设计,将其应用到 Flash UI 中(如图 1 所示)。本文假设您是有经验的 Flash 开发人员,具有 ActionScript 语言的知识,并熟悉 Lotus Notes/Domino 应用程序开发。
注意:本文的代码存放在名为 FlashNotesView.as 的外部 ActionScript 文件中。如果没有安装 Macromedia Flash,可以在文本编辑器中查看此代码。
图 1. FlashNotesView 最终结果预览
创建 UI 组件
Macromedia Flash 带有一个预定义的 UI 组件集。当然也可以使用 Macromedia Flash Exchange 添加更多组件。只需将这些组件拖放到一个平台上,或者使用代码在运行时创建某些类的实例,即可在 Macromedia Flash 中创建 UI。
假设您想在 Macromedia Flash 中创建类似平面 Lotus Notes 视图的视图。为此,请使用名为 DataGrid 的 UI 组件。要在运行时创建组件,必须在 Flash 影片开始时为 3 个 UI 组件导入类。这些类是 Label、List 和 DataGrid,导入它们的命令如下:
import mx.controls.Label;
import mx.controls.List;
import mx.controls.DataGrid;
导入所需的类之后,可以使用下面的 createClassObject 方法在运行时创建新的类实例:
lblSelectView = createClassObject(Label, "lblSelectView",
getNextHighestDepth()); lstSelectView= createClassObject(List,"lstSelectView",
getNextHighestDepth()); dgridView = createClassObject(DataGrid, "dgridView",
getNextHighestDepth());
|


|
回页首 |
|
准备数据提供程序
数据提供程序是在组件(如 List 和 DataGrid)中查看的数据的模型,理论上只是一个对象数组。使用 Array 类的 push 方法可以将新对象添加到数据提供程序中。该数组中的每个对象也称为数据提供程序中的项,每项在 List 或 DataGrid 组件中以单独的行显示。要定义显示在 List 组件中的数据,请使用以下代码:
var arrSelectViewDP = new Array();
arrSelectViewDP.push({label:"IBM Lotus software: Lotus Documentation",
data:"http://www.lotus.com/ldd/notesua.nsf/Date"});
在本文中,我们使用 Lotus Documentation site database (notesua.nsf) on developerWorks Lotus 中的 Domino 视图。


|
回页首 |
|
指定数据提供程序
List 组件的实例具有名为 dataProvider 的属性。要为 List 实例指定数据提供程序模型,请使用以下命令:
lstSelectView.dataProvider = arrSelectViewDP;
此命令将数据提供程序模型中的项填充到 List 组件中。现在,您已经设置好了 Flash 影片第一次运行时显示给用户的一切内容。在下面几节中,您将添加检索用户在 Flash 影片中的 List 组件中所选择的 Domino 视图的内容和设计所需的代码。(该 List 组件显示在图 1 中的 “Select view” 框中。)


|
回页首 |
|
以 XML 格式获取 Domino 视图的内容和设计
首先,必须检索 Domino 视图的内容。Lotus Domino 中有几个 URL 命令可用于此任务。例如,?OpenView、?OpenDocument、?OpenPage 和 ?ReadForm。但 ?ReadViewEntries 和 ?ReadDesign 是首选 URL 命令。
检索 Domino 视图的内容
使用 ?ReadViewEntries 可以用 XML 格式而不是预设格式检索视图中的内容。此检索的 URL 语法如下:
http://www.lotus.com/ldd/notesua.nsf/Date?ReadViewEntries
URL 结果如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Lotus-Domino (Release 7.0.1 - January 17, 2006 on Windows NT/Intel) -->
<viewentries toplevelentries="690">
<viewentry position="1" unid="E1EFAB2B58C8B68785257145005A41FC" noteid="86B6"
siblings="690">
<entrydata columnnumber="0" name="Date_Update">
<datetime>20060403</datetime>
</entrydata>
<entrydata columnnumber="1" name="Titles">
<text>Real-time access and data management for the intelligent
enterprise</text>
</entrydata>
<entrydata columnnumber="2" name="Language">
<text>English</text>
</entrydata>
</viewentry>
...
</viewentries>
|
检索 Domino 视图的设计
在这里向开发人员提供一条新闻:基本上未归档的 URL 命令 ?ReadDesign 允许您不仅检索视图的内容,还以 XML 格式检索视图的设计,即如何格式化视图列标题和行。检索设计的 URL 语法如下:
http://www.lotus.com/ldd/notesua.nsf/Date?ReadViewEntries
下面是 URL 结果:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Lotus-Domino (Release 7.0.1 - January 17, 2006 on Windows NT/Intel) -->
<viewdesign rowlines="3" direction="0" spacing="1" columns="3"
totalscolor="#808080">
<column columnnumber="0" width="80" name="Date_Update" title="Last updated"
sort="true" sortdescending="true" resortascending="true" format="2"
listseparator="none">
<cfont style="r" size="7" color="#000000" face="Helvetica" />
<hfont style="b" size="7" color="#000000" face="Helvetica" />
<numberformat digits="0" format="general" />
<datetimeformat show="date" date="yearmonthday" time="hourminutesecond"
zone="never" />
</column>
...
</viewdesign>
|
通过检索 Domino 视图的设计,就在 Lotus Notes 中具有了良好格式化的视图,并且字体设置和其他格式化也出现在 Flash UI 中。


|
回页首 |
|
创建 XML 对象
 |
在 Macromedia Flash 中处理 XML
可以在 Macromedia Flash 中使用 XML 类来忽略 XML 中的空白,并在完成从 data.xml 文件加载 XML 内容时显示一条消息。为此,请使用此脚本:
var xml = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success) {
if(success) trace("XML has successfully been loaded.");
}
xml.load("data.xml");
|
|
|
如何将 Domino 视图中获取的 XML 加载到 Macromedia Flash 中的 DataGrid 组件中呢?首先,必须有一个 XML 对象,用于通信和对发送到服务器的请求的响应进行处理。xmlView XML 对象包含服务器响应的 XML;由于不需要用户阅读所需的 XML 格式,所以您可以要求此对象忽略空白(参见侧栏 “在 Macromedia Flash 中处理 XML”)。
另外,还指定了一个当您从服务器获取 XML 结果时要执行的函数,如下所示:
var xmlView = new XML();
xmlView.ignoreWhite = true;
xmlView.onLoad = onXMLViewLoad;


|
回页首 |
|
检索视图内容
 |
检索视图设计
创建一个与名为 xmlViewDesign 的 xmlView 类似的附加 XML 对象。此对象具有从所选视图的设计中获得的 XML:
xmlViewDesign.load(strView+"?ReadDesign");
将此行添加到 XML 处理程序函数 xmlView 中,以便成功加载视图内容后加载设计。
|
|
在 Macromedia Flash 中加载 UI 时,调用 XML 对象的加载方法,初始化用户所选视图中的 XML 内容的加载, 如下所示:
xmlView.load(strView+"?ReadViewEntries");
strView 变量具有当前所选视图的 URL。


|
回页首 |
|
在 DataGrid 中填充视图内容
当收到 Domino 视图的 XML 内容时,后面的两个代码清单由于已放在 onXMLViewLoad 函数中而会执行。当您遍历结果时,可以使用一个临时数组来保存 XML 节点。
var arrView = arrViewRows=arrViewCols=[];
下一个代码清单遍历 XML 节点并创建一个临时的 objRow 对象,该对象由 Domino 视图每行的列内容填充。然后,objRow 对象附加到 DataGrid 组件的 dataProvider 属性中。
arrViewRows = xmlView.firstChild.childNodes;
for (var row = 0; row<(arrViewRows.length); row++) {
if (arrViewRows[row].nodeName == "viewentry") {
arrViewCols = arrViewRows[row].childNodes;
var objRow = new Object();
for (var col = (arrViewCols.length); col>=0; col--) {
if (arrViewCols[col].nodeName == "entrydata") {
objRow[arrViewCols[col].attributes.columnnumber] =
arrViewCols[col].firstChild.firstChild;
}
}
arrView.push(objRow);
}
}
dgridView.dataProvider = arrView;
// Clear datagrid column headers
for (var col = 0; col<(dgridView.columnCount); col++) {
var column = dgridView.getColumnAt(col);
column.headerText = "";
}
|
要获得清晰的表示,DataGrid 的列标题在此处被清除,并在以后应用视图设计时填充。


|
回页首 |
|
将视图设计应用于 DataGrid
要应用视图的设计设置,必须将此处显示的代码添加到 onXMLViewDesignLoad 函数中,获取 ?ReadDesign 命令的内容时将执行该函数。同样,遍历结果时使用一个临时数组来保存 XML 节点。
var arrViewCols = [];
arrViewCols = xmlViewDesign.firstChild.childNodes;
for (var col = 0; col<(arrViewCols.length); col++) {
if (arrViewCols[col].nodeName == "column") {
var column = dgridView.getColumnAt(col);
column.headerText = arrViewCols[col].attributes.title;
column.width = int(arrViewCols[col].attributes.width);
column.resizable = Boolean(arrViewCols[col].attributes.resize);
column.setStyle("fontSize",
int(arrViewCols[col].firstChild.nextSibling.attributes.size));
column.setStyle("fontFamily",
arrViewCols[col].firstChild.nextSibling.attributes.face);
column.setStyle("color",
arrViewCols[col].firstChild.nextSibling.attributes.color);
}
}
dgridView.redraw();
|
此代码遍历 XML 中定义的每一列,并将设置应用于 DataGrid 组件的列。它通过使用 setStyle 属性设置适当的层叠样式表 (CSS) 值来完成此操作。
此代码支持的视图设计的设计属性包括:
当然,通过添加代码以支持更多视图设计的属性,可以轻松地扩展此列表。


|
回页首 |
|
在新解决方案中实现 FlashNotesView.as
要在新 Flash 影片(例如 FlashNotesView_clean.fla 中包括的影片)开始时使用 FlashNotesView.as,可以在 Flash 影片的 Actions 窗格的第 1 帧中添加此行:
#include "FlashNotesView.as"
 |
FlashNotesView 解决方案的局限性
在当前状态下,提供的 FlashNotesView 版本不支持分类视图。此情况的一种解决方案是使用 TreeList 组件以层次结构显示文档。 |
|
接下来,将 Label、List 和 DataGrid 从 Components 窗格中拖动到平台上,然后删除平台上新创建的实例。这告诉您的 Flash 影片在将 Flash 文件编译成 Macromedia Flash Player 可播放的 ShockWave Flash (SWF) 格式时包括这些新添加的组件。由于实际代码位于外部 FlashNotesView.as ActionScript 文件中,因此以上是您在 Macromedia Flash 中需要做的所有事情。


|
回页首 |
|
自定义 FlashNotesView 解决方案
除更改 FlashNotesView.as 之外,必须使用 Macromedia Flash 将 Flash (FLA) 文件编译成 Macromedia Flash Player 可以播放的 SWF Flash 影片。首先,尝试自定义用户可选择的视图列表。可以轻松地在代码中更改此过程。例如,要从 Bob Balaban (Looseleaf) Forum 添加视图,只需添加以下代码即可,其中数据提供程序定义在开始部分:
arrSelectViewDP.push({label:"Bob Balaban (Looseleaf) Forum",
data:"http://www.looseleaf.net/Looseleaf/Forum.nsf/
8178b1c14b1e9b6b8525624f0062fe9f"});
注意:URL 必须排除任何现有 URL 命令,所以您在从 Web 复制您自己的 URL 时请从初始的 URL 删除 ?OpenView。
当您熟悉自定义此解决方案时,请考虑创建一个自定义类,用于扩展包含首选方法和属性的 DataGrid。


|
回页首 |
|
安全
如果测试提供的 FlashNotesView_final.swf Flash 影片时出现安全消息,请按照显示的指示以允许本地的 SWF 文件与外部地址通信。
随着 Macromedia Flash Player 8 的发布,有了更高的安全级别,即只允许 Flash 影片与同一域中的后台系统通信。要避免此问题,可以在后台服务器上创建一个 Flash 影片能与之通信的文本文件(叫做策略文件)。然后,将应该允许与当前服务器通信的域添加到该文本文件。
下面是一个位于 backendhost.com(它接受来自 clienthost.com 的请求)中的策略文件的示例:
<cross-domain-policy>
<allow-access-from domain="clienthost.com" />
</cross-domain-policy>
该策略文件的文件名是 crossdomain.xml。有关 Macromedia Flash Player 8 中增强的安全模型的详细信息,请参考 Adobe 文章 “Security Changes in Flash Player 8”。


|
回页首 |
|
结束语
这几年来,富 Internet 应用程序(即具有可以结合视频和声音的桌面应用程序的能力的基于 Flash 的 UI)已成为 Flash 开发的热门话题。这类应用程序也很可能与后台系统连接,向用户传递内容。
您可以将 Lotus Domino 服务器作为基于 Flash 的 UI 的后台系统,可以将用于 Domino 数据库的 HTML 文件中的 Flash 应用程序嵌入不同平台上的客户机计算机中。还可能将 Flash 应用程序编译成独立的可执行文件,管理员可以刻光盘并分发这些文件。光盘中的 Flash 应用程序保留了它与后台 Domino 服务器的连接,可在客户机计算机上通过 HTTP 来访问。这是 Macromedia Flash 用作基于 Domino 的解决方案中的单独表示层的一个优点。如果需要,可以轻松地将 Flash 应用程序应用到其他后台系统。


|
回页首 |
|
下载
| 描述 | 名字 | 大小 | 下载方法 |
| Flash ActionScript file |
FlashNotesView.as.zip |
2KB |
HTTP |
| Empty Flash file |
FlashNotesView_clean.fla.zip |
5KB |
HTTP |
| Finished Flash file with all code and components |
FlashNotesView_final.fla.zip |
194KB |
HTTP |
| Finished Flash movie |
FlashNotesView_final.swf.zip |
62KB |
HTTP |
|