Sitecore WFFM:以编程方式提交表单的问题

Sitecore WFFM: Issues Submitting form programmatically

我一直在尝试向 WFFM 提交我自己的表格。我创建的表单与使用 WFFM 创建的表单相同,这样所有字段都可以正确映射。

我开始执行以下步骤:https://jermdavis.wordpress.com/2015/05/18/programmatic-wffm-submissions/

为了使 SubmitActionManager 正常工作,我不得不对代码进行一些小改动

The members of Sitecore.Form.Core.Submit.SubmitActionManager class have been moved to the IActionExecutor interface.To obtain the instance of this interface use the (IActionExecutor)Factory.CreateObject ("wffm/wffmActionExecutor", false) call.

下面是我目前的代码:

public void SubmitData(ContactUsFormModel data)
    {
        var results = new List<ControlResult>();
        results.Add(makeControlResult(Models.Constants._cufFirstNameID, "First Name", data.FirstName));
        results.Add(makeControlResult(Models.Constants._cufLastNameID, "Last Name", data.LastName));
        results.Add(makeControlResult(Models.Constants._cufEmailID, "Email", data.Email));
        results.Add(makeControlResult(Models.Constants._cufCompanyID, "Company", data.Company));
        results.Add(makeControlResult(Models.Constants._cufSubjectID, "Subject", data.Subject));
        results.Add(makeControlResult(Models.Constants._cufMessageID, "Message", data.Message));

        var formItem = Sitecore.Context.Database.GetItem(Models.Constants._contactUsFormID);
        var simpleForm = new SitecoreSimpleForm(formItem);
        var saveActionXml = simpleForm.FormItem.SaveActions;
        var actionList = Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse(saveActionXml);

        var actionDefinitions = new List<ActionDefinition>();
        actionDefinitions.AddRange(actionList.Groups.SelectMany(x => x.ListItems).Select(li => new ActionDefinition(li.ItemID, li.Parameters) { UniqueKey = li.Unicid }));

        var SubmitActionManager = (IActionExecutor)Factory.CreateObject("wffm/wffmActionExecutor", false);
        Sitecore.Form.Core.WffmActionEvent sessionID = new Sitecore.Form.Core.WffmActionEvent();// SessionIDGuid

        var result = SubmitActionManager.ExecuteSaving(ID.Parse(Models.Constants._contactUsFormID), results.ToArray(), actionDefinitions.ToArray(), true, ID.Parse( sessionID.SessionIDGuid ));
    }

    private ControlResult makeControlResult(string fieldID, string fieldName, string fieldValue)
    {
        return new ControlResult(fieldName, fieldValue, string.Empty)
        {
            FieldID = fieldID,
            FieldName = fieldName,
            Value = fieldValue,
            Parameters = string.Empty
        };
    }

我不确定从哪里得到 Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId 以在 ExecuteSaving 中使用它,所以我使用了 WffmActionEvent。 此外,我遵循的指南使用 Execute,现在已弃用,因此我不得不使用 ExecureSaving(我最好的猜测)。

但这似乎并没有将提交的数据发布到数据库中。我无法在 WFFM 表单报告或 mongoDB 中看到我提交的任何内容。 然而,日志指出表单正在保存到数据库中,不确定其他警告的含义。

24688 17:20:39 WARN  [WFFM] Tracker.Current  is not initialized
24688 17:20:39 INFO  AUDIT (sitecore\admin): [WFFM] Form {978DBF4C-0F56-45A8-A9AC-52EF8D995DDF} is saving to db
24688 17:20:39 WARN  [WFFM] Tracker.Current.Contact  is not initialized
24688 17:20:39 WARN  [WFFM]  Tracker.Current.Interaction  is not initialized
24688 17:20:39 WARN  [WFFM] CurrentSession  is not initialized

当您使用 Sitecore 8 时,表单提交存储在 MongoDB 中。 Sitecore 对 MongoDBxDB 的实现主要依赖于跟踪用户,称他们为 Contacts.

大多数存储在 xDB 中的数据都通过 ContactId 链接到 Contact。您在日志中找到的错误消息表明当前未启用跟踪,因此不存在 Contact,并且站点和用户之间没有 Interaction

所以你需要开始Sitecore.Tracker我推荐使用下面的代码

if (!Tracker.IsActive)
    Tracker.StartTracking();

if (!Tracker.IsActive || Tracker.Current.Contact == null)
{
    // handle no tracker and contact
}

现在您已经开始跟踪工作,您需要为您的 sessionID 变量使用正确的 ID。

您关注的博客基于 Sitecore 7,在 Sitecore 8 中已删除 Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId。我反编译了 Sitecore 7 代码,Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId 最终使用 Tracker.CurrentVisit.VisitId.

但是此命名空间在 Sitecore 8 中已更改,访问现在称为交互,因此您将要使用的不是变量 SessionID

Tracker.Current.Interaction.InteractionId;

这应该可以解决您目前遇到的问题,但您可能需要更多的开发才能完成它。