我一直试图将自己的表格提交给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
都链接到Contact
a 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;
这应该可以解决您目前遇到的问题,但您可能需要更多的开发才能完成它.
当您使用Sitecore 8
表单提交时,存储在MongoDB
.Sitecore的实施MongoDB
,xDB
主要依赖于跟踪用户,调用它们Contacts
.
存储的大多数数据xDB
都链接到Contact
a 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;
这应该可以解决您目前遇到的问题,但您可能需要更多的开发才能完成它.