【问题标题】:Sitecore WFFM: Issues Submitting form programmaticallySitecore WFFM:以编程方式提交表单的问题
【发布时间】:2016-01-05 23:10:00
【问题描述】:

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

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

为了让SubmitActionManager 正常工作,我必须对代码进行一些小改动

Sitecore.Form.Core.Submit.SubmitActionManager 类的成员 已移至 IActionExecutor 接口。获取 此接口的实例使用 (IActionExecutor)Factory.CreateObject ("wffm/wffmActionExecutor", false) 调用。

下面是我目前的代码:

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 sitecore8 web-forms-for-marketers sitecore-mvc sitecore-xdb


    【解决方案1】:

    当您使用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;
    

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

    【讨论】:

    • 谢谢!这正是阻止代码调用已保存操作的原因。但是我仍然有一个问题。我在表单报告/mongoDB 中看不到表单数据,这使我无法获取任何表单统计信息/报告。日志中没有错误。 (我确实看到了一个警告,但我很确定它完全不相关,但我还是会发布它以防万一)
    • > 25368 12:12:50 警告 CES Discovery 服务上的身份验证失败。异常:System.Net.WebException 消息:远程服务器返回错误:(403)禁止。来源: System.Net.HttpWebRequest.GetResponse() at Sitecore.CES.Client.WebClient.ExecuteRequest(String requestUri) at Sitecore.CES.Client.ResourceConnector`1.Request(String endpoint, Object[] parameters) 在 Sitecore .CES.Discovery.EndpointSource.GetEndpoint(String > serviceName)
    • 我尝试在执行 ExecuteSaving 调用后添加 SaveFormToDatabase 调用。而且我没有看到它被存储。 codeSubmitActionManager.SaveFormToDatabase(ID.Parse(Models.Constants._contactUsFormID), new AdaptedResultList(adaptedResults));
    • 好的,抱歉在这里乱讲。我想我在最后一个上说得太早了。不知道为什么我希望结果会立即出现在 SQL 中……但它们最终会被处理和存储。所以它正确地保存了表格。我最终会用正确的解决方案更新帖子。
    • 太好了 - 很高兴结果显示正确。它们不会立即出现,因为它们存储在会话中并在用户会话结束时写入 MongoDB。通常在最后一次活动后约 20 分钟。然后将结果写入 MongoDB 并最终写入报告 SQL 数据库。这种设计选择是为了节省对 Mongo 的昂贵重复调用
    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2011-02-06
    相关资源
    最近更新 更多