如何实现“另存为新”功能

时间:2014-09-30 14:58:35

标签: xpages

我希望实现一个"另存为新的"按钮。这本质上将采用现有文档并使用所有现有字段创建文档的新副本。这需要从文档而不是viewPanel实现。

4 个答案:

答案 0 :(得分:3)

  1. 在函数调用中传递NotesDocument或NotesXspDocument(sourceDoc),或者根据您的特定需要进行定义。
  2. 在目标notesDatabase中创建一个新的NotesDocument(newDoc)。
  3. 将sourceDoc.copyAllItems()用于newDoc。
  4. 保存并 - 如果需要 - 重定向到newDoc。
  5. 我的CMS中有“服务”功能,允许作者使用以下SSJS创建“服务”的副本:

    var service = {
    ...
      duplicate : function(thisDoc:NotesXspDocument) {
        try {
            var newDoc:NotesDocument = database.createDocument();
            thisDoc.getDocument().copyAllItems(newDoc, true);
            var newId = newDoc.getItemValueString("id") + "-" + session.evaluate("@Unique").elementAt(0) + "-DUPLICATE";
            newDoc.replaceItemValue("id", newId);
            newDoc.save(true);
    
            context.redirectToPage("/service.xsp?id=" + newId + "&");
    
        } catch(e) {
            print(database.getTitle() + " SSJS Error for service.duplicate()");
            print(e.toString());
        }
      }
    }
    

    现在,我读取了dataSources中的ID,这就是我传递newId值的原因。如果您正在使用开箱即用的dataSource设置,则需要将其更改为getUniversalID()并将URL参数设置为“?action = openDocument& documentId =”。

    [edit] - 这是适用于标准数据源的脚本

    var newDoc:NotesDocument = database.createDocument();
        currentDocument.getDocument().copyAllItems(newDoc, true);
    
        newDoc.save(true);
        var newId = newDoc.getUniversalID();
        context.redirectToPage("/entry.xsp/%24%24OpenDominoDocument.xsp?     documentId="+@Text(newId)+"&action=editDocument");
    

    [编辑](Chris Toohey):我将“document1”更改为“currentDocument”以更好地支持相对本地/当前的NotesDocument dataSource(因为有人可以从“document1”更改默认的dataSource名称,并且建议的编辑代码将不会“工作)。

答案 1 :(得分:2)

NotesDatabase.createDocument()NotesDocument.copyAllItems(destDoc)应该提供功能(或相应的Java等价物)。它比NotesDocument.copyToDatabase()

表现更好

答案 2 :(得分:0)

答案 3 :(得分:0)

不确定这是否可以在XPage下运行,但如果文档包含' $ VerOpt' notesItem(字段名称)中包含有效设置(例如:" 2")数据库可能会为您创建新副本。您必须根据需要安排设置/清除值。如果您想创建新版本'在每次保存时,表单都有一个默认属性,您可以设置一个设置。搜索此保留的字段名以获取详细信息。