我最近对这个问题有类似的要求。来自Jesper Hoff 的The answer above 非常棒,如果您需要做的只是将表单数据保存到为WFfM 配置的数据库中。但是,它没有执行与表单关联的保存操作。因此,如果您想将提交记录到 SQL Server 中是可以的,但如果您需要通过电子邮件发送它们,或者将它们传输到 CRM,这将无济于事。我需要在我正在处理的代码中进行电子邮件发送工作,因此我对 WFfM 的内部进行了更多挖掘:
如果您希望基于代码的提交遵循为表单配置的保存操作,那么您需要对上面的代码进行三个关键更改:
- 首先你需要使用
Sitecore.Form.Core.Submit.SubmitActionManager.Execute()方法而不是Sitecore.Forms.Data.DataManager.InsertForm()。当您发回有效表单时,这似乎是 WFfM 内部调用的内容。
- 其次,您需要获取并配置已为您的 WFfM 设置的保存操作集以进行定义。要以正确的格式获取这些数据,还需要进行一些调整。
- 第三,您需要将表单数据收集为
ControlResult 对象而不是AdaptedControlResult。作为对Execute() 的调用的一部分,您传入的数据会自动包装。
为了清楚起见忽略错误检查,我最终得到了这样的代码:
List<ControlResult> results = new List<ControlResult>();
results.Add(makeControlResult(_nameFieldID, "Name", "Bob Jones"));
results.Add(makeControlResult(_emailFieldID, "Email", "B.Jones@test.com"));
results.Add(makeControlResult(_messageFieldID, "Message", "Lorem ipsum. Dolor sit amet."));
Item formItem = Sitecore.Context.Database.GetItem(_yourFormID);
SitecoreSimpleForm simpleForm = new SitecoreSimpleForm(formItem);
var saveActionXml = simpleForm.FormItem.SaveActions;
var actionList = Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse(saveActionXml);
List<ActionDefinition> actionDefinitions = new List<ActionDefinition>();
actionDefinitions.AddRange(actionList.Groups.SelectMany(x => x.ListItems).Select(li => new ActionDefinition(li.ItemID, li.Parameters) { UniqueKey = li.Unicid }));
Sitecore.Form.Core.Submit.SubmitActionManager.Execute(_formID, results.ToArray(), actionDefinitions.ToArray());
保存操作集及其配置保存在表单的Item 中,但您必须将项目包装在SitecoreSimpleForm 对象中才能将其取出。您返回的是 XML,因此您需要使用 Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse() 方法对其进行解析,以便返回一组反序列化的 Save Action 对象。但是,它们不是 SubmitActionManager 的正确对象类型,因此您需要将它们投影到 ActionDefinition 对象中才能使用它们。
(请注意,解析 XML 后获得的 Save Action 对象不在平面列表中,因此在使用它们之前需要使用 SelectMany() 之类的东西将其展平)
上面引用的makeControlResult()方法只是为了让sn-p更清晰。它只是根据表单字段的数据创建一个ControlResult 对象:
public ControlResult makeControlResult(string fieldID, string fieldName, string fieldValue)
{
return new ControlResult(fieldName, fieldValue, string.Empty)
{
FieldID = fieldID,
FieldName = fieldName,
Value = fieldValue,
Parameters = string.Empty
};
}
根据您获取数据的方式,您可能更愿意使用其他答案中的方法的变体来生成此数据。
我也是wrote up a bit more detail of how I arrived at this answer on my blog。该帖子还包含一个关于如何恢复保存操作可能生成的任何错误的 sn-p - 这在您使用多个保存操作时可能很重要。