Naming authored by Roland Koller's avatar Roland Koller
## 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