XPages:使用postNewDocument填充代理中的字段

时间:2014-10-25 23:58:19

标签: xpages

我正在尝试使用旧的LotusScript代理预先填充XPage(创建新文档)上的某些字段。我在XPage上的代码是:

 <xp:dominoDocument var="document1"
        formName="myForm">
        <xp:this.postNewDocument><![CDATA[#{javascript:
            var agent = database.getAgent("MyAgent");
            document1.save();
            agent.runOnServer(document1.getNoteID());
            }]]></xp:this.postNewDocument>
</xp:dominoDocument>


<xp:inputText value="#{document1.fname}" id="fname"
            styleClass="formInputText">
            <xp:this.defaultValue><![CDATA[#{javascript:
                document1.getItemValueString("fname");}]]></xp:this.defaultValue>
</xp:inputText>

代理(本例)是:

Dim agent As NotesAgent
Dim db As NotesDatabase

Sub Initialize
    Dim rDoc As NotesDocument 

    Dim s As New NotesSession
    Set db = s.CurrentDatabase
    Set agent = s.CurrentAgent

    Set rDoc = db.GetDocumentByID(agent.Parameterdocid)

    rDoc.fname = "Barney"       
    rDoc.lname = "Rubble"
    Call rDoc.Save(True, True)

End Sub

我知道代理正在运行(如果我检查Notes客户端中的doc属性,代理日志会显示此信息并且文档上的字段已完成)但是XPage上的字段始终为空白?是否可以从LS代理预填充?我添加了document1.save(),所以我知道我得到了一个有效的NoteID传递(再次,它是相同的 - 通过记录检查) - 任何洞察感激地收到...

4 个答案:

答案 0 :(得分:5)

您可以将文档传递到代理程序运行中。将unid传递给代理上下文的方法不会让你到达那里。你需要

  agent.runwithDocumentContext(doc)

请参阅此处的示例:http://www.wissel.net/blog/d6plinks/SHWL-8SF7AH

请勿保存文档。您需要将代理重新编写为JavaBean。缩短处理时间。

我实际上会做什么:使用bean作为数据源,更容易处理验证,默认值等。

它的工作量比它看起来要少,它可以偿还一些技术债务(总是存在技术债务)。

<强>更新

我在示例应用程序中尝试过它。这是我的经纪人:

Sub Initialize
    Dim db As NotesDatabase
    Dim rDoc As NotesDocument 

    Dim s As New NotesSession
    Set db = s.CurrentDatabase

    Set rDoc = s.Documentcontext

    rDoc.fname = "Barney"       
    rDoc.lname = "Rubble"

End Sub

代码的两个主要区别:a)DocumentContext而不是parameterdocid和没有保存文档。

然后页面如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.data>
        <xp:dominoDocument var="document1" formName="person">
            <xp:this.postNewDocument><![CDATA[#{javascript:var agent = database.getAgent("Background");
var doc = document1.getDocument();
agent.runWithDocumentContext(doc);}]]></xp:this.postNewDocument>
        </xp:dominoDocument>
    </xp:this.data>
    <xp:label value="First name:" id="fName_Label1" for="fName1">
    </xp:label>
    <xp:inputText value="#{document1.fName}" id="fName1"></xp:inputText>
    <br />
    <xp:label value="Last name:" id="lName_Label1" for="lName1"></xp:label>
    <xp:inputText value="#{document1.lName}" id="lName1"></xp:inputText>
    <xp:button value="Save" id="button1"><xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="false" save="true"></xp:eventHandler></xp:button>
</xp:view>

这里的主要区别是:

  • 不保存文件
  • 没有默认值的种群
  • 使用DocumentContext调用代理

最后:代理必须设置为&#34;以网络用户身份运行&#34; (它可能已经存在)。就像一个魅力(我仍然会选择一个豆)。

答案 1 :(得分:1)

小心保存来自不同事件/来源的文档,就像处理代理一样。考虑将代理的代码重新编码为Xpage数据源的postNewDocument事件。您也可以在那里设置值。如果要在创建新文档时计算字段,可以通过设置postNewDocument事件中的值来实现此目的:

datasourceName.setValue("fieldName", "value")

答案 2 :(得分:1)

在XPage中没有获取代理设置的字段的原因是代理运行太晚&#34;。 XPage字段已由空的新值设置。似乎,代理执行后没有简单的方法来刷新数据源。

所以,我建议创建一个额外的XPage(&#34; XAgent&#34;)&#34; MyFormNew.xsp&#34;其中:

  • 创建文档,
  • 运行代理以设置该文档中的值和
  • 使用documentId作为参数将strait重定向到原始XPage。

额外的XPage可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    rendered="false">
    <xp:this.beforePageLoad><![CDATA[#{javascript:
            var doc:NotesDocument = database.createDocument();
            doc.replaceItemValue("form", "myForm");
            doc.save();
            var agent = database.getAgent("MyAgent");
            agent.runOnServer(doc.getNoteID());
            var pageUrl = "MyForm.xsp?action=editDocument&documentId=" + 
                                               doc.getUniversalID().toString();
            context.redirectToPage(pageUrl);
            }]]></xp:this.beforePageLoad>
</xp:view>

原始XPage中的数据源不再需要postNewDocument事件。

这是一个快速而又脏的解决方案,可以保留您的LotusScript代理(正如您在评论中指出的那样)。

答案 3 :(得分:0)

一切都与时俱进。我正在使用这个:

<xp:this.beforePageLoad><![CDATA[#{javascript:var     tempdoc:NotesDocument=compositeData.WFDoc.getDocument(true)
if (tempdoc.isNewNote())
{
var agent:NotesAgent=database.getAgent("(A_WF)")
  if(agent!=null)
  {
      agent.runWithDocumentContext(tempdoc)
  }
}
}]]></xp:this.beforePageLoad>

通过使用before pageload事件,您可以在某些内容可能来自xpage本身之前设置文档。您甚至不必将文档保存在代理中。

使用这种方法,您可以保留当前文档,而不必使用ibm建议的任何临时文档。