我最近對這個問題有類似的要求。 The answer above from Jesper Hoff如果您只需要將表單數據保存到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", "[email protected]"));
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解析後,你不是在一個平面列表,所以你需要使用像SelectMany()
在使用前將其平整)
上面提到的makeControlResult()
方法只是爲了使片段更清晰。它只是創建一個從數據有關表單字段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。這篇文章還包含了一個關於如何找回Save Actions可能產生的錯誤的片段 - 當你使用多個Save Actions時這可能很重要。
老兄,如果我可以擁抱你我會... –
這不再適用於Sitecore 8.0+。 'Sitecore.Forms.Data'不再有一個名爲'InsertForm'的方法。 – Paul