[英]Saving Sitecore Web form for marketers programmatically
如何在不使用提交按钮的情况下保存表单(我在页面上有另一个触发器可用于运行保存代码)。 该表单永远不会向用户显示,我只需要将其保存到营销人员数据库的 Web 表单中,当然除非有更智能的方法。
我可以很好地使用它
Sitecore.Forms.Core.Data.FormItem form =
Sitecore.Forms.Core.Data.FormItem.GetForm(formID);
然而,我想
(即类似的东西)
form.Fields["Name"] = "Test name";
// this wont work, I dont know how to access the field's value before I store it.
在我修改了字段之后,我当然想保存它。
这样做的方法是首先获取表单的副本,使用 AdaptedControlResult 列表设置其字段,然后使用 InsertForm 保存它。 这样它就会正确地出现在 WFFM 的数据表中。
代码中使用的 customerInfo 来自 CartHelper,但它可以是任何东西。
代码:
string formID = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";
DataUri uri = new DataUri(new ID(formID));
Sitecore.Data.Items.Item formItem = Sitecore.Context.Database.GetItem(uri);
// if the item exists, run through all the known fields and add the values from the customerinfo into them.
if (formItem != null)
{
List<AdaptedControlResult> acrList = new List<AdaptedControlResult>();
Sitecore.Data.Items.Item[] fieldItems = formItem.Axes.GetDescendants();
foreach (Sitecore.Data.Items.Item fieldItem in fieldItems) //.Where(x => x.TemplateName == "Field"))
{
if (fieldItem.Name == "E-mail")
{
acrList.Add(new AdaptedControlResult(new ControlResult(fieldItem.Name, System.Web.HttpUtility.UrlDecode(customerInfo.Email), string.Empty) { FieldID = fieldItem.ID.ToString(), FieldName = fieldItem.Name, Value = System.Web.HttpUtility.UrlDecode(customerInfo.Email) }, true));
continue;
}
// same for all other fields.
}
// save data
if (acrList.Count > 0)
{
AdaptedResultList arl = new AdaptedResultList(acrList);
try
{
Sitecore.Forms.Data.DataManager.InsertForm(formItem.ID, arl, Sitecore.Data.ID.NewID, null);
}
catch (Exception ex)
{
// Log data here
}
}
}
如果您尝试以编程方式将数据提交到数据库中的 WFFM 表,您可以使用以下命令:
假设您在此类的列表中填充了字段列表:
public class WffmField
{
public string FieldName { get; set; }
public string FieldGuid { get; set; }
public string FieldValue { get; set; }
}
字段 guid 将是来自 sitecore 的 guid:
然后您可以保存到 WFFM 数据库:
// This should be populated with the data you want to send to the WFFM database
var fields = new List<WffmField>();
var wffmDatabaseFields = fields.Select(GetWFFMDatabaseField).ToList();
Sitecore.Forms.Data.DataManager.InsertForm(
formId: new Sitecore.Data.ID("<Form guid here>"),
fields: new AdaptedResultList(wffmDatabaseFields),
sessionID: AnalyticsTracker.SessionId,
data: null);
希望这可以帮助!
如果我理解你的问题; 你在这里混淆了两个原则。 你想让一个表单通过它自己单独的提交例程 - 但看起来你也在尝试编写自己的表单提交,使用永远不会以你描述的方式工作的服务器端代码。
从页面上的另一个控件提交 WFM 的最佳方法是让它仍然使用表单上的“提交”类型的按钮,但使用 CSS 隐藏实际控件。 它有一个独特的 css 类,您可以使用它来隐藏它。 然后 - 从您想要控制提交的页面的其他区域,触发隐藏控件的 OnClick 事件以使表单回发并保存内容。
您的代码; 我阅读它的方式; 正在尝试读取 Sitecore 表单项,然后访问该 Sitecore 项的字段集合。 这个字段集合与您的表单没有直接关系,并且永远不会保存用户当前在站点上输入的实际数据。
我最近对这个问题有类似的要求。 如果您需要做的只是将表单数据保存到 WFfM 的配置数据库中,那么上面来自Jesper Hoff的答案非常好。 然而,它不执行与表单关联的保存操作。 因此,如果您想将提交的内容记录到 SQL Server 中是可以的,但是如果您需要通过电子邮件发送它们或将它们传输到 CRM,则无济于事。 我需要在我正在处理的代码中使电子邮件发送工作,所以对 WFfM 的内部做了更多的挖掘:
如果您希望基于代码的提交遵循为表单配置的保存操作,那么您需要对上面的代码进行三个关键更改:
Sitecore.Form.Core.Submit.SubmitActionManager.Execute()
方法而不是Sitecore.Forms.Data.DataManager.InsertForm()
。 当您回发有效表单时,这似乎是 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()
方法只是为了使代码片段更清晰。 它只是从有关表单字段的数据创建一个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
};
}
根据您获取数据的方式,您可能更喜欢使用其他答案中方法的变体来生成此数据。
我还在我的博客上写了更多关于我如何得出这个答案的细节。 该帖子还包含一个关于如何恢复保存操作可能产生的任何错误的片段——这在您使用多个保存操作时可能很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.