|
|
## Dokument Neuanlage / Template Auswahl
|
|
|
Um die direkte Neuanlage von Dokumenten über OnlyOffice im RichClient zu unterstützen, muss der RunScript angepasst/angelegt werden:
|
|
|
|
|
|
Prinzipiel ruft der Microservice den `krn.RunScript` mit den folgenden Parametern auf:
|
|
|
* ID (int) - Objekt ID
|
|
|
* typeId (int) - Objekt Typ ID
|
|
|
* user (string) - Benutzer der den Job ausführt
|
|
|
* method (string) - GetTemplates bzw. SelectTemplate
|
|
|
* templateId (string) - ID des Templates (nur bei SelectTemplate)
|
|
|
|
|
|
### Methoden
|
|
|
Die Neuanlage erfolgt immer über zwei Schritte. Als erstes werden über GetTemplates die verfügbaren Templates abgerufen.
|
|
|
Wenn der Benutzer eine Vorlage ausgewählt hat, so wird diese per SelectTemplate selektiert. Im Event wird dann die Vorlagendatei in die Fundstelle kopiert.
|
|
|
|
|
|
#### GetTemplates
|
|
|
Diese Methode muss die verfügbaren Vorlagen als XML zurückliefern. Das XML muss wie folgt aussehen:
|
|
|
|
|
|
```xml
|
|
|
<templates>
|
|
|
<template id="1" name="Allgemeiner Vertrag" namespace="Vertragsvorlagen" type="text" extension="docx" />
|
|
|
</templates>
|
|
|
```
|
|
|
Das XML wird über den Parameter `Templates` zurückgegeben.
|
|
|
|
|
|
#### SelectTemplate
|
|
|
Die Methode SelectTemplate wird ausgelöst, wenn der Benutzer eine Vorlage ausgewählt hat.
|
|
|
Als Parameter wird die ID des Templates (siehe xml) mitgesendet. Der Update der Fundstelle wird vom Server Event realisiert.
|
|
|
|
|
|
Die Methode muss als Rückgabe den Erfolg / Misserfolg im Parameter Status als Boolean zurückgeben.
|
|
|
|
|
|
|
|
|
## Beispiel Vorlagenverwaltung von enaio
|
|
|
|
|
|
Dieses Beispiel stellt die normale Vorlagenverwaltung von enaio da.
|
|
|
### Server Event
|
|
|
|
|
|
```VB
|
|
|
Function Main
|
|
|
' Read Request Parameter
|
|
|
Dim ID: ID = RC.InputParams.Value("id")
|
|
|
Dim TypeId: TypeId = RC.InputParams.Value("typeId")
|
|
|
Dim User: User = RC.InputParams.Value("user")
|
|
|
Dim TemplateId: TemplateId = RC.InputParams.Value("templateId")
|
|
|
Dim Method: Method = RC.InputParams.Value("method")
|
|
|
|
|
|
' Exit Function If no Method was set
|
|
|
If Method = "" Then
|
|
|
RC.Logger.Error "Missing Method Parameter"
|
|
|
Exit Function
|
|
|
End If
|
|
|
|
|
|
' Execute Method
|
|
|
Select Case Method
|
|
|
Case "GetTemplates"
|
|
|
Dim Templates : Set Templates = GetTemplates(ID, TypeId, User)
|
|
|
RC.OutputParams.Value("Templates") = Templates
|
|
|
Case "SelectTemplate"
|
|
|
Dim Status : Status = SelectTemplate(ID, TypeId, User, TemplateId)
|
|
|
RC.OutputParams.Value("Status") = Status
|
|
|
Case Else
|
|
|
RC.Helper.Error "Unknown Method " & Method
|
|
|
Exit Function
|
|
|
End Select
|
|
|
End Function
|
|
|
|
|
|
Function GetTemplates(ID, TypeId, User)
|
|
|
Dim Templates: Set Templates = StdGetTemplates(TypeId, User)
|
|
|
|
|
|
Dim DOM : Set DOM = CreateObject("MSXML2.DOMDocument")
|
|
|
DOM.documentElement = DOM.createElement("Templates")
|
|
|
|
|
|
For Each Template In Templates
|
|
|
Dim TemplateElement: Set TemplateElement = DOM.createElement("Template")
|
|
|
|
|
|
Dim FileType
|
|
|
Select Case Template("Extension")
|
|
|
Case "docx"
|
|
|
FileType = "text"
|
|
|
Case "xlsx"
|
|
|
FileType = "sheet"
|
|
|
Case "pptx"
|
|
|
FileType = "presentation"
|
|
|
End Select
|
|
|
|
|
|
TemplateElement.setAttribute "id", Template("TemplateId")
|
|
|
TemplateElement.setAttribute "name", Template("Aliase")
|
|
|
TemplateElement.setAttribute "namespace", Template("NameSpace")
|
|
|
TemplateElement.setAttribute "type", FileType
|
|
|
TemplateElement.setAttribute "extension", Template("Extension")
|
|
|
DOM.documentElement.appendChild TemplateElement
|
|
|
Next
|
|
|
|
|
|
Set GetTemplates = DOM
|
|
|
End Function
|
|
|
|
|
|
Function SelectTemplate(ID, TypeId, User, TemplateId)
|
|
|
Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
|
|
|
|
|
|
Dim Templates: Set Templates = StdGetTemplates(TypeId, User)
|
|
|
SelectTemplate = false
|
|
|
For Each Template In Templates
|
|
|
If CStr(TemplateId) = CStr(Template("TemplateId")) Then
|
|
|
Dim FilePath: FilePath = RC.ServerData.ConfDir & "\Templates\" & template("FileName")
|
|
|
FSO.CopyFile FilePath, RC.ServerData.TempDir
|
|
|
UpdateFile ID, TypeId, RC.ServerData.TempDir & "\" & template("FileName")
|
|
|
SelectTemplate = true
|
|
|
End If
|
|
|
Next
|
|
|
End Function
|
|
|
|
|
|
function UpdateFile(ObjectId, ObjectTypeId, Files)
|
|
|
Dim jobInputParameter: Set jobInputParameter = RC.NewJobsParams
|
|
|
Dim jobOutputParameter: Set jobOutputParameter = RC.NewJobsParams
|
|
|
|
|
|
Dim DOM : Set DOM = CreateObject("MSXML2.DOMDocument")
|
|
|
DOM.documentElement = DOM.createElement("DMSData")
|
|
|
Dim ArchiveElement: SET ArchiveElement = DOM.createElement("Archive")
|
|
|
DOM.documentElement.appendChild ArchiveElement
|
|
|
Dim ObjectTypeElement: SET ObjectTypeElement = DOM.createElement("ObjectType")
|
|
|
ArchiveElement.appendChild ObjectTypeElement
|
|
|
ObjectTypeElement.setAttribute "id", ObjectTypeId
|
|
|
Dim ObjectElement: SET ObjectElement = DOM.createElement("Object")
|
|
|
ObjectTypeElement.appendChild ObjectElement
|
|
|
ObjectElement.setAttribute "object_id", ObjectId
|
|
|
|
|
|
jobInputParameter.Value("$Job$Files$") = Files
|
|
|
jobInputParameter.Value("Options") = "REPLACEFILES=1"
|
|
|
jobInputParameter.Value("Flags") = 0
|
|
|
jobInputParameter.Value("XML") = Dom
|
|
|
|
|
|
RC.Jobs.dms.XMLUpdate jobInputParameter, jobOutputParameter
|
|
|
End Function
|
|
|
|
|
|
Function StdGetTemplates(ObjectType, User)
|
|
|
Dim jobInputParameter: Set jobInputParameter = RC.NewJobsParams
|
|
|
Dim jobOutputParameter: Set jobOutputParameter = RC.NewJobsParams
|
|
|
With jobInputParameter
|
|
|
.Value("dwObjectType") = ObjectType
|
|
|
.Value("JobUserGUID") = User
|
|
|
End With
|
|
|
RC.Jobs.std.GetTemplates jobInputParameter, jobOutputParameter
|
|
|
|
|
|
Dim Templates: Set Templates = CreateObject("System.Collections.ArrayList")
|
|
|
For i = 0 To jobOutputParameter.Value("nCount") -1
|
|
|
Dim Index: Index = Right("000" & i, 3)
|
|
|
Dim Template: Set Template = CreateObject("Scripting.Dictionary")
|
|
|
Template.Add "Aliase" , jobOutputParameter.Value("Aliase" & Index)
|
|
|
Template.Add "Editor" , jobOutputParameter.Value("Editor" & Index)
|
|
|
Template.Add "Extension" , jobOutputParameter.Value("Extension" & Index)
|
|
|
Template.Add "FileName" , jobOutputParameter.Value("FileName" & Index)
|
|
|
Template.Add "NameSpace" , jobOutputParameter.Value("NameSpace" & Index)
|
|
|
Template.Add "ObjectType" , jobOutputParameter.Value("ObjectType" & Index)
|
|
|
Template.Add "Present" , jobOutputParameter.Value("Present" & Index)
|
|
|
Template.Add "TemplateId" , jobOutputParameter.Value("TemplateId" & Index)
|
|
|
|
|
|
Templates.Add Template
|
|
|
Next
|
|
|
|
|
|
Set StdGetTemplates = Templates
|
|
|
End Function
|
|
|
```
|
|
|
|
|
|
## Eigener Vorlagenschrank
|
|
|
|
|
|
Dieses Beispiel zeigt die Vorlagen aus einem eigenen enaio Vorlagenschrank an.
|
|
|
|
|
|
[Zugehörige Beispiel Objektdefinition](../downloads/asobjdef_vorlagen_templates.xml)
|
|
|
|
|
|
### Serverevent
|
|
|
|
|
|
```VB
|
|
|
Function Main
|
|
|
' Read Request Parameter
|
|
|
Dim Id: Id = RC.InputParams.Value("id")
|
|
|
Dim TypeId: TypeId = RC.InputParams.Value("typeId")
|
|
|
Dim User: User = RC.InputParams.Value("user")
|
|
|
Dim TemplateId: TemplateId = RC.InputParams.Value("templateId")
|
|
|
Dim Method: Method = RC.InputParams.Value("method")
|
|
|
|
|
|
' Exit Function If no Method was set
|
|
|
If Method = "" Then
|
|
|
RC.Logger.Error "Missing Method Parameter"
|
|
|
Exit Function
|
|
|
End If
|
|
|
|
|
|
' Execute Method
|
|
|
Select Case Method
|
|
|
' Send List of available templates
|
|
|
Case "GetTemplates"
|
|
|
Dim Templates : Set Templates = GetTemplates(Id, TypeId, User)
|
|
|
RC.OutputParams.Value("Templates") = Templates
|
|
|
' Copy template to document
|
|
|
Case "SelectTemplate"
|
|
|
Dim Status : Status = SelectTemplate(ID, TypeId, User, TemplateId)
|
|
|
RC.OutputParams.Value("Status") = Status
|
|
|
Case Else
|
|
|
RC.Helper.Error "Unknown Method " & Method
|
|
|
Exit Function
|
|
|
End Select
|
|
|
End Function
|
|
|
|
|
|
' Get available Templates
|
|
|
Function GetTemplates(Id, TypeId, User)
|
|
|
Dim Templates: Templates = GetTemplateList(Id, TypeId, User)
|
|
|
|
|
|
Dim Response: Set Response = XMLElement("Templates")
|
|
|
With Response
|
|
|
For Each Template In Templates
|
|
|
With .Child("Template")
|
|
|
.Attr "id", Template("TemplateId")
|
|
|
.Attr "name", Template("Aliase")
|
|
|
.Attr "namespace", Template("NameSpace")
|
|
|
.Attr "type", Template("Type")
|
|
|
.Attr "extension", Template("extension")
|
|
|
End With
|
|
|
Next
|
|
|
End With
|
|
|
|
|
|
Set GetTemplates = Response.ToDom
|
|
|
End Function
|
|
|
|
|
|
' Copy template to document
|
|
|
Function SelectTemplate(Id, TypeId, User, TemplateId)
|
|
|
Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
|
|
|
|
|
|
Dim Templates: Templates = GetTemplateList(Id, TypeId, User)
|
|
|
|
|
|
Dim Template: For Each Template In Templates
|
|
|
If CStr(Template("TemplateId")) = CStr(TemplateId) Then
|
|
|
Dim Files: Files = StoreInCache(Template("TemplateId"), Template("TemplateTypeId"))
|
|
|
UpdateFile Id, TypeId, Files(0)
|
|
|
SelectTemplate = True
|
|
|
Exit Function
|
|
|
End If
|
|
|
Next
|
|
|
SelectTemplate = False
|
|
|
End Function
|
|
|
|
|
|
' Internal function to get list of templates
|
|
|
Function GetTemplateList(Id, TypeId, User)
|
|
|
Dim Templates: Templates = Array()
|
|
|
|
|
|
Dim Query: Set Query = XMLElement("DMSQuery")
|
|
|
With Query
|
|
|
.Attr "requesttype", "HOL"
|
|
|
With .Child("Archive")
|
|
|
With .Child("ObjectType")
|
|
|
.Attr "internal_name", "Template"
|
|
|
|
|
|
With .Child("Fields")
|
|
|
.Attr "field_schema", "ALL"
|
|
|
End With
|
|
|
End With
|
|
|
End With
|
|
|
End With
|
|
|
|
|
|
Dim jobInputParameter: Set jobInputParameter = RC.NewJobsParams
|
|
|
Dim jobOutputParameter: Set jobOutputParameter = RC.NewJobsParams
|
|
|
|
|
|
jobInputParameter.Value("Flags") = 0
|
|
|
jobInputParameter.Value("FileInfo") = 1
|
|
|
jobInputParameter.Value("Encoding") = "UTF-8"
|
|
|
jobInputParameter.Value("XML") = Query.ToDom
|
|
|
|
|
|
RC.Jobs.dms.GetResultList jobInputParameter, jobOutputParameter
|
|
|
|
|
|
Dim Result : Set Result = CreateObject("MSXML2.DOMDocument")
|
|
|
Result.load(jobOutputParameter.Value("XML"))
|
|
|
|
|
|
Dim TemplatesNodes: Set TemplatesNodes = Result.SelectNodes("//Object")
|
|
|
Dim TemplateNode: For Each TemplateNode In TemplatesNodes
|
|
|
Dim Template: Set Template = CreateObject("Scripting.Dictionary")
|
|
|
Template.Add "Aliase" , TemplateNode.selectSingleNode(".//Field[@internal_name=""Name""]").text
|
|
|
Template.Add "Extension" , TemplateNode.selectSingleNode(".//FileProperties/@extension").text
|
|
|
Template.Add "NameSpace" , TemplateNode.selectSingleNode(".//Field[@internal_name=""Namespace""]").text
|
|
|
Template.Add "TemplateTypeId" , TemplateNode.selectSingleNode("//ObjectType/@id").text
|
|
|
Template.Add "TemplateId" , TemplateNode.selectSingleNode("@id").text
|
|
|
Template.Add "Type" , TemplateNode.selectSingleNode(".//Field[@internal_name=""Type""]").text
|
|
|
ReDim Preserve Templates(UBound(Templates)+1)
|
|
|
Set Templates(UBound(Templates)) = Template
|
|
|
Next
|
|
|
|
|
|
GetTemplateList = Templates
|
|
|
End Function
|
|
|
|
|
|
' Update file without changing any metadata
|
|
|
function UpdateFile(ObjectId, ObjectTypeId, Files)
|
|
|
Dim jobInputParameter: Set jobInputParameter = RC.NewJobsParams
|
|
|
Dim jobOutputParameter: Set jobOutputParameter = RC.NewJobsParams
|
|
|
|
|
|
Dim Data: Set Data = XMLElement("DMSData")
|
|
|
With Data
|
|
|
With .Child("Archive")
|
|
|
With .Child("ObjectType")
|
|
|
.Attr "id", ObjectTypeId
|
|
|
With .Child("Object")
|
|
|
.Attr "object_id", ObjectId
|
|
|
End With
|
|
|
End With
|
|
|
End With
|
|
|
End With
|
|
|
|
|
|
jobInputParameter.Value("$Job$Files$") = Files
|
|
|
jobInputParameter.Value("Options") = "REPLACEFILES=1"
|
|
|
jobInputParameter.Value("Flags") = 8
|
|
|
jobInputParameter.Value("XML") = Data.ToDom
|
|
|
|
|
|
RC.Jobs.dms.XMLUpdate jobInputParameter, jobOutputParameter
|
|
|
End Function
|
|
|
|
|
|
' Fetch file from enaio based in id and type id
|
|
|
Function StoreInCache(ObjectId, ObjectType)
|
|
|
Dim jobInputParameter: Set jobInputParameter = RC.NewJobsParams
|
|
|
Dim jobOutputParameter: Set jobOutputParameter = RC.NewJobsParams
|
|
|
With jobInputParameter
|
|
|
.Value("Flags") = 1
|
|
|
.Value("dwObjectID") = CLng(ObjectId)
|
|
|
.Value("dwObjectType") = CLng(ObjectType)
|
|
|
.Value("DocState") = 1
|
|
|
.Value("FileCount") = 1 'Dummy
|
|
|
End With
|
|
|
RC.Jobs.std.StoreInCache jobInputParameter, jobOutputParameter
|
|
|
StoreInCache = Split(jobOutputParameter.Value("$Job$Files$"), ";")
|
|
|
End Function
|
|
|
|
|
|
|
|
|
Class XMLElementClass
|
|
|
Private MyDom
|
|
|
Private MyElement
|
|
|
|
|
|
Public Function Init(ByRef Dom, ByRef Element)
|
|
|
Set MyDom = Dom
|
|
|
Set MyElement = Element
|
|
|
End Function
|
|
|
|
|
|
Public Function Child(byVal TagName)
|
|
|
Dim ChildElement: Set ChildElement = MyDom.createElement(TagName)
|
|
|
MyElement.AppendChild ChildElement
|
|
|
|
|
|
Dim ChildObj: Set ChildObj = New XMLElementClass
|
|
|
ChildObj.Init MyDom, ChildElement
|
|
|
Set Child = ChildObj
|
|
|
End Function
|
|
|
|
|
|
Public Function ChildWithContent(byVal TagName, ByVal Content)
|
|
|
Dim ChildObj: Set ChildObj = Child(TagName)
|
|
|
ChildObj.Content(Content)
|
|
|
|
|
|
Set ChildWithContent = ChildObj
|
|
|
End Function
|
|
|
|
|
|
Public Function Attr(byVal Name, ByVal Value)
|
|
|
MyElement.setAttribute Name, Value
|
|
|
End Function
|
|
|
|
|
|
Public Function Content(ByVal Value)
|
|
|
MyElement.AppendChild MyDom.CreateTextNode(Value)
|
|
|
End Function
|
|
|
|
|
|
Public Function ToString
|
|
|
ToString = MyDom.xml
|
|
|
End Function
|
|
|
|
|
|
Public Function ToDom
|
|
|
Set ToDom = MyDom
|
|
|
End Function
|
|
|
End Class
|
|
|
|
|
|
Function XMLElement(ByVal TagName)
|
|
|
Dim MyDom: Set MyDom = CreateObject("MSXML2.DOMDocument")
|
|
|
MyDom.documentElement = MyDom.createElement(TagName)
|
|
|
|
|
|
Dim ElementObj: Set ElementObj = new XMLElementClass
|
|
|
ElementObj.Init MyDom, MyDom.documentElement
|
|
|
|
|
|
Set XMLElement = ElementObj
|
|
|
End Function
|
|
|
``` |
|
|
\ No newline at end of file |