您要做的第一件事是确认。与 Lotusscript 不同,您不能在脚本中间使用函数来打开确认对话框并获得答案。为此,我建议在执行脚本简单操作之前使用确认简单操作。
<xp:button
value="delete"
id="button1"
>
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<xp:actionGroup>
<xp:confirm message="Are you certain?"></xp:confirm>
<xp:executeScript
script="#{javascript:doSomething();}"
>
</xp:executeScript>
</xp:actionGroup>
</xp:this.action></xp:eventHandler></xp:button>
编辑
过去,我还使用扩展库构建了自己的对话框,用 SSJS 填充文本,然后从对话框本身调用 doWhatever() 或 close()。这不是最好的解决方案,因为它需要从服务器更新才能获取字符串。正如 Paul Withers 所说,最好的解决方案是使用 CSJS 来执行确认。不过我还没有这样做。
/EDIT
对于您的删除功能,我建议获取您要删除的文档,然后通过表单名称或您使用的任何机制判断它是 P- 还是 C- doc,然后删除单个文档或通过使用 getAllDocumentsBykey() 从视图中获取文档集合,然后遍历它们,一一删除。
var ky:java.util.Vector = new java.util.Vector();
ky.add("MainCat");
ky.add("subCat");
ky.add("subCat2");
var vw:NotesView = database.getView("vw_myView");
var docs:NotesDocumentCollection = vw.getAllDocumentsByKey(ky);
//... delete stuff...
//dont forget to recycle
发布问题编辑
我建议使用以下方法来获取表单名称:
var getSelectedDoc = function(){
var vwPnl = getComponent("viewpanel");
var ids = vwPnl.getSelectedIds();
var id = null;
var doc:NotesDocument = null;
if(ids.length > 0){ //could use for loop var i = 0; i < ids.length;i++
id = ids[0]; //could pack all ids into java.util.ArrayList and return that list to work on further
//be warned that if the user selects a parent doc and those automatically deleted by it that you need a mechanism to check if the document was already deleted!
}
if(id != null){
doc = database.getDocumentByID(id);
}
return doc;
}
var doc = getSelectedDoc();
var formName = (doc == null)? null : doc.getItemValueString("form");
if(PDOC_FORM_NAME.equalsIgnoreCase(formName)){
deleteFunctionComplete(doc);
} else if (CDOC_FORM_NAME.equalsIgnoreCase(formName)){
deleteFunctionTwo(doc);
} else {
// uh-oh
}
这还允许您拥有该文档,以防您想立即删除它。
对 cmets 的修改
如果 Cdoc 应该删除多个文档,那么可以。您应该使用 getAllDocumentsBykey 记住需要为它构建视图。我的意思是如果你有一个单一类别的视图,没有问题,只需插入字符串就可以了。如果您有一个包含三个类别的视图,则不能将向量输入到只有两个值的 getalldocs 函数中,它必须是全部三个。因此,如果视图如下所示,您想删除所有“mycomp”以及底层 pdocs "Greg" "Sally "Bob",只需使用 alldocsbykey("mycomp"):
mycomp
---格雷格
---莎莉
---鲍勃
但如果视图看起来像
波兰
---mycomp
------格雷格
------莎莉
------鲍勃
那么必须使用带有 poland 和 mycomp 的 a 向量。 “波兰”没有得到正确的文件。 -- 只是有时存在的一个仅供参考和陷阱。
在进一步澄清问题后进行编辑
我更喜欢这种循环样式来删除文档
var doc_temp:NotesDocument = null;
var doc_toDelete:NotesDocument = null;
var coll_docs:NotesDocumentCollection = ...; //get document collection
var doc_nextDoc = coll_docs.getFirstDocument();
while(doc_nextDoc != null){
doc_temp = doc_nextDoc; //set document to delete
doc_nextDoc = coll_docs.getNextDocument(doc_nextDoc); // set next document before deletion
try{
doc_temp.remove(true);//lots of errors can happen here, such as ACL settings
} catch(e) {
//handle, or just break
} finally{
if(doc_temp != null) try{doc_temp.recycle()} catch(e){}// try to recycle, could also cause errors
doc_temp = null;// for the sense of completeness
}
}
根据问题编辑进一步编辑
当然,您只是删除了一个 Pdoc,按照您的设置方式,您只会返回一个文档。您可以扩展 getSelectedDoc() 以将所有选定的文档放入 java.util.ArrayList 或其他东西中,然后使用该数组列表一次删除多个,但这可能很危险,具体取决于您的操作,因为 NotesDocuments 不是可序列化的。在这种情况下,我建议使用与 getSelected doc 相同的代码,使用 for 循环获取文档 ID,获取文档,如果文档不为空,则删除。
apropos getAllDocumentsByKey(带有向量)
目前的设置方式,不需要 Vector。
如果您有一个包含类别和子类别的视图,并且您想要获取该子类别中的所有文档,那么您必须使用向量来获取它。如果包含一个简单的字符串或只有一个值的向量,则不会返回子类别中的文档。向量可以认为是“cat1”、“subcat”、“furtherSubCat”
此外,这里没有检查从文档返回的字符串是否为空。应该这样做。也没有检查 DocumentCollection 是否为空。这也应该这样做。我的预期是,基于上述原因检索集合时会出现问题。