xpages:什么可以在保存页面时停止代码?
xpages: what can stop code stop while saving a page?
最后更新:问题的根源已确定
我有一个基于表单的页面,该表单已从应用程序的先前版本中剥离了大部分计算字段(因此文档实际上可以通过 computewithform 函数),我在保存文档时遇到了问题。我有在 Notes 客户端(以前的应用程序版本)中创建的文档,这些文档已转换为 mime,还有一些文档是在新的 xpages 应用程序中使用 CKEditor 创建的,保存在标记为存储为的富文本字段中MIME 也是。
我有一个 "publish" 文档的按钮。该代码适用于在新应用程序中创建的文档,但它似乎在某个地方停止了在以前的应用程序版本中创建的文档。
就 HTTP 流量而言,IE 陷阱如下:
A case that works:
/mydb.nsf/page.xsp?action=editDocument&documentId=353B2 HTTP POST 302 244 B 218 ms cliquer 0 31 0 187 0 1761
/mydb.nsf/xPublish?OpenAgent&docid=487A3447CFA36BF085257EE400626485 HTTP GET 302 190 B 141 ms cliquer 218 16 125 0 0 1620
http://myserver.com/mydb.nsf/dx/test_13col00 HTTP GET 200 text/html 55.71 Ko 312 ms cliquer 359 0 0 32 0 1308
A case that doesn't work:
http://myserver.com/mydb.nsf/page.xsp?action=editDocument&documentId=353BA HTTP POST 302 244 B 188 ms cliquer 0 32 0 156 0 156
/mydb.nsf/xPublish?OpenAgent&docid=E0E13322928B8F9685257EE400628B0A HTTP (Abandonned) 193 B < 1 ms cliquer 188 0 0 0 0 156
"Publish"按钮中的代码是:
//set status
if(getComponent("publishLater1").getValue() == "1") {
pageDocument.replaceItemValue("status", "Scheduled Publication");
} else {
pageDocument.replaceItemValue("status", "To Be Published");
}
//so we know the document has been saved (for drafts, when cancelled)
pageDocument.replaceItemValue("hasBeenSaved", "1");
//init some fields (res_title, ...)
if(!(pageDocument.hasItem("res_title")) || pageDocument.getItemValueString("res_title")==""){
pageDocument.replaceItemValue("res_title", buildResTitle(pageDocument.getItemValueString("subject")));
}
//set VERKEY AND VERNUMBER if not already set
if(pageDocument.getItemValueString("VERKEY")==""){
pageDocument.replaceItemValue("VERKEY", @Unique());
}
if(pageDocument.getItemValueString("VERNUMBER")==""){
pageDocument.replaceItemValue("VERNUMBER", 1);
}
//save pageDocument
pageDocument.save();
//send to publish agent
//remove the lock doc
//unlockDoc(pageDocument.getDocument().getUniversalID());
//for scheduled publications, a LotusScript agent will do the work
var res=facesContext.getExternalContext().getResponse();
if(getComponent("publishLater1").getValue() == "0") {
// Now load the publish Agent
var baseUrl = @Left(facesContext.getExternalContext().getRequestContextPath(),".nsf") + ".nsf/";
facesContext.getExternalContext().redirect(baseUrl + "xPublish?OpenAgent&docid=" + pageDocument.getDocument().getUniversalID());
//res.sendRedirect(xPublish?OpenAgent&docid=" + pageDocument.getDocument().getUniversalID(), false);
} else {
//send to the drafts view, to show it has the clock icon in the draft view
context.redirectToPage("adminDrafts.xsp");
}
我将省略称为 (xPublish) 的 LotusScript 代理的细节,但该代码中的重定向是这样完成的:
Print "Location:" + db.Filepath + "/dx/" + res_title
根据 IE 的 http 日志,运行 按钮中的代码似乎有些不对劲,它导致 http post 被放弃,因此调用LotusScript 代理也被放弃,不会将用户重定向到新发布的页面。相反,用户被重定向到此 URL:
http://myserver.com/mydb.nsf/page.xsp?action=editDocument&documentId=353BA
这里最大的问题是这个页面(草稿版)在LotusScript代理中被删除了,所以URL给出了一个错误页面。
如果您想知道为什么发布代码在 LotusScipt 中,那是因为我们还有一个每天运行并发布 "scheduled publications" 设置为将来发布的预定代理。这是为了避免必须同时维护 SSJS 和 LotusScript 代码。
有什么线索可以解释为什么会这样吗?
更新
好的,看起来代码工作正常,但 LotusScript 代理中的重定向没有完成这项工作。这是我用来重定向到刚刚发布的页面的内容:
Print "Location: http://ourserver.com/mydb.nsf/dx/" + res_title
它曾一度运行良好,但现在似乎出现了问题。有趣的是,代理可以很好地处理我们从头开始创建的文档,但不适用于在以前版本的应用程序中创建的文档……仍然不知道如何解决这个问题。从 LotusScript 为 xpages 做重定向的方法是什么?
好的,我明白了。它仍然有点奇怪,因为它 运行 对于新文档可以,但对于在以前版本的应用程序中创建的文档则不行,但我以错误的方式调用了 LotusScript 代理。
通过查看它在 IBM Wiki 模板中是如何完成的,我注意到他们以不同的方式调用 LotusScript 代理,我尝试了那个。结果证明效果很好:调用代码并进行重定向没有任何问题。
这是我现在打电话给我的代理人并进行重定向的方式:
var agent = database.getAgent("xPublish");
var res = facesContext.getExternalContext().getResponse();
agent.runOnServer(pageDocument.getNoteID());
res.sendRedirect(@Left(facesContext.getExternalContext().getRequestContextPath(),".nsf")+".nsf/dx/"+pageDocument.getItemValueString("res_title"));
正如我所说,不确定为什么我的原始代码停止工作,并且只有在以前版本的应用程序中创建的文档有问题,但新代码始终适用于所有文档。如果 IBM 这样做,我想这可能是正确的方法。
那个 wiki 应用程序里面有很多代码!查看它以获得一些有价值的代码片段或获得灵感!!!
最后更新:问题的根源已确定
我有一个基于表单的页面,该表单已从应用程序的先前版本中剥离了大部分计算字段(因此文档实际上可以通过 computewithform 函数),我在保存文档时遇到了问题。我有在 Notes 客户端(以前的应用程序版本)中创建的文档,这些文档已转换为 mime,还有一些文档是在新的 xpages 应用程序中使用 CKEditor 创建的,保存在标记为存储为的富文本字段中MIME 也是。
我有一个 "publish" 文档的按钮。该代码适用于在新应用程序中创建的文档,但它似乎在某个地方停止了在以前的应用程序版本中创建的文档。
就 HTTP 流量而言,IE 陷阱如下:
A case that works:
/mydb.nsf/page.xsp?action=editDocument&documentId=353B2 HTTP POST 302 244 B 218 ms cliquer 0 31 0 187 0 1761
/mydb.nsf/xPublish?OpenAgent&docid=487A3447CFA36BF085257EE400626485 HTTP GET 302 190 B 141 ms cliquer 218 16 125 0 0 1620
http://myserver.com/mydb.nsf/dx/test_13col00 HTTP GET 200 text/html 55.71 Ko 312 ms cliquer 359 0 0 32 0 1308
A case that doesn't work:
http://myserver.com/mydb.nsf/page.xsp?action=editDocument&documentId=353BA HTTP POST 302 244 B 188 ms cliquer 0 32 0 156 0 156
/mydb.nsf/xPublish?OpenAgent&docid=E0E13322928B8F9685257EE400628B0A HTTP (Abandonned) 193 B < 1 ms cliquer 188 0 0 0 0 156
"Publish"按钮中的代码是:
//set status
if(getComponent("publishLater1").getValue() == "1") {
pageDocument.replaceItemValue("status", "Scheduled Publication");
} else {
pageDocument.replaceItemValue("status", "To Be Published");
}
//so we know the document has been saved (for drafts, when cancelled)
pageDocument.replaceItemValue("hasBeenSaved", "1");
//init some fields (res_title, ...)
if(!(pageDocument.hasItem("res_title")) || pageDocument.getItemValueString("res_title")==""){
pageDocument.replaceItemValue("res_title", buildResTitle(pageDocument.getItemValueString("subject")));
}
//set VERKEY AND VERNUMBER if not already set
if(pageDocument.getItemValueString("VERKEY")==""){
pageDocument.replaceItemValue("VERKEY", @Unique());
}
if(pageDocument.getItemValueString("VERNUMBER")==""){
pageDocument.replaceItemValue("VERNUMBER", 1);
}
//save pageDocument
pageDocument.save();
//send to publish agent
//remove the lock doc
//unlockDoc(pageDocument.getDocument().getUniversalID());
//for scheduled publications, a LotusScript agent will do the work
var res=facesContext.getExternalContext().getResponse();
if(getComponent("publishLater1").getValue() == "0") {
// Now load the publish Agent
var baseUrl = @Left(facesContext.getExternalContext().getRequestContextPath(),".nsf") + ".nsf/";
facesContext.getExternalContext().redirect(baseUrl + "xPublish?OpenAgent&docid=" + pageDocument.getDocument().getUniversalID());
//res.sendRedirect(xPublish?OpenAgent&docid=" + pageDocument.getDocument().getUniversalID(), false);
} else {
//send to the drafts view, to show it has the clock icon in the draft view
context.redirectToPage("adminDrafts.xsp");
}
我将省略称为 (xPublish) 的 LotusScript 代理的细节,但该代码中的重定向是这样完成的:
Print "Location:" + db.Filepath + "/dx/" + res_title
根据 IE 的 http 日志,运行 按钮中的代码似乎有些不对劲,它导致 http post 被放弃,因此调用LotusScript 代理也被放弃,不会将用户重定向到新发布的页面。相反,用户被重定向到此 URL:
http://myserver.com/mydb.nsf/page.xsp?action=editDocument&documentId=353BA
这里最大的问题是这个页面(草稿版)在LotusScript代理中被删除了,所以URL给出了一个错误页面。
如果您想知道为什么发布代码在 LotusScipt 中,那是因为我们还有一个每天运行并发布 "scheduled publications" 设置为将来发布的预定代理。这是为了避免必须同时维护 SSJS 和 LotusScript 代码。
有什么线索可以解释为什么会这样吗?
更新
好的,看起来代码工作正常,但 LotusScript 代理中的重定向没有完成这项工作。这是我用来重定向到刚刚发布的页面的内容:
Print "Location: http://ourserver.com/mydb.nsf/dx/" + res_title
它曾一度运行良好,但现在似乎出现了问题。有趣的是,代理可以很好地处理我们从头开始创建的文档,但不适用于在以前版本的应用程序中创建的文档……仍然不知道如何解决这个问题。从 LotusScript 为 xpages 做重定向的方法是什么?
好的,我明白了。它仍然有点奇怪,因为它 运行 对于新文档可以,但对于在以前版本的应用程序中创建的文档则不行,但我以错误的方式调用了 LotusScript 代理。
通过查看它在 IBM Wiki 模板中是如何完成的,我注意到他们以不同的方式调用 LotusScript 代理,我尝试了那个。结果证明效果很好:调用代码并进行重定向没有任何问题。
这是我现在打电话给我的代理人并进行重定向的方式:
var agent = database.getAgent("xPublish");
var res = facesContext.getExternalContext().getResponse();
agent.runOnServer(pageDocument.getNoteID());
res.sendRedirect(@Left(facesContext.getExternalContext().getRequestContextPath(),".nsf")+".nsf/dx/"+pageDocument.getItemValueString("res_title"));
正如我所说,不确定为什么我的原始代码停止工作,并且只有在以前版本的应用程序中创建的文档有问题,但新代码始终适用于所有文档。如果 IBM 这样做,我想这可能是正确的方法。
那个 wiki 应用程序里面有很多代码!查看它以获得一些有价值的代码片段或获得灵感!!!