Add a new class to your project and have it inherit from Umbraco.Forms.Core.WorkflowType, and implement the class. For this sample, we will focus on the execute method. This method processes the current record (the data submitted by the form) and have the ability to change data and state.
usingSerilog;usingSystem;usingSystem.Collections.Generic;usingUmbraco.Forms.Core;usingUmbraco.Forms.Core.Data.Storage;usingUmbraco.Forms.Core.Enums;usingUmbraco.Forms.Core.Persistence.Dtos;usingMicrosoft.Extensions.Logging;usingUmbraco.Core.Composing;namespaceMyFormsExtensions{publicclassTestWorkflow:WorkflowType {privatereadonlyILogger<TestWorkflow> _logger;publicTestWorkflow(ILogger<TestWorkflow> logger) { _logger = logger;this.Id=newGuid("ccbeb0d5-adaa-4729-8b4c-4bb439dc0202");this.Name="TestWorkflow";this.Description="This workflow is just for testing";this.Icon="icon-chat-active";this.Group="Services"; }publicoverrideTask<WorkflowExecutionStatus> ExecuteAsync(WorkflowExecutionContext context) { // first we log it_logger.LogDebug("the IP "+context.Record.IP+" has submitted a record"); // we can then iterate through the fieldsforeach (RecordField rf incontext.Record.RecordFields.Values) { // and we can then do something with the collection of values on each fieldList<object> vals =rf.Values; // or get it as a stringrf.ValuesAsString(false); } //Change the statecontext.Record.State=FormState.Approved; _logger.LogDebug("The record with unique id {RecordId} that was submitted via the Form {FormName} with id {FormId} has been changed to {RecordState} state",
context.Record.UniqueId, context.Form.Name, context.Form.Id, "approved");returnTask.FromResult(WorkflowExecutionStatus.Completed); }publicoverrideList<Exception> ValidateSettings() {returnnewList<Exception>(); } }}
Information available to the workflow
Record information
The ExecuteAsync() method gets a WorkflowExecutionContext which has properties for the related Form, Record, and FormState. This parameter contains all information related to the workflow.
The Record contains all data and metadata submitted by the form. As shown in the example above, you can iterate over all RecordField values in the form. You can also retrieve a specific record field by alias using the following method:
Having obtained a reference to a record field, the submitted value can be retrieved via:
var fieldValue =recordField.ValuesAsString(false);
The ValuesAsString will JSON escape the result by default. If you do not want this escaping to occur, pass false as the parameter.
If the field stores multiple values, they are delimited with a comma. In many cases, you can safely split on that delimiter to obtain the individual values. However, this can lead to issues if the prevalues being selected also contain commas. If that's a concern, the following extension method is available in Umbraco.Forms.Core.Extensions to correctly parse the selected prevalues:
The Form references the form the record is from and FormState provides its state (submitted or approved).
Other context, such as the current HttpContext, if needed can be passed as constructor parameters (for example: the HttpContext can be accessed by injecting IHttpContextAccessor).
Registering the workflow type
To use the new workflow type, you will need to register it as part of application startup.