当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SitecoreWFFM:以编程方式提交表单的问题》经验,为你挑选了1个好方法。

我一直试图将自己的表格提交给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();
        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();
        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

Jonathan Rob.. 7

当您使用Sitecore 8表单提交时,存储在MongoDB.Sitecore的实施MongoDB,xDB主要依赖于跟踪用户,调用它们Contacts.

存储的大多数数据xDB都链接到Contacta ContactId.您在日志中找到的错误消息表明当前未启用跟踪,因此不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.Form.Core.Analytics.AnalyticsTracker.SessionId已删除Sitecore 8中的博客.我反编译Sitecore 7代码和Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId最终使用Tracker.CurrentVisit.VisitId.

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

Tracker.Current.Interaction.InteractionId;

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



1> Jonathan Rob..:

当您使用Sitecore 8表单提交时,存储在MongoDB.Sitecore的实施MongoDB,xDB主要依赖于跟踪用户,调用它们Contacts.

存储的大多数数据xDB都链接到Contacta ContactId.您在日志中找到的错误消息表明当前未启用跟踪,因此不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.Form.Core.Analytics.AnalyticsTracker.SessionId已删除Sitecore 8中的博客.我反编译Sitecore 7代码和Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId最终使用Tracker.CurrentVisit.VisitId.

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

Tracker.Current.Interaction.InteractionId;

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


太棒了 - 很高兴结果显示正确.它们不会立即出现,因为它们存储在会话中并在用户会话结束时写入MongoDB.通常在最后一次活动后约20分钟.然后将结果写入MongoDB,最终写入报告SQL数据库.这种设计选择是为Mongo节省昂贵的重复呼叫
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有