如何在 Notes 客户端中通过 XML 使用 Dojo 数据网格

How to use the Dojo Data Grid with XML in the Notes Client

我的客户希望能够跨多个数据库进行搜索,然后能够对数据进行筛选和排序。我希望通过 XML 输入来使用 Dojo 增强型数据网格。这样我就可以在后端编译所有结果,然后将它们作为一个整体呈现给网格。

我试过很多示例,它们似乎都可以在浏览器中运行,但不能在 Notes 客户端中运行。不幸的是,这是一个 Notes 客户端应用程序。

我一直在使用 Texas BBQ 应用程序作为测试,因为所有数据都包含在该应用程序中。我发现这个:

NotesIn9 92:在 XPages 中使用 Dojo 增强型数据网格,作者:Paul Calhoun http://www.notesin9.com/2012/12/03/notesin9-092-using-the-dojo-enhanced-data-grid-in-xpages/

我已经能够让 "Dojo Enhanced Data Grid with XML Data Source" 加载 Dojo 控件,但我只是 "Sorry, an error occurred" 数据应该在的地方。

这是来自 Notes in 9 的德州烧烤 link。 http://www.nnsu.com/nnsusite.nsf/Download.xsp?documentId=5EB484B0C31CC83886257B59006DA42A&action=openDocument

如果我能让它工作,那将是一个非常有用的工具,因为我必须尽快开始查看存档,并将使用它来合并我的搜索结果。

我正在使用 Domino 9.0.1 FP5 服务器和 Notes 9.0.1 FP9 客户端。

如有任何帮助,我们将不胜感激。

Notes 客户端结果页面图片:

Notes 客户端使用旧版本的 Firefox 引擎。查看此文档以进行比较:

https://iwonthemove.wordpress.com/2013/03/14/how-to-get-a-proper-javascript-debugger-in-xpinc/

(最新版本可能较新,但您明白了。此演示文稿:

https://www.slideshare.net/ddrschiw/ad108

描述 XPiNC(Notes 客户端中的 XPages)。幻灯片 21 显示了允许访问源的客户端工具栏。幻灯片 22 谈论调试。

更新

你还想看看 Firebug light,它会告诉你最终的 JS 错误。有关详细信息,请参阅此 post:https://www.mindoo.com/web/blog.nsf/dx/02.02.2012162412KLEL3Q.htm

/更新

希望对您有所帮助。

顺便说一句。我不会使用 GUI 工具 (Dojo Grid) 来查询不同的来源。而是使用托管 bean 和 1:1 连接 Grid - Bean。

我设法将问题追溯到数据存储的实际调用。如果您使用 BBQ 示例,Paul 使用单独的 Xpage 来形成 XML 输入并在他的代码中将其称为 URL 引用:

var strURL = "/DanF/TexasBBQ_DGO.nsf/BBQXML_NC.xsp"
var xmlStore = new dojox.data.XmlStore({ url: strURL });

这在 Notes 客户端中不起作用!

我的解决方案是在同一页面上使用 XML restService 来构建输入。这使页面更加独立,Notes 客户端能够一次性构建页面。

这是我的最终结果的 Xpage: (您需要将数据存储的 URL 指向您自己的 Xpage)

<xp:this.resources>
    <xp:dojoModule name="dojox.data.XmlStore"></xp:dojoModule>

    <xp:dojoModule name="dojox.grid.EnhancedGrid"></xp:dojoModule>
    <xp:dojoModule name="dojox.grid.enhanced.plugins.DnD"></xp:dojoModule>
    <xp:dojoModule name="dojox.grid.enhanced.plugins.NestedSorting"></xp:dojoModule>
    <xp:dojoModule name="dojox.grid.enhanced.plugins.IndirectSelection"></xp:dojoModule>
    <xp:dojoModule name="dojox.grid.enhanced.plugins.Filter"></xp:dojoModule>

    <xp:styleSheet href="/.ibmxspres/dojoroot/dijit/themes/dijit.css"></xp:styleSheet>
    <xp:styleSheet href="/.ibmxspres/dojoroot/dojox/grid/resources/Grid.css"></xp:styleSheet>
    <xp:styleSheet href="/.ibmxspres/dojoroot/dojox/grid/resources/tundraGrid.css"></xp:styleSheet>
    <xp:styleSheet href="/.ibmxspres/dojoroot/dojox/grid/enhanced/resources/EnhancedGrid.css"></xp:styleSheet>
    <xp:styleSheet href="/.ibmxspres/dojoroot/dojox/grid/enhanced/resources/tundraEnhancedGrid.css"></xp:styleSheet>
</xp:this.resources>

<xe:restService id="restService1" pathInfo="xmlStore">
    <xe:this.service>
        <xe:customRestService contentType="text/xml">
            <xe:this.doGet><![CDATA[#{javascript:
// initials xmlStore
var strXmlStore:String = "";

strXmlStore = "<?xml version='1.0' ?>" ;
strXmlStore = strXmlStore + "<joints>" ;

//Get the current application
var db = database;
//Access the People View
var pview:NotesView = db.getView("joints");
//Create Variables to hold the Documents and get the first document
var doc:NotesDocument;
var ndoc:NotesDocument;
doc = pview.getFirstDocument();
var nam:NotesName;
//Create a while loop to process the document in the View
while (doc != null) {
    strXmlStore = strXmlStore + "<joint>";
    strXmlStore = strXmlStore + "<name>";
    strXmlStore = strXmlStore + doc.getItemValueString("Name");
    strXmlStore = strXmlStore + "</name>";
    strXmlStore = strXmlStore + "<city>";
    strXmlStore = strXmlStore + doc.getItemValueString("City");
    strXmlStore = strXmlStore + "</city>";
    strXmlStore = strXmlStore + "<url>";
    strXmlStore = strXmlStore + doc.getItemValueString("URL");
    strXmlStore = strXmlStore + "</url>";
    strXmlStore = strXmlStore + "<description>";
    strXmlStore = strXmlStore + doc.getItemValueString("Description");
    strXmlStore = strXmlStore + "</description>";
strXmlStore = strXmlStore + "</joint>";
//Get the next document in the view and store to the placeholder
ndoc = pview.getNextDocument(doc);
//recycle the doc object to preserve memory
doc.recycle();
//set the doc object equal to the placeholder
doc = ndoc;
}
//close the root tag
strXmlStore = strXmlStore + "</joints>";

return strXmlStore}]]></xe:this.doGet>
        </xe:customRestService>
    </xe:this.service>
</xe:restService>

<xp:panel style="text-align:center;font-family:Comic Sans MS;font-size:16pt"
    disableTheme="true">
    <xp:label
        value="Dojo Enhanced Data Grid With XML Data Source thru Rest Service"
        id="label2"></xp:label>
</xp:panel>
<xp:br />
<xp:panel id="gridNode" styleClass="DemoLeft" tagName="div"
    style="height:30em;width:42em">
</xp:panel>
<xp:eventHandler event="onClientLoad" submit="false">
    <xp:this.script><![CDATA[
var xmlStore = new dojox.data.XmlStore({ url: "Simple_XML.xsp/xmlStore" });
var grid = null;

dojo.addOnLoad(function(){

var layout = [{
defaultCell: { editable: false, type: dojox.grid.cells._Widget },

rows:[
    { field: "name", name: "Name", width: 20 },
    { field: "city", name: "City", width: 20 },
    { field: "url", name: "Web Site", width: 20,formatter: formatHTML },
    { field: "description", name: "Description",width:80}
]
}];

function formatHTML(url, rowIndex){
    if(url.firstChild != null || url !=""){
        var linkVal =  "<a target='_blank' href='"+url+"'>Web Site</a>";
        return linkVal;
    } else{
        return "";
    }
}           

grid = new dojox.grid.EnhancedGrid({
    query: { name: '*' },
    store: xmlStore,
    structure: layout,
    autoHeight:25,              
    plugins:{nestedSorting: true, dnd: true,filter:true}
}, '#{id:gridNode}');

grid.startup();
});
]]></xp:this.script>
</xp:eventHandler>

</xp:view>