如何将一些信息传递到 Sitecore Webforms for Marketers 自定义消息处理器管道?

How can I pass some information in to a Sitecore Webforms for Marketers custom message processor pipeline?

我有一个使用 Sitecore 7.5 和 Webforms for Marketers 2.5 构建的网站。我正在尝试创建一个自定义电子邮件消息处理器管道命令,该命令将在电子邮件发出之前更改电子邮件的 TO 字段。但是正确的电子邮件地址需要来自 Session 变量。

这是我的 class:

public class CustomEmailMessageProcessor
{
    public void Process(ProcessMessageArgs args)
    {
        //Change the TO address for the email based on the selection in the Subject field
        var subjectField = args.Fields.GetEntryByName("Subject");
        if (subjectField == null)
        {
            return;
        }

        //The value of the selected item will be the ID of a Subject Option
        var selectedSubjectOptionItem = Sitecore.Context.Database.GetItem(new ID(subjectField.Value));
        if (selectedSubjectOptionItem == null)
        {
            return;
        }

        var selectedSubjectOption = selectedSubjectOptionItem.GlassCast<Contact_Us_Subject_Option>();

    //Based on the currently selected Region in the Session variable, get the proper
    //child of selectedSubjectOption to populate the TO field
        ???

        if (args.To.Length != 0)
        {
            args.To.Append(",");
        }
        args.To.Append(proper email address goes here);
    }
}

这是我的相关配置:

  <processMessage>
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="ExpandLinks" />
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="ExpandTokens" />
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="AddHostToItemLink" />
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="AddHostToMediaItem" />
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="AddAttachments" />
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="BuildToFromRecipient" />
    <!-- Custom setting -->
    <processor type="myProject.CustomEmailMessageProcessor, myProject" method="Process" />
    <processor type="Sitecore.Form.Core.Pipelines.ProcessMessage.ProcessMessage, Sitecore.Forms.Core" method="SendEmail" />
  </processMessage>

用户将从表单的下拉列表中 select 主题。每个 Subject 的值将是相应项目的 Guid。该主题项目将有 children。每个 child 将有一个电子邮件地址,并对应于系统中的一个区域项目。然后,我将找到与存储在会话中的区域 ID 相匹配的 child 项。然后我就会有正确的电子邮件地址来发送电子邮件。

但是我不知道如何从管道内访问 Session 变量(或者如果可能的话)。它不一定是会话。我很高兴以其他方式传递当前 selected 区域。我只需要一些方法来传递可以从管道代码访问的信息。

谢谢, 科里

使用 Sitecore WFFM 网络服务时,CMS 上的保存操作是 运行,shell 站点。保存操作对用户会话一无所知。 一个不同的更标准的解决方案是创建一个(自定义)隐藏字段,并在那里设置可用于查找所需电子邮件地址的值。 创建自定义保存操作并在那里发送电子邮件。

注意:如果您没有很好的标识符来查找电子邮件地址,请注意将电子邮件地址或简单标识符放在(隐藏)表单值中,它可能会被滥用。

隐藏字段示例,基于 Webforms<input type="text" .....>

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using Sitecore.Form.Web.UI.Controls;

namespace StockpickSitecore.Controls.WFFM.CustomFields
{
    public class HiddenEmailfield : SingleLineText
    {
        private static readonly string baseCssClassName = "scfSingleLineTextBorder";
        private string CssClassName { get; set; }

        public int MaxLength
        {
          get
          {
            return this.textbox.MaxLength;
          }
          set
          {
            this.textbox.MaxLength = value;
          }
        }

        public int MinLength { get; set; }

        public new string CssClass
        {
          get
          {
            return base.CssClass;
          }
          set
          {
            base.CssClass = value;
          }
        }

        public HiddenEmailfield()
        {
            this.Text = "info@yourdomein.com";
        }

        protected override void OnInit(EventArgs e)
        {
            this.Attributes.Add("style", "display: none;");
          this.textbox.CssClass = "scfSingleLineTextBox";
          this.help.CssClass = "scfSingleLineTextUsefulInfo";
          this.generalPanel.CssClass = "scfSingleLineGeneralPanel";
          this.title.CssClass = "scfSingleLineTextLabel";
          this.textbox.TextMode = TextBoxMode.SingleLine;
          this.Controls.AddAt(0, (Control) this.generalPanel);
          this.Controls.AddAt(0, (Control) this.title);
          this.generalPanel.Controls.AddAt(0, (Control) this.help);
          this.generalPanel.Controls.AddAt(0, (Control) this.textbox);
        }
    }
}

更改构造函数 HiddenEmailfield 并使用 Session 值设置 this.Text。

在 /sitecore/system/Modules/Web 表格下方的 Sitecore 中创建一个项目 Marketers/Settings/Field Types/Custom/ 基于模板:/sitecore/templates/Web 表单 Marketers/Field 类型

填写程序集:例如 StockpickSitecore

填写Class:StockpickSitecore.Controls.WFFM.CustomFields.HiddenEmailfield

现在您可以在 webform als 字段类型中使用 HiddenEmailfield