Comment créer le cycle de vie d’un SmartElement

Recommandation

Le cycle de vie (workflow) permet de gérer la vie d’un Smart Element en lui imposant un ensemble d’étapes pour aller de sa création jusqu’à sa fin (moment à partir duquel le Smart Element n’évolue plus).

Si vous n’êtes pas familier avec les Workflows et leur fonctionnement, il est fortement recommandé de lire la documentation associée disponible ici

Génération des fichiers de configuration

Afin de créer ces Workflow, nous utiliserons ici la commande createWorkflow. Cette dernière accepte plusieurs arguments comme indiqué sur la documentation ou en exécutant la commande

npx @anakeen/anakeen-cli createWorkflow --h

anakeen-cli createWorkflow

Create a workflow

Options:
  --version                       Show version number                  [boolean]
  --sourcePath, -s                path to the info.xml directory [Mandatory]
                                                         [string] [default: "."]
  --vendorName, -v                vendor name of the module [Mandatory]
                                                   [string] [default: (default)]
  --moduleName, -m                name of the module [Mandatory]
                                                   [string] [default: (default)]
  --smartStructureName, -n        workflow smart structure name [Mandatory]
                                                                        [string]
  --parentName, -p                parent name of the workflow model
                                                          [string] [default: ""]
  --smartElementName, -e          workflow smart element name [Mandatory]
                                                                        [string]
  --associatedSmartStructure, -S  name of the associated smart structure
                                  [Mandatory]                           [string]
  --workflowPath                  path where the workflow will be added
                                                   [string] [default: (default)]
  --inSelfDirectory               add a directory for the new workflow (not
                                  compatible with workflowPath)
                                                       [boolean] [default: true]
  --withParameters                add parameters       [boolean] [default: true]
  --withBehavior                  add a class behavior [boolean] [default: true]
  --noCreateSmartStructure        disable the creation of the SS
                                                      [boolean] [default: false]
  -h, --help                      Show help                            [boolean]

Il existe, ici aussi, deux modes d’utilisation de cette commande. Nous utiliserons ici la ligne de commande ,mais il est également possible d’utiliser le mode interactif. Créons le cycle de vie des plats :

npx @anakeen/anakeen-cli createWorkflow --sourcePath . --smartStructureName WFAM_PLAT --smartElementName WDOC_PLAT --associatedSmartStructure PLAT

Information

L’invite de commande renvoit alors le message :

 ✔  success   createWorkflow done

Voilà les fichiers générés pour notre Workflow.

CreateWorkflowResult

Paramétrage des fichiers de configuration

Le paramétrage de ces fichiers de configuration se déroule en plusieurs étapes :

  1. Déclarer le graphe : Définir les différentes étapes et transitions du cycle de vie

  2. Déclarer le modèle du cycle de vie : Permet de définir les actions sur les transitions

  3. Paramétrer le workflow : Créer un SmartElement suivant le modèle de workflow précédemment réalisé

Déclarer le graphe du cycle de vie

Recommandation

Si vous n’êtes pas familier avec les Graphes de cycle de vie et leur fonctionnement, il est fortement recommandé de lire la documentation associée disponible ici

Un menu a quatre états possibles différents et suivra le modèle suivant : RédactionEn testÀ la carteRetiré.

Nos fichiers de configurations étant générés. Pour définir le graphe, rendons-nous dans le fichier src/vendor/<vendorName>/<moduleName>/SmartStructures/Plat/PlatWorkflows/WfamPlatWorkflow/WfamPlatGraph.xml.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:workflow="https://platform.anakeen.com/4/schemas/workflow/1.0">
    <workflow:graph ns="GDC" name="WFAM_PLAT">
        <workflow:steps>
            <workflow:step name="plat_e0" state-label="Création" activity-label="Rédaction" initial="true"/>
            <workflow:step name="plat_e1" state-label="Créé" activity-label="En test"/>
            <workflow:step name="plat_e2" state-label="Testé" activity-label="À la carte"/>
            <workflow:step name="plat_e3" state-label="Retiré" activity-label="Retiré"/>
        </workflow:steps>
        <workflow:transitions>
            <workflow:transition name="t_plat_e0_e1" from="plat_e0" to="plat_e1" label="Rédigé"/>
            <workflow:transition name="t_plat_e1_e2" from="plat_e1" to="plat_e2" label="Valider"/>
            <workflow:transition name="t_plat_e2_e1" from="plat_e2" to="plat_e1" label="Retester"/>
            <workflow:transition name="t_plat_e2_e3" from="plat_e2" to="plat_e3" label="Retirer"/>
            <workflow:transition name="t_plat_e3_e2" from="plat_e3" to="plat_e2" label="Réhabiliter"/>
            <workflow:transition name="t_plat_e1_e3" from="plat_e1" to="plat_e3" label="Test échoué/abandonné"/>
            <workflow:transition name="t_plat_e3_e1" from="plat_e3" to="plat_e1" label="Remise en test"/>
        </workflow:transitions>
    </workflow:graph>
</smart:config>

Déclarer le modèle du cycle de vie

Recommandation

Si vous n’êtes pas familier avec les Modèles de Cycle de vie et leur fonctionnement, il est fortement recommandé de lire la documentation associée disponible ici

Le modèle d’un cycle de vie est une SmartStructure référençant le graphe et la définition des paramètres qui lui sont associés. Lors de l’utilisation de la commande createWorkflow, le paramètre WFAM_PLAT associé à l’argument --smartStructureName était donc le nom de modèle du cycle de vie créé.

Dans notre cas, le fichier .xml associé est le suivant, src/vendor/<vendorName>/<moduleName>/SmartStructures/Plat/PlatWorkflows/WfamPlatWorkflow/100-WfamPlatStructure.xml :

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <!-- Ce fichier permet d’ajouter des smart fields, des paramètres, des actions(hooks), de l’autocompletion et des valeurs par défaults pour le cycle de vie -->
    <!-- Lien vers le guide How To : https://documentation.ap4.anakeen.com/anakeen-platform-howto/CreateWorkflow/#howToCreateWorkflow -->
    <!-- Lien vers le manuel de référence : https://documentation.ap4.anakeen.com/anakeen-platform/workflow/#workflow-cycle-de-vie -->

    <smart:structure-configuration name="WFAM_PLAT" label="WfamPlat">
        <smart:extends ref="WDOC"/>
        <smart:icon file="wfam_plat.png"/>
        <smart:class>Cogip\Restauratec\SmartStructures\Plat\PlatWorkflows\WfamPlatWorkflow\WfamPlatBehavior</smart:class>
        <smart:fields/>
        <smart:hooks/>
        <smart:autocompletion/>
        <smart:defaults/>
    </smart:structure-configuration>
</smart:config>

Lors de la génération des fichiers de configuration, le fichier WfamPlatGraph.xml permettant de décrire le graphe du cycle de vie a déjà été associé au modèle de ce dernier dans la classe de comportement associée, dans le fichier WfamPlatBehavior.php. C’est aussi et surtout ici que peuvent se configurer par la programmation, des actions supplémentaires à effectuer lors des transitions :

Recommandation

Pour cela, il est conseillé de vous renseigner sur le fonctionnement de la Classe de comportement d’un modèle de cycle de vie

<?php

namespace Cogip\Restauratec\SmartStructures\Plat\PlatWorkflows\WfamPlatWorkflow;

/**
 * Workflow Behavior of WFAM_PLAT elements
 */
class WfamPlatBehavior extends \SmartStructure\Wdoc
{
  public function __construct($dbaccess = '', $id = '', $res = '', $dbid = 0)
  {
    parent::__construct($dbaccess, $id, $res, $dbid);
    $this->useWorkflowGraph(__DIR__ . "/WfamPlatGraph.xml");

    // @FIXME Insert Here transition configuration
  }
}

Paramétrer le Cycle de vie

Recommandation

Pour ce qui est de la déclaration d’une instance de Cycle de vie, je vous invite aussi à lire la documentation associée disponible ici

Ce qui représente notre instance de cycle de vie a aussi été généré lors de l’exécution de la commande createWorkflow. Nous avions nommé cette instance, qui est un SmartElement, WDOC_PLAT. On peut la configurer depuis le fichier src/vendor/<vendorName>/<moduleName>/SmartStructures/Plat/PlatWorkflows/WdocPlatWorkflow/510-WdocPlatWorkflowSettings.xml.

Dans un premier temps nous allons uniquement modifier les références de chacune des étapes (steps) afin qu’elles fassent référence aux étapes définies dans le graphe. Pourquoi ne pas en profiter pour donner un peu de couleurs à tout ça ?

src/vendor/<vendorName>/<moduleName>/SmartStructures/Plat/PlatWorkflows/WdocPlatWorkflow/510-WdocPlatWorkflowSettings.xml

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:workflow="https://platform.anakeen.com/4/schemas/workflow/1.0">
    <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
    <!--Timer and Mail templates workflow references-->
    <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
    <workflow:config xmlns:workflow="https://platform.anakeen.com/4/schemas/workflow/1.0" name="WDOC_PLAT" structure="PLAT" model="WFAM_PLAT">
        <workflow:steps/>
        <workflow:transitions/>
    </workflow:config>
    <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
    <!--Elements (color, cvdoc, masks) user interface referenced in workflow-->
    <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
    <workflow:config xmlns:workflow="https://platform.anakeen.com/4/schemas/workflow/1.0" name="WDOC_PLAT" structure="PLAT" model="WFAM_PLAT">
        <workflow:steps>
            <workflow:step ref="plat_e1">
                <workflow:color>#FFAA00</workflow:color>
            </workflow:step>
            <workflow:step ref="plat_e2">
                <workflow:color>#55FF00</workflow:color>
            </workflow:step>
            <workflow:step ref="plat_e3">
                <workflow:color>#FF4249</workflow:color>
            </workflow:step>
        </workflow:steps>
    </workflow:config>
    <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
    <!--Default workflow for the structure-->
    <!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
    <smart:structure-configuration name="PLAT">
        <smart:default-workflow ref="WDOC_PLAT"/>
    </smart:structure-configuration>
</smart:config>

Attention

Pensez à effectuer une réinstallation afin que l’application prenne en compte les modifications effectuées :

npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall

Résultat / Vérification

Voici la représentation des étapes et des transitions du cycle de vie des Plats généré par AP4 :

WorkflowGraph

Créons un plat et vérifions que celui-ci est automatiquement à l'état Rédaction à sa création et qu'il peut ensuite passer à l'état suivant, En test

localhost:8080/api/v2/smart-elements/PLAT/views/!defaultCreation.html

WorkflowExample

Et ensuite ?

Comment créer et associer une aide à la saisie à un Smart Field