Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Ben Palmer 180 posts 866 karma points c-trib
    Apr 30, 2021 @ 11:54
    Ben Palmer
    0

    Umbraco Forms - Editing Email Template

    Hi,

    Trying and failing to edit the default email view in Umbraco Forms in the standard "Send email" workflow.

    I'm aware that there is a workflow to send via Razor but it doesn't allow editors to add a message from the CMS like "Send email" does.

    So, two options

    1. How do I edit the template used in the "Send email" workflow type?
    2. Is it possible to add a new field to the "Send email with template (Razor)" workflow type?

    Thanks,

    Ben

  • Ben Palmer 180 posts 866 karma points c-trib
    Apr 30, 2021 @ 15:08
    Ben Palmer
    0

    Done quite a lot more digging and hidden away on the documentation page is this beauty:

    https://our.umbraco.com/documentation/Add-ons/UmbracoForms/Developer/Extending/Adding-a-Type#overriding-default-providers-in-umbraco-forms

    So for anyone else who happens to have the same issue, you can override/extend existing workflow types. Here's some sample code to show you how I did it (beware of the session "hack" - it's the only way I could find out how to pass data to the view, not ideal but it does work).

    Workflow Definition:

    using System.Web;
    using Umbraco.Core;
    using Umbraco.Forms.Core;
    using Umbraco.Forms.Core.Attributes;
    using Umbraco.Forms.Core.Data.Storage;
    using Umbraco.Forms.Core.Enums;
    using Umbraco.Forms.Core.Persistence.Dtos;
    using Umbraco.Forms.Core.Services;
    using Umbraco.Web;
    
    namespace Example.Core.WorkflowTypes
    {
        public class SendRazorEmailWorkflowType : Umbraco.Forms.Core.Providers.WorkflowTypes.SendRazorEmail
        {
            #region Constructors
    
            public SendRazorEmailWorkflowType(IHttpContextAccessor httpContextAccessor, IFieldTypeStorage fieldTypeStorage, IFormStorage formStorage, IUmbracoContextAccessor umbracoContextAccessor, IPageService pageService, IWorkflowEmailService workflowEmailService)
                : base(httpContextAccessor, fieldTypeStorage, formStorage, umbracoContextAccessor, pageService, workflowEmailService)
            {
    
            }
    
            #endregion
    
            #region Settings
    
            [Setting("Email Introduction", Description = "Displayed before the records in the email body.", View = "TextArea")]
            public string EmailIntroduction { get; set; }
    
            [Setting("Email Body", Description = "Displayed after the introduction.", View = "TextArea")]
            public string EmailBody { get; set; }
    
            [Setting("Email Records Text", Description = "Displayed before the records are shown.", View = "TextArea")]
            public string EmailRecordsText { get; set; }
    
            [Setting("Email Outro", Description = "Displayed after the email body.", View = "TextArea")]
            public string EmailOutro { get; set; }
    
            [Setting("Email Link URL", Description = "Optional link, if set, a button will be displayed in the email.", View = "TextString")]
            public string EmailLinkUrl { get; set; }
    
            [Setting("Email Link Title", Description = "Optional link title, if the Email Link URL is set, this text will be used on the button.", View = "TextString")]
            public string EmailLinkTitle { get; set; } = "Learn more";
    
            [Setting("Show Records in Email", Description = "If enabled, the email will display the fields submitted.", View = "Checkbox")]
            public string ShowRecordsInEmail { get; set; }
    
            #endregion
    
            public override WorkflowExecutionStatus Execute(Record record, RecordEventArgs e)
            {
                HttpContext.Current.Session["emailIntroduction"] = EmailIntroduction;
                HttpContext.Current.Session["emailBody"] = EmailBody;
                HttpContext.Current.Session["emailRecordsText"] = EmailRecordsText;
                HttpContext.Current.Session["emailOutro"] = EmailOutro;
                HttpContext.Current.Session["emailLinkUrl"] = EmailLinkUrl;
                HttpContext.Current.Session["emailLinkTitle"] = EmailLinkTitle;
                HttpContext.Current.Session["showRecordsInEmail"] = ShowRecordsInEmail;
    
                if (EmailLinkTitle.IsNullOrWhiteSpace())
                {
                    HttpContext.Current.Session["emailLinkTitle"] = "Read more";
                }
    
                return base.Execute(record, e);
            }
        }
    }
    

    View/Razor File (I've only included how to retrieve the data here, but you can use these variables however you want from there on out):

    @inherits UmbracoViewPage<Umbraco.Forms.Core.Models.FormsHtmlModel>
    
    @{
        //This is an example email template where you can use Razor Views to send HTML emails
    
        //You can use Umbraco.TypedContent & Umbraco.TypedMedia etc to use Images & content from your site
        //directly in your email templates too
    
        //Strongly Typed
        //@Model.GetValue("aliasFormField")
        //@foreach (var color in Model.GetValues("checkboxField")){}
    
        //Dynamics
        //@Model.DynamicFields.aliasFormField
        //@foreach(var color in Model.DynamicFields.checkboxField
    
        //Images need to be absolute - so fetching domain to prefix with images
        var siteDomain = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
        var assetUrl = siteDomain + "/assets/images";
    
        var emailIntroduction = HttpContext.Current.Session["emailIntroduction"];
        var emailBody = HttpContext.Current.Session["emailBody"];
        var emailRecordsText = HttpContext.Current.Session["emailRecordsText"];
        var emailOutro = HttpContext.Current.Session["emailOutro"];
        var emailLinkUrl = HttpContext.Current.Session["emailLinkUrl"];
        var emailLinkTitle = HttpContext.Current.Session["emailLinkTitle"];
        var showRecordsInEmail = HttpContext.Current.Session["showRecordsInEmail"];
    }
    

    Thanks,

    Ben

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies