Workflow

Allgemein

Der Workflow ist eines der Hauptbestandteile von Konquadrat. Im Grunde ist der Workflow eine State-Machine. Die übliche Verwendung ist die Umsetzung von Anmeldevorgängen. Der Workflow kann jedoch für fast jede Art von Ablauflogik verwendet werden, die eine Interaktion mit Nutzereingaben über HTTP benötigt.

Ein Workflow besteht aus mehreren Schritten; jeder Workflow muss aber mindestens aus einem Schritt bestehen. 

Jeder Schritt kann pro Durchlauf nur einmal besucht werden, falls der Schritt bereits besucht wurde, wird zurück zu diesem Schritt gegangen.

Jeder Schritt besteht aus mehreren Teilen:

  • objects -> Falls der Schritt initialisiert wird, wird diese Logik einmalig ausgeführt.
  • navigation -> Definiert welcher der nächste Schritt ist und ob man den vorherigen Schritt besuchen kann.
  • beforeView -> Wird jedes mal vor dem Generieren der Darstellung ausgeführt.
  • view -> Definiert wie die Darstellung aussieht.
  • afterView -> Wird jedes mal nach dem Generieren der Darstellung ausgeführt.
  • beforeValidate -> Wird vor dem Validieren der Eingaben ausgeführt.
  • onSubmit -> Wird ausgeführt, wenn versucht wird zum nächsten Schritt zu wechseln.

Die Darstellung vom Workflow läuft über den Frontend\Workflow-Controller. Dieser hat jedoch keine eigene Route konfiguriert, sondern benötigt noch einen minimaler Wrapper davor. Die Standardvariante ist über einen Setasite-Block, alternativ kann jedoch auch ein allein stehender Controller, der den Request an den Workflow-Controller weiterleitet erstellt werden. 

Die Daten vom Workflow (abgelegt in \com\setasign\Konquadrat\Workflow\WorkflowData) werden serialisiert in der Session abgelegt. Das beinhaltet alle Objekte und Helper vom Workflow. Dies bedeutet aber auch dass Objekte nicht selbstständig aus der Datenbank aktualisiert werden z.B. falls das Kontingent oder ähnliches verändert wurde.  

Folgende Parameter sind für den Workflow-Controller möglich:

  • workflow - Pflichtparameter, Name vom Workflow
  • sessionVersion - Es ist möglich von einem Workflow mehrere Versionen (Instanzen) gleichzeitig aktiv zu haben. Anhand von diesem Text werden die einzelnen Versionen unterschieden.
  • workflowParams - Wird dem Workflow als extraParams weitergeleitet - extraParams werden nicht mit serialisiert
  • reset - Wenn true, dann werden alle Daten vom Workflow zurückgesetzt.
  • admin - Wenn true, dann wird allen Weiterleitungen der GET-Parameter "specialP" hinzugefügt. Ist nur für den Setasite-Block-Wrapper relevant um z.B. ein Registrierungsende zum umgehen. 

Sobald die "workflow.xml"-Datei bzw. der daraus generierte Hash oder der Hash der Objektkonfiguration sich ändern, werden die Daten vom Workflow zurückgesetzt und man landet wieder im ersten Schritt.

Erstellen von einem Workflow

 Um einen Workflow zu erstellen muss im Ordner "kon2/workflows" ein Ordner mit dem Namen vom Workflow erstellt werden z.B. "Anmeldung". In diesem Ordner muss eine "workflow.xml"-Datei erstellt werden. Helper-Klassen werden direkt in dem Ordner vom Workflow abgelegt (Namespace "\com\setasign\Konquadrat\Workflow\Helper\{Name}"). Ansonsten gibt es in dem Workflow-Ordner noch einen "templates"-Ordner in dem sich die verwendeten Smarty-Templates befinden.

Die XML Konfiguration muss im Namespace "http://www.setasign.com/Konquadrat/Workflow" sein. Für diesen Namespace existiert eine XSD-Datei zur Validierung und Autovervollständigung (konquadrat/src/config/workflow.xsd).

Hier ein HelloWorld-Beispiel wie ein Workflow aussehen kann:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflow id="HelloWorld" xmlns="http://www.setasign.com/Konquadrat/Workflow">
    <step id="Start">
        <objects>
            <helper id="helper" name="Helper" />
        </objects>

        <view>
            <helper ref="helper">
                <html template="HelloWorld" />
            </helper>
        </view>
    </step>
</workflow>

Die vollständige XML-Dokumentation ist hier zu finden.

Der Helper sieht für dieses Beispiel wie folgt aus:

PHP
<?php

namespace com\setasign\Konquadrat\Workflow\Helper\Registrierung;

use com\setasign\Konquadrat\Workflow\Helper\AbstractHelper;

class Helper extends AbstractHelper
{
    public $something = '123';

    public function getName(): string
    {
        return 'Helper';
    }
}