2.2.8 Handbuch:Erweiterung/Workflows/Tutorial und Handbuch:Erweiterung/TabberNeue: Unterschied zwischen den Seiten

(Unterschied zwischen Seiten)
Keine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
 
Keine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
 
Zeile 1: Zeile 1:
==Einen neuen Workflow definieren==
<bs:bookshelf src="Buch:Benutzerhandbuch" />
Als Beispiel erstellen wir einen Workflow, der nach einer Klassifizierung einer Wikiseite fragt. Basierend auf der Klassifizierung des Dokuments sendet der Workflow entweder eine E-Mail an die Rechtsabteilung oder es fügt zuerst einen kurzen Eintrag in einer Wiki-Seite ein und sendet dann die E-Mail an die Rechtsabteilung.
{{DISPLAYTITLE:Reiter (Tabs) im Seiteninhalt}}
 
{{BSVersion|bsvFrom=4.4|bsvFeature=TabberNeue}}
Der beschriebene Workflow besteht aus vier Aktivitäten und einem Gateway. Sie können im Wiki ein BPMN-Diagramm erstellen, um den Prozess zu visualisieren:
==Einfache Tabs==
[[Datei:Handbuch:Workflows-tutorial-diagramm-de.svg|alternativtext=Classificiation-workflow.|zentriert|mini|750x750px|<span style="color: rgb(37, 37, 37)">Classificiation-workflow.</span>]]
Wenn Sie Seiteninhalte in Reitern organisieren möchten, können Sie hierfür eine spezielle Syntax in der Quelltextbearbeitung verwenden.{{Textbox|boxtype=important|header=|text=Die Inhalte der Reiter können nicht im visuellen Bearbeitungsmodus eingefügt werden. Es ist jedoch möglich, [[#Transklusion|Wiki-Seiten als Inhalt der Tabs anzuzeigen (zu transkludieren)]].|icon=no}}
 
Reiter (Tabs) werden mit <code>tabName=tabBody</code> erstellt und durch <code>|-|</code> getrennt. Sie können in den Registerkarten jeden Inhalt verwenden, einschließlich Vorlagen und Bildern.[[Datei:TabberNeue Standard.png|zentriert|mini|550x550px|Standard-Reiter]]<syntaxhighlight lang="text">
==Schritte==
<tabber>
Um den Workflow zu erstellen, sind folgende Schritte notwendig:
|-|Titel für Tab 1=
 
Der Inhalt für Tab 1.
# '''Benutzerdefinierten Workflow-Definition''' erstellen: <code>MediaWiki:Classification-workflow.bpmn</code>
|-|Titel für Tab 2=
# '''Initiierungsformular''' erstellen und mit dem Workflow verbinden. Das Formular fügt einige Informationen zum Workflow hinzu, bevor die Workflow-Aufgabe erstellt wird: <code>MediaWiki:ContentClassificationInit.form</code>
Der Inhalt für Tab 2.
# '''Klassifizierungsformular''' erstellen und mit dem Workflow verbinden. Das Formular ermöglicht es dem zugewiesenen Benutzer, das Dokument zu klassifizieren: <code>MediaWiki:ContentClassificationRequest.form</code>
|-|Titel für Tab 1=
# Hinzufügen eines Auslösers, der definiert, wo und wie der Workflow gestartet werden soll.
Der Inhalt für Tab 3.
 
</tabber>
==Anleitung==
===Workflow-Definition erstellen===
Zuerst erstellen wir die Seite <code>MediaWiki:Classification-workflow.bpmn</code> mit einfachem Stub-XML. Jeder Workflow benötigt diese Elemente:
 
* Zeile 1: Der XML-Prolog
* Zeile 2: Das "definitions"-Element, das die  xml-Namespaces bezeichnet, in denen die Workflow-Elemente definiert sind.
* Zeile3: Das "process"-Element, das alle anderen Elemente enthält.
* Zeile 5: Der Workflow läuft im Kontext einer bestimmten Überarbeitung einer Wiki-Seite.
* Zeile 11: Der Workflow benötigt ein startEvent und
* Zeile 18:  ein endEvent.
<syntaxhighlight lang="xml" line="1">
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:wf="http://hallowelt.com/schema/bpmn/wf">
<bpmn:process id="Classification_workflow_process">
    <bpmn:extensionElements>
<wf:context>
<wf:contextItem name="pageId"/>
<wf:contextItem name="revision"/>
</wf:context>
</bpmn:extensionElements>
 
    <bpmn:startEvent id="TheStart">
<bpmn:outgoing>FromTheStartToInitializeWorkflow</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="FromTheStartToInitializeWorkflow" sourceRef="TheStart" targetRef="InitializeWorkflow" />
 
        <!-- ... -->
 
<bpmn:endEvent id="TheEnd">
<bpmn:incoming>FromSendMailToTheEnd</bpmn:incoming>
</bpmn:endEvent>
 
</bpmn:process>
 
</bpmn:definitions>
</syntaxhighlight>Dieses Stub-XML enthält nur die Ereignisse "Start" und "Ende", einschließlich - noch zu definierender - "ausgehender" und "eingehender" Flussreferenzen.
====Erstellen und verbinden des Initiierungs-Formulars====
Das Initiierungsformular ermöglicht die Interaktion mit dem Benutzer, der den Workflow startet. Es erklärt, was passiert, wenn der Workflow gestartet wird, und ermöglicht das Hinzufügen eines Kommentars, um einen Kontext für die Benutzeraufgabe bereitzustellen.
[[Datei:Handbuch:workflows-tutorial-initialisierung.png|alternativtext=Initialisierungsformular|zentriert|mini|550x550px|Initialisierungsformular]]
Wir erstellen es hier im MediaWiki-Namensraum, um sicherzustellen, dass nicht jeder Benutzer das Formular später bearbeiten kann. Aber generell können solche Formulare überall im Wiki erstellt werden.
 
So erstellen Sie das Initiierungsformular:
 
# '''Erstellen''' Sie die Seite <code>MediaWiki:ContentClassificationInit.form</code>
# '''Fügen''' Sie die folgende Formulardefinition im Quellbearbeitungsmodus '''ein''':<syntaxhighlight lang="json">
{
    "lang": "json",
    "form_name": "ContentClassificationInit",
    "items": [
        {
            "name": "intro",
            "widget_label": "Klicken Sie  \"Fertig\", um die Klassifizierung des Dokuments anzufordern. Sie können hier einen Kommentar an die zuständige Person mitgeben",
            "type": "label"
        },
        {
            "name": "comment",
            "label": "Comment",
            "noLayout": true,
            "showOn": [
                "create",
                "edit",
                "view"
            ],
            "editableOn": [
                "create",
                "edit"
            ],
            "type": "textarea"
        }
    ]
}
 
</syntaxhighlight>
</syntaxhighlight>
#'''Save''' the page.
==Verschachtelte Reiter==
 
Verschachtelte Tabber müssen als Parserfunktionen geschrieben werden. Anstelle der <nowiki><code><tabber/></code></nowiki>-Tags werden sie mit <nowiki><code>{{#tag:tabber|}}</code></nowiki> umschlossen und durch  <nowiki><code>{{!}}-{{!}}</code></nowiki> getrennt.
Als nächstes geben wir im BPMN mit der folgenden '''userTask''' mit, das Formular anzuzeigen:<syntaxhighlight lang="xml">
[[Datei:TabberNeue Verschachtelte Reiter.png|alternativtext=Beispiel von 4 Reitern. Die untergeordenten Reiter des 1. Hauptreiters sind geöffnet.|zentriert|mini|650x650px|Verschachtelte Reiter]]
<bpmn:userTask id="InitializeWorkflow" name="Start Content Classification Workflow">
<syntaxhighlight lang="text">
<bpmn:extensionElements>
<tabber>
<wf:type>custom_form</wf:type>
|-|First Tab Title=
<wf:form>MediaWiki:ContentClassificationInit</wf:form>
{{#tag:tabber|
<wf:initializer>true</wf:initializer>
Tab Title A=
</bpmn:extensionElements>
Tab content A goes here.
<bpmn:property name="comment"></bpmn:property>
{{!}}-{{!}}
<bpmn:incoming>FromTheStartToInitializeWorkflow</bpmn:incoming>
Tab Title B=
<bpmn:outgoing>FromInitializeWorkflowToAskForClassification</bpmn:outgoing>
Tab content B goes here.
</bpmn:userTask>
{{!}}-{{!}}
<bpmn:sequenceFlow id="FromInitializeWorkflowToAskForClassification" sourceRef="InitializeWorkflow" targetRef="AskForClassification" />
Tab Title C=
 
Tab content C goes here.
</syntaxhighlight>Schauen wir uns an, was das bewirkt:
}}
 
|-|Second Tab Title=
* <code>Id</code> und <code>name</code> dieser Aktivität sind auf „InitializeWorkflow“ und „Start Content Classification Workflow“ festgelegt. Beide Werte müssen nicht übereinstimmen, tun dies aber normalerweise.
{{#tag:tabber|
* <wf:type> ist ''custom_form'' und teilt dem Workflow mit, dass ein Formular direkt im Wiki (im Gegensatz zu einem im Code befindlichen Formular) verfügbar ist.
Tab Title D=
* <wf:form> zeigt auf die eigentliche Formularseite im Wiki
Tab content D goes here.
* <wf:initializer> ist auf ''true'' gesetzt, da es verwendet wird, um einige Informationen anzuzeigen oder zu sammeln, bevor der eigentliche Workflow beginnt.
{{!}}-{{!}}
 
Tab Title E=
Am Ende haben wir die eingehenden und ausgehenden Ströme referenziert. (Hinweis: Die Reihenfolge der Elemente spielt normalerweise keine Rolle; nur die Verschachtelung ist wichtig).
Tab content E goes here.
 
{{!}}-{{!}}
Wir fügen diese '''userTask''' in Zeile 16 nach der Zeile ''<bpmn:sequenceFlow id="FromTheStartToInitializeWorkflow" sourceRef="TheStart" targetRef="InitializeWorkflow" />'' hinzu:<syntaxhighlight lang="xml" line="1">
Tab Title F=
<?xml version="1.0" encoding="UTF-8"?>
Tab content F goes here.
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:wf="http://hallowelt.com/schema/bpmn/wf">
}}
<bpmn:process id="Classification_workflow_process">
|-|Third Tab Title=
    <bpmn:extensionElements>
{{#tag:tabber|
<wf:context>
Tab Title G=
<wf:contextItem name="pageId"/>
Tab content G goes here.
<wf:contextItem name="revision"/>
{{!}}-{{!}}
</wf:context>
Tab Title H=
</bpmn:extensionElements>
Tab content H goes here.
 
{{!}}-{{!}}
    <bpmn:startEvent id="TheStart">
Tab Title I=
        <bpmn:outgoing>FromTheStartToInitializ</bpmn:outgoing>
Tab content I goes here.
        </bpmn:startEvent>
}}
      <bpmn:sequenceFlow id="FromTheStartToInitializeWorkflow" sourceRef="TheStart" targetRef="InitializeWorkflow" />
</tabber>
 
<bpmn:userTask id="InitializeWorkflow" name="Start Content Classification Workflow">
<bpmn:extensionElements>
<wf:type>custom_form</wf:type>
<wf:form>MediaWiki:ContentClassificationInit</wf:form>
<wf:initializer>true</wf:initializer>
</bpmn:extensionElements>
<bpmn:property name="comment"></bpmn:property>
<bpmn:incoming>FromTheStartToInitializeWorkflow</bpmn:incoming>
<bpmn:outgoing>FromInitializeWorkflowToAskForClassification</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="FromInitializeWorkflowToAskForClassification" sourceRef="InitializeWorkflow" targetRef="AskForClassification" />
 
<bpmn:endEvent id="TheEnd">
<bpmn:incoming>FromSendMailToTheEnd</bpmn:incoming>
</bpmn:endEvent>
 
</bpmn:process>
 
</bpmn:definitions>
</syntaxhighlight>
====Erstellen und Verbinden des Klassifizierungsformulars====
Der Workflow zeigt einem Benutzer ein Klassifizierungsformular an. Dieser Benutzer wird in einem späteren Schritt im Workflow definiert.
 
So erstellen Sie das Klassifizierungsformular:
 
# '''Erstellen''' Sie die Seite <code>MediaWiki:ContentClassificationRequest.form</code>
# '''Fügen''' Sie die folgende Formulardefinition im Quellbearbeitungsmodus ein:
<syntaxhighlight lang="json">
{
    "lang": "json",
"form_name": "ContentClassificationRequest",
"items": [
{
"name": "intro",
"widget_label": "Überprüfen Sie das Dokument und wählen Sie die passende Klassifizierung für dieses Dokument aus",
"type": "label"
},
{
"name": "classification",
"label": "Classification",
"required": true,
"options": [
{
"data": "CLSA",
"label": "Class A"
},
{
"data": "CLSB",
"label": "Class B"
}
],
"type": "dropdown",
"widget_$overlay": true
}
]
}
</syntaxhighlight>Als Nächstes weisen wir im BPMN an, das Formular dem Benutzer anzuzeigen, der die Workflow-Aufgabe erhält. Dafür fügen wir eine '''userTask'''-Aktivität hinzu:<syntaxhighlight lang="xml">
        ...
<bpmn:userTask id="AskForClassification" name="Provide classification">
<bpmn:extensionElements>
<wf:type>custom_form</wf:type>
<wf:form>MediaWiki:ContentClassificationRequest</wf:form>
    <wf:initializer>true</wf:initializer>
</bpmn:extensionElements>
<bpmn:property name="assigned_user">
<![CDATA[{{ROOTPAGENAME:{{#show:{{FULLPAGENAME}}|?Responsible|link=none|default=TheBoss}}}}]]>
</bpmn:property>
<bpmn:property name="due_date">
<![CDATA[{{#time:YmdHis|now + 7 days}}]]>
</bpmn:property>
<bpmn:property name="classification"></bpmn:property>
<bpmn:incoming>FromTheStartToAskForClassification</bpmn:incoming>
<bpmn:outgoing>FromAskForClassificationToGateway</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="FromAskForClassificationToGateway" sourceRef="AskForClassification" targetRef="Gateway" />
...
</syntaxhighlight>Sehen wir uns diesen Abschnitt genau an. Diese ''userTask'' hat neben der Formularreferenz zum Klassifizierungsformular (vergleiche hierzu das Initiierungsformular) einige zusätzliche Eigenschaften:
 
* '''assigned user''': Das Attribut <code>assigned user</code> ist obligatorisch, da die Workflow-Engine wissen muss, welcher Benutzer abgefragt werden soll. In diesem Fall verwenden wir etwas Wikitext-Funktionalität, um den zugewiesenen Benutzer aus dem Kontext zu berechnen. Der Wert besteht aus einer Kombination aus einer Wikitext-Variablen und einer Parserfunktion (diese spezielle Parserfunktion wird von der Semantic MediaWiki-Erweiterung definiert, die hier als Abhängigkeit angesehen werden kann).  Die Parserfunktion <code><nowiki>{{#show}}</nowiki></code> versucht, einen Benutzernamen aus einer semantischen Eigenschaft zu erhalten, die auf der Seite, auf der der Workflow gestartet wird, festgelegt sein kann oder nicht. Wenn die Funktion keine richtigen Informationen findet, greift sie auf <code>TheBoss</code> zurück (vorausgesetzt, dass ein solcher Benutzer im Wiki existiert). Die <code><nowiki>{{ROOTPAGENAME}}</nowiki></code>-Variable ist nur eine einfache Möglichkeit, den "Benutzer"-Namensraum zu entfernen, wenn der gesuchte Wert so etwas wie <code>Benutzer:JaneDoe</code> statt nur <code>JaneDoe</code> war.
* '''due date:''' Das Attribut <code>due_date</code> ist ebenfalls obligatorisch. Alle benutzerseitigen Aktivitäten benötigen ein Fälligkeitsdatum. Wenn die laufende Aktivität überfällig ist, beendet die Workflow-Engine den Workflow. In diesem Fall implementieren wir ein Konzept von "Ruhetagen", da wir kein absolutes Fälligkeitsdatum haben, sondern es ab dem Zeitpunkt berechnen, an dem die Aktivität mit der Parserfunktion <code><nowiki>{{#time}}</nowiki></code> beginnt.
* '''classification''': Das Klassifizierungsattribut ist zufällig. Es muss angegeben werden, damit das Formular es festlegen und der Workflow-Kontext darauf zugreifen kann. Wir hätten einen Standardwert angeben können, aber wir möchten ihn leer lassen.
 
Am Ende haben wir die eingehenden und ausgehenden Flüsse referenziert. (Hinweis: Die Reihenfolge der Elemente spielt normalerweise keine Rolle; nur die Verschachtelung ist wichtig).
====Der Gateway====
Jetzt können wir mit dem Hinzufügen des Gateways fortfahren. Der Gateway stellt die beiden erforderlichen Pfade bereit:
 
# Wenn der zugewiesene Benutzer das Dokument als Klasse A (CLSA) klassifiziert hat, wird eine E-Mail an die Rechtsabteilung gesendet.
# Wenn der zugewiesene Benutzer das Dokument als Klasse B (CLSB) klassifiziert hat, wird vor dem Senden der E-Mail zusäthlich eine Wiki-Seite mit dem in der Aufgabe „AppendWikipage“ definierten Inhalt angehängt.
<syntaxhighlight lang="xml">
        ...
<bpmn:exclusiveGateway id="Gateway" name="AskForClassification.classification">
<bpmn:incoming>FromAskForClassificationToGateway</bpmn:incoming>
<bpmn:outgoing>FromGatewayToSendMail</bpmn:outgoing>
<bpmn:outgoing>FromGatewayToAppendWikipage</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="FromGatewayToSendMail" name="CLSA" sourceRef="Gateway" targetRef="SendMail" />
<bpmn:sequenceFlow id="FromGatewayToAppendWikipage" name="CLSB" sourceRef="Gateway" targetRef="AppendWikipage" />
...
</syntaxhighlight>Nach dem Einrichten des Gateways müssen wir die beiden zugehörigen Aktivitäten definieren.
====E-Mail an die Rechtsabteilung senden====
Für Fall 1 benötigen wir den Workflow, um sofort eine E-Mail zu senden:<syntaxhighlight lang="xml">
        ...
<bpmn:task id="SendMail" name="Send mail">
<bpmn:extensionElements>
<wf:type>send_mail</wf:type>
</bpmn:extensionElements>
<bpmn:property name="recipient">
<![CDATA[legal@company.local]]>
</bpmn:property>
<bpmn:property name="subject">
<![CDATA[New "Class A" content: {{FULLPAGENAME}}]]>
</bpmn:property>
<bpmn:property name="body">
<![CDATA[Please check further actions now!]]>
</bpmn:property>
<bpmn:incoming>FromGatewayToSendMail</bpmn:incoming>
<bpmn:incoming>FromAppendWikipageToSendMail</bpmn:incoming>
<bpmn:outgoing>FromEndMailToTheEnd</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="FromEndMailToTheEnd" sourceRef="SendMail" targetRef="TheEnd" />
...
</syntaxhighlight>
</syntaxhighlight>
====Text an eine Wikiseite anhängen====
==Transklusion==
Für Fall 2 möchten wir, dass der Workflow zuerst die vorhandene Seite ''Classification_incidents'' mit dem in der ''content''-Eigenschaft angezeigten Text anhängt.
Beim Transklusionsmodus werden ganze Wiki-Seiten in den Reitern transkludiert. Die Seiten werden bei Bedarf mit AJAX transkludiert, indem eine Anfrage an die MediaWiki-API gestellt wird. Einmal angefordert, werden sie erst wieder abgerufen, wenn die Seite neu geladen wird. Beachten Sie, dass Tabs auf der transkludierten Seite nicht gerendert werden. Tabs werden mit <code>pageName|tabName</code> erstellt und durch eine neue Zeile getrennt.
 
<syntaxhighlight lang="text">
Diese Anforderung kann mit dem Aktivitätstyp ''edit_page'' erfüllt werden:<syntaxhighlight lang="xml">
<tabbertransclude>  
        ...
Name der ersten Seite|Titel des ersten Tabs
<bpmn:task id="AppendWikipage" name="Append wikipage">
Name der zweiten Seite|Titel des zweiten Tabs
<bpmn:extensionElements>
Name der dritten Seite|Titel des dritten Tabs
<wf:type>edit_page</wf:type>
</tabbertransclude>
</bpmn:extensionElements>
<bpmn:property name="title" default="Classification_incidents"/>
<bpmn:property name="user" default="Mediawiki default"/>
<bpmn:property name="content" default="* [[{{FULLPAGENAME}}]] was classified {{{AskForClassification.classification}}}"/>
<bpmn:property name="mode" default="append"/>
<bpmn:property name="minor" default="1"/>
<bpmn:incoming>FromGatewayToAppendWikipage</bpmn:incoming>
<bpmn:outgoing>FromAppendWikipageToSendMail</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="FromAppendWikipageToSendMail" sourceRef="AppendWikipage" targetRef="SendMail" />
...
</syntaxhighlight>Für diesen Aktivitätstyp werden die folgenden Eigenschaften festgelegt:
 
* '''title:''' Titel der Wiki-Seite, an die der Inhalt angehängt wird.
* '''user:''' Benutzer, der in der Versionshistorie der angehängten Wiki-Seite angezeigt wird.
* '''content:''' Text, der der Wiki-Seite hinzugefügt wird.
* '''mode:''' zeigt an, wo der Text zur Wiki-Seite hinzugefügt wird.
* '''minor:''' legt diese Seitenrevision als "minor" (1) oder "major"  (2) fest.
 
Nachdem diese Aufgabe abgeschlossen ist, sendet der Workflow eine E-Mail an die Rechtsabteilung.
 
====Komplettes BPMN====
Am Ende sieht die bpmn-Seite für den Workflow so aus:
<syntaxhighlight lang="xml" line="1">
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions
xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:wf="http://hallowelt.com/schema/bpmn/wf">
 
<bpmn:process id="Classification_workflow_process">
<bpmn:extensionElements>
<wf:context>
<wf:contextItem name="pageId"/>
<wf:contextItem name="revision"/>
</wf:context>
</bpmn:extensionElements>
<bpmn:startEvent id="TheStart">
<bpmn:outgoing>FromTheStartToInitializeWorkflow</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="FromTheStartToInitializeWorkflow" sourceRef="TheStart" targetRef="InitializeWorkflow" />
<bpmn:userTask id="InitializeWorkflow" name="Start Content Classification Workflow">
<bpmn:extensionElements>
<wf:type>custom_form</wf:type>
<wf:form>MediaWiki:ContentClassificationInit</wf:form>
<wf:initializer>true</wf:initializer>
</bpmn:extensionElements>
<bpmn:property name="comment"></bpmn:property>
<bpmn:incoming>FromTheStartToInitializeWorkflow</bpmn:incoming>
<bpmn:outgoing>FromInitializeWorkflowToAskForClassification</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="FromInitializeWorkflowToAskForClassification" sourceRef="InitializeWorkflow" targetRef="AskForClassification" />
 
<bpmn:userTask id="AskForClassification" name="Provide classification">
<bpmn:extensionElements>
<wf:type>custom_form</wf:type>
<wf:form>MediaWiki:ContentClassificationRequest</wf:form>
</bpmn:extensionElements>
<bpmn:property name="assigned_user">
<![CDATA[{{ROOTPAGENAME:{{#show:{{FULLPAGENAME}}|?Responsible|link=none|default=TheBoss}}}}]]>
</bpmn:property>
<bpmn:property name="due_date">
<![CDATA[{{#time:YmdHis|now + 7 days}}]]>
</bpmn:property>
<bpmn:property name="classification"></bpmn:property>
<bpmn:incoming>FromInitializeWorkflowToAskForClassification</bpmn:incoming>
<bpmn:outgoing>FromAskForClassificationToGateway</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="FromAskForClassificationToGateway" sourceRef="AskForClassification" targetRef="Gateway" />
 
<bpmn:exclusiveGateway id="Gateway" name="AskForClassification.classification">
<bpmn:incoming>FromAskForClassificationToGateway</bpmn:incoming>
<bpmn:outgoing>FromGatewayToSendMail</bpmn:outgoing>
<bpmn:outgoing>FromGatewayToAppendWikipage</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="FromGatewayToSendMail" name="CLSA" sourceRef="Gateway" targetRef="SendMail" />
<bpmn:sequenceFlow id="FromGatewayToAppendWikipage" name="CLSB" sourceRef="Gateway" targetRef="AppendWikipage" />
 
<bpmn:task id="SendMail" name="Send mail">
<bpmn:extensionElements>
<wf:type>send_mail</wf:type>
</bpmn:extensionElements>
<bpmn:property name="recipient">
<![CDATA[legal@company.local]]>
</bpmn:property>
<bpmn:property name="subject">
<![CDATA[New "Class A" content: {{FULLPAGENAME}}]]>
</bpmn:property>
<bpmn:property name="body">
<![CDATA[Please check further actions now!]]>
</bpmn:property>
<bpmn:incoming>FromGatewayToSendMail</bpmn:incoming>
<bpmn:incoming>FromAppendWikipageToSendMail</bpmn:incoming>
<bpmn:outgoing>FromEndMailToTheEnd</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="FromEndMailToTheEnd" sourceRef="SendMail" targetRef="TheEnd" />
 
<bpmn:task id="AppendWikipage" name="Append wikipage">
<bpmn:extensionElements>
<wf:type>edit_page</wf:type>
</bpmn:extensionElements>
<bpmn:property name="title" default="Classification_incidents"/>
<bpmn:property name="user" default="MediaWiki default"/>
<bpmn:property name="content" default="* [[{{FULLPAGENAME}}]] was classified {{{AskForClassification.classification}}}"/>
<bpmn:property name="mode" default="append"/>
<bpmn:property name="minor" default="1"/>
<bpmn:incoming>FromGatewayToAppendWikipage</bpmn:incoming>
<bpmn:outgoing>FromAppendWikipageToSendMail</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="FromAppendWikipageToSendMail" sourceRef="AppendWikipage" targetRef="SendMail" />
 
<bpmn:endEvent id="TheEnd">
<bpmn:incoming>FromSendMailToTheEnd</bpmn:incoming>
</bpmn:endEvent>
 
</bpmn:process>
 
</bpmn:definitions>
</syntaxhighlight>
</syntaxhighlight>
==Workflow-Auslöser definieren==
Damit der Workflow im Wiki erscheint, müssen wir einen Trigger definieren:


# '''Klicken''' Sie im Menü ''Globale Aktionen'' '''auf''' ''Workflow-Triggers''.
<!--==Automatisch generierte Wartungskategorien verstecken ==
# '''Klicken''' Sie '''auf''' ''Neuen Trigger hinzufügen''.
Diese Erweiterung erstellt einige, manchmal unerwünschte, automatische Wartungskategorien, die dann auf jeder Wiki-Seite angezeigt werden, die Tabs enthält.
# '''Wählen''' Sie die Option ''Manuell'' aus dem ''Dropdown-Menü''.
Um  diese Kategorien auszublenden:
# '''Klicken''' Sie '''auf''' ''Weiter''.
# '''Definieren''' Sie die Einstellungen für den Workflow-Trigger:
#* ''Name:'' Name, der im Workflow-Auswahlmenü angezeigt wird.
#* ''Beschreibung'': Erläuterung der Funktion und Besonderheiten dieses Triggers.
#* ''Zu startender Workflow'': Durch diesen Trigger ausgelöster Workflow. In unserem Fall <span style="color: rgb(37, 37, 37)">''Classificiation-workflow.''</span>
#* ''Anfangsdaten für den Workflow (optional)'': - Standard-Kommentarvorschlag.
#* '''Bedingungen''' (optional): In welchen Namensräumen der Workflow zur Auswahl angezeigt wird.
# '''Klicken''' Sie '''auf''' Speichern.


Ihr Workflow kann jetzt getestet werden.
'''Gehen''' Sie in Ihrem Wiki zur Seite ''Spezial:TrackingCategories''
#'''Klicken''' Sie in der Spalte ''Name der Nachricht'' auf ''Pages using Tabber parser tag‎'' oder ''Pages using TabberTransclude parser tag''
#'''Ersetzen''' Sie den Text der Seite <span style="color: rgb(37, 37, 37)">‎</span>  durch einen Bindestrich ("-").
#'''Speichern''' Sie die Seite.


==Workflow testen==
Der Workflow ist jetzt im Wiki verfügbar. Wir können nun testen, ob die folgende Funktionalität verfügbar ist:


* Der Workflow steht in den im Workflow-Trigger definierten Namensräumens zum Starten zur Verfügung (sofern hier Einschränkungen bestehen).
* Der Worklfow wird ausgelöst.
* Der Workflow wird auf der Seite „Workflows Übersicht“ aufgelistet.
* Der zugewiesene Benutzer hat eine Aufgabe erhalten.
* Der Workflow wird in Fall A und B korrekt abgeschlossen.


==Bpmn.io nutzen, um Workflows zu definieren==
Die Kategorie wird anschließend nicht mehr auf Ihren Wiki-Seiten angezeigt.
Ein solches Diagramm kann mit dem kostenlosen Dienst [https://bpmn.io/ bpmn.io] erstellt werden. Die [[Medium:Handbuch:Workflows-tutorial-raw-de.bpmn.xml|resultierende BPMN-Datei]] muss allerdings modifiziert werden, bevor sie tatsächlich importiert und im Wiki verwendet werden kann.


<span><span /><span /><br /></span>
<span><span /><span /><span /><span /><span /><br /></span>
[[en:Manual:Extension/Workflows/Tutorial]]
Siehe: https://www.mediawiki.org/wiki/Help:Tracking%20categories-->
[[de:{{FULLPAGENAME}}]]
{{translation}}

Version vom 8. Dezember 2023, 16:55 Uhr

TabberNeue ist ab BlueSpice 4.4 enthalten.

Einfache Tabs

Wenn Sie Seiteninhalte in Reitern organisieren möchten, können Sie hierfür eine spezielle Syntax in der Quelltextbearbeitung verwenden.

Die Inhalte der Reiter können nicht im visuellen Bearbeitungsmodus eingefügt werden. Es ist jedoch möglich, Wiki-Seiten als Inhalt der Tabs anzuzeigen (zu transkludieren).

Reiter (Tabs) werden mit tabName=tabBody erstellt und durch |-| getrennt. Sie können in den Registerkarten jeden Inhalt verwenden, einschließlich Vorlagen und Bildern.

Standard-Reiter
<tabber>
|-|Titel für Tab 1=
Der Inhalt für Tab 1.
|-|Titel für Tab 2=
Der Inhalt für Tab 2.
|-|Titel für Tab 1=
Der Inhalt für Tab 3.
</tabber>

Verschachtelte Reiter

Verschachtelte Tabber müssen als Parserfunktionen geschrieben werden. Anstelle der <code><tabber/></code>-Tags werden sie mit <code>{{#tag:tabber|}}</code> umschlossen und durch <code>{{!}}-{{!}}</code> getrennt.

Beispiel von 4 Reitern. Die untergeordenten Reiter des 1. Hauptreiters sind geöffnet.
Verschachtelte Reiter
<tabber>
|-|First Tab Title=
{{#tag:tabber|
 Tab Title A=
 Tab content A goes here.
 {{!}}-{{!}}
 Tab Title B=
 Tab content B goes here.
 {{!}}-{{!}}
 Tab Title C=
 Tab content C goes here.
 }}
|-|Second Tab Title=
{{#tag:tabber|
 Tab Title D=
 Tab content D goes here.
 {{!}}-{{!}}
 Tab Title E=
 Tab content E goes here.
 {{!}}-{{!}}
 Tab Title F=
 Tab content F goes here.
 }}
|-|Third Tab Title=
{{#tag:tabber|
 Tab Title G=
 Tab content G goes here.
 {{!}}-{{!}}
 Tab Title H=
 Tab content H goes here.
 {{!}}-{{!}}
 Tab Title I=
 Tab content I goes here.
 }}
</tabber>

Transklusion

Beim Transklusionsmodus werden ganze Wiki-Seiten in den Reitern transkludiert. Die Seiten werden bei Bedarf mit AJAX transkludiert, indem eine Anfrage an die MediaWiki-API gestellt wird. Einmal angefordert, werden sie erst wieder abgerufen, wenn die Seite neu geladen wird. Beachten Sie, dass Tabs auf der transkludierten Seite nicht gerendert werden. Tabs werden mit pageName|tabName erstellt und durch eine neue Zeile getrennt.

<tabbertransclude> 
Name der ersten Seite|Titel des ersten Tabs 
Name der zweiten Seite|Titel des zweiten Tabs 
Name der dritten Seite|Titel des dritten Tabs 
</tabbertransclude>




Feedback zur Dokumentation ist im Community-Forum möglich.

Keine Kategorien vergebenBearbeiten

Diskussionen