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

Sitecore WFFM:以编程方式提交表单的问题,sitecore,sitecore8,web-forms-for-marketers,sitecore-mvc,sitecore-xdb,Sitecore,Sitecore8,Web Forms For Marketers,Sitecore Mvc,Sitecore Xdb,我一直在尝试向WFFM提交我自己的表格。我创建的表单与使用WFFM创建的表单相同,因此所有字段都正确映射 我开始遵循以下步骤: 我不得不对代码做一些小的修改,以使submitionmanager正常工作 Sitecore.Form.Core.Submit.SubmitActionManager类的成员 已移动到IActionExecutor接口。要获取 此接口的实例使用 (IActionExecutor)Factory.CreateObject(“wffm/wffmActionExecutor”

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

我开始遵循以下步骤:

我不得不对代码做一些小的修改,以使
submitionmanager
正常工作

Sitecore.Form.Core.Submit.SubmitActionManager类的成员 已移动到IActionExecutor接口。要获取 此接口的实例使用 (IActionExecutor)Factory.CreateObject(“wffm/wffmActionExecutor”, 错误)呼叫

以下是我目前掌握的代码:

public void SubmitData(ContactUsFormModel数据)
{
var results=新列表();
添加(makeControlResult(Models.Constants._-cufFirstNameID,“First Name”,data.FirstName));
添加(makeControlResult(Models.Constants._cufLastNameID,“Last Name”,data.LastName));
添加(makeControlResult(Models.Constants._cufEmailID,“Email”,data.Email));
添加(makeControlResult(Models.Constants._cufCompanyID,“Company”,data.Company));
添加(makeControlResult(Models.Constants._cufsubject,“Subject”,data.Subject));
添加(makeControlResult(Models.Constants._cufMessageID,“Message”,data.Message));
var formItem=Sitecore.Context.Database.GetItem(Models.Constants.\u contactUsFormID);
var simpleForm=新站点核心simpleForm(formItem);
var saveActionXml=simpleForm.FormItem.SaveActions;
var actionList=Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse(saveActionXml);
var actionDefinitions=新列表();
actionDefinitions.AddRange(actionList.Groups.SelectMany(x=>x.ListItems).Select(li=>newactionDefinition(li.ItemID,li.Parameters){UniqueKey=li.Unicid});
var SubmitActionManager=(IActionExecutor)Factory.CreateObject(“wffm/wffmActionExecutor”,false);
Sitecore.Form.Core.WffmActionEvent sessionID=新建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(字符串字段ID、字符串字段名、字符串字段值)
{
返回新的ControlResult(fieldName、fieldValue、string.Empty)
{
FieldID=FieldID,
FieldName=FieldName,
值=字段值,
参数=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对
MongoDB
xDB
的实现主要依赖于跟踪用户,称他们为
联系人

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

因此,您需要启动
Sitecore.Tracker
我建议使用以下代码

if(!Tracker.IsActive)
Tracker.StartTracking();
如果(!Tracker.IsActive | | Tracker.Current.Contact==null)
{
//手柄无追踪器和触点
}
现在您已经完成了跟踪工作,您需要为
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而不是变量SessionID

Tracker.Current.Interaction.InteractionId;

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

谢谢!这正是代码无法调用已保存操作的原因。然而,我仍然有一个问题。我在forms reports/mongoDB中没有看到表单数据,这会阻止我获取任何表单统计信息/报表。日志中没有错误。(我确实看到一个警告,但我很确定它完全不相关,但我仍然会发布它以防万一)>25368 12:12:50 CES发现服务上的警告身份验证失败。异常:System.Net.WebException消息:远程服务器返回错误:(403)禁止。来源:Sitecore.CES.Client.WebClient.ExecuteRequest(字符串请求URI)的System.Net.HttpWebRequest.GetResponse()的系统,Sitecore.CES.Client.ResourceConnector`1.Request(字符串端点,对象[]参数)的系统,Sitecore.CES.Discovery.EndpointSource.GetEndpoint(字符串>serviceName)在执行保存调用后,我尝试将保存表单添加到数据库调用。而且我没有看到它被存储
code
submitionmanager.SaveFormToDatabase(ID.Parse(Models.Constants._contactUsFormID),新的AdaptedResultList(adaptedResults));好的,很抱歉在这里闲聊。我想我在电视上说得太早了