I am trying to achieve the below,
When a link is accessed I want to approve/delete a record (with recordId and action type in querystring) by calling change record status workflow in a controller. Is it possible to execute a workflow from controller
When a record is submitted, I want to check if the record with email already exists and stop form from saving new record in this case. I am hooking into the RecordInserting event to do some stuff but wondering if I could skip the record saving and Cancel/Stop all workflows from executing.
Thanks
To run a workflow from code, you need to access the WorkflowStorage class, which allows you to retrieve a workflow based on it's GUID. To do this, something like:
var workflowStorage = new WorkflowStorage();
var workflow = GetWorkflow(PUT YOUR GUID HERE);
You can the run the workflow using the WorkflowService:
var workflowService = new WorkflowService();
var workflowList = new List<Workflow> {workflow};
//NOTE, "e" is a recordEventArgs object
workflowService.ExecuteWorkflows(workflowList, e);
workflowService.DisposeIfDisposable();
workflowStorage.Dispose();
Should work. Populating the RecordEventArgs might require a bit iff trial and error though. The above code was taken from something that runs a different workflow depending on the values selected in a form, and runs inside another workflow, so e is already populated for you.
The namespaces you'll need are:
using Umbraco.Forms.Core;
using Umbraco.Forms.Core.Enums;
using Umbraco.Forms.Core.Services;
using Umbraco.Forms.Data.Storage;