网站核心|WFFM|带有详细信息的自定义错误消息|与表格在同一页面上
Sitecore|WFFM| Custom Error Message with details| on Same Page with Form
我为我的一个页面设置了一个营销人员 Web 表单。
我已经为它编写了自定义提交操作,如下面的代码片段所示 -
public class **CustomFormSubmit : ISaveAction**
{
public void Execute(ID formid, AdaptedResultList fields, params object[] data)
{
try
{
**//var returnValue= Custom Logic to save form data // returns true or false**
}
catch (Exception ex)
{
Logger.Log(ex.Message + ":" + builder, ExceptionCategory.Error);
throw;
}
}
在我上面的 Web 表单中 - 成功模式是 - SuccessMode/Redirect 并且我为其配置了一个成功页面。
我在上述场景中的要求是,如果 returnValue 为 false,则让用户保持在同一页面(使用表单)。 (如上代码段所示)
任何人都可以在上述情况下指导我 - 如何让用户在表单中填写值的同一页面上,以便用户可以再次提交。
产品详细信息 - 7.2 修订版。 141226,面向营销人员的 Web 表单 2.4 修订版 140117
添加进一步的细节-
如果上面的代码片段中 return 为假,我不确定如何返回我的页面而不是重定向。
一旦提交按钮被点击,上面的函数——Execute——就会被调用。
如何返回页面 - 我是否需要覆盖任何功能或自定义某些内容。
如果在保存数据时出现任何异常 - 然后控件将返回到同一页面并保留用户填写的所有值 - 保存操作失败在 Sitecore 中配置的消息。
所以我的要求是在保存数据时以 return 值出现异常时转到表单,并放置可能会更改的自定义错误消息时间,所以不是静态配置的,而是动态配置的。
谢谢!
索拉布
一个选项是重定向到打开表单的原始页面。
使您的表单能够使用 ReadQueryString
属性 通过查询字符串填充字段,通过表单呈现器的演示详细信息:
因此,在 Save Action
的 false
上,您创建了一个查询字符串集合,其中包含每个字段的名称,如表单中显示的那样,后跟用户的值。
下面的代码将循环遍历您的所有字段,并将它们排列成一个带有 FieldName 和 Value 的 QueryString;
string urlOfForm = HttpContext.Current.Request.Url.AbsolutePath;
var queryString = new StringBuilder("?");
foreach (AdaptedControlResult field in fields)
{
queryString.Append(string.Format("{0}={1}&", field.FieldName, field.Value));
}
urlOfForm = urlOfForm + queryString;
HttpContext.Current.Response.Redirect(urlOfForm);
Sitecore 随后会自动使用这些值填充适当的字段,从而满足您的要求。
编辑
我发现抛出的大多数异常都会将用户带回到填充了值的表单。然后,您可以传递写入 CRM 失败的原因。请参阅下面的示例
if (submitFailed)
{
throw new Exception("The email address entered already exists in our System");
}
复杂性在于动态换出 Save Action Failed Message
以显示此 Exception Message
。我找到的所有关于自定义保存操作消息的帖子都指出,唯一真正的方法是通过自定义 Save Action
重定向到显示不同消息的不同页面。哪个不符合你的要求。
我找到了您需要修补 FormSubmitFailedArgs
和 SubmitFailedArgs
的管道参数。前者需要进行以下更改
public FormSubmitFailedArgs(ID formID, AdaptedResultList fields, ID actionFailed, Exception ex)
: base(formID, actionFailed, ex)
{
this.Fields = fields;
this.ErrorMessage = ex.Message;
}
后者需要
public SubmitFailedArgs(ID formID, ID actionFailed, string errorMessage, Exception innerException)
{
this.FormID = formID;
this.ActionFailed = actionFailed;
this.ErrorMessage = innerException.Message;
this.InnerException = innerException;
}
提交消息的位置和样式:
您需要找到 FormRender 子布局文件,默认为 website\sitecore modules\Web\Web Forms for Marketers\Control\SitecoreSimpleFormAscx.ascx
在那里您会找到一个名为 SubmitSummary
的组件,它会呈现提交消息,因此将其移动到您需要的位置。
另请注意,它引用了 CssClass
scfSubmitSummary
这是更改消息样式所需的目标。这个答案已经很长了,所以我不会一一列举如何更改 class 的样式,例如,请参见此处 - http://www.awareweb.com/awareblog/10-1-13-wffmguide
管道修补
我已经深入挖掘,为了使用我们为使用异常错误消息而创建的自定义 Args,您需要控制最终使用这些 Args 的管道,这是处理器 Sitecore.Form.Core.Pipelines.FormSubmit.FormatMessage, Sitecore.Forms.Core
<errorSubmit>
管道。
根据我的调查,它不应该花费太多精力然后它就是修补它的问题,您可以直接修改 Sitecore.Forms.config
或使用 [=30] 中的配置文件中的 patch:instead
=] 文件夹 - 请在此处查看 more info.
一种选择是创建自定义表单验证操作。您 可以 在此处保存数据,尽管最好在此处根据您的 API 验证数据,然后在自定义保存操作中保存数据,因为这看起来更合乎逻辑关于 WFFM 的运作方式。
using Sitecore.Data;
using Sitecore.Form.Core.Controls.Data;
using Sitecore.Form.Core.Submit;
using System;
using System.Collections.Generic;
namespace Custom.WFFM
{
public class CustomVerificationStep : BaseCheckAction
{
public string FailedMessage { get; set; }
public override void Execute(ID formid, IEnumerable<ControlResult> fields)
{
// Call your API
// You have access to the fields, so you can pass them through as parameters to your if needed
bool flag = ServiceAPI.ValidateUserData(param1, param2, etc);
if (!flag)
{
throw new Exception(string.Format(this.FailedMessage ?? "There was an error while verifying the data against the service call"));
}
}
public override ActionState QueryState(ActionContext context)
{
return ActionState.DisabledSingleCall;
}
}
}
在/sitecore/system/Modules/Web Forms for Marketers/Settings/Actions/Form Verification
下创建对应的Verification Action:
您可以通过在 Parameters
字段中将错误消息设置为 <FailedMessage>Custom Failed Error Message</FailedMessage>
来更改错误消息。
然后将您的验证步骤添加到您的表单中:
如果每个表单需要不同的错误消息,则可以将错误消息设置为从“错误消息”选项卡中显示。
然后用户将返回到相同的状态,而不会调用任何保存操作并且表单字段仍会填写。
我为我的一个页面设置了一个营销人员 Web 表单。
我已经为它编写了自定义提交操作,如下面的代码片段所示 -
public class **CustomFormSubmit : ISaveAction**
{
public void Execute(ID formid, AdaptedResultList fields, params object[] data)
{
try
{
**//var returnValue= Custom Logic to save form data // returns true or false**
}
catch (Exception ex)
{
Logger.Log(ex.Message + ":" + builder, ExceptionCategory.Error);
throw;
}
}
在我上面的 Web 表单中 - 成功模式是 - SuccessMode/Redirect 并且我为其配置了一个成功页面。
我在上述场景中的要求是,如果 returnValue 为 false,则让用户保持在同一页面(使用表单)。 (如上代码段所示)
任何人都可以在上述情况下指导我 - 如何让用户在表单中填写值的同一页面上,以便用户可以再次提交。 产品详细信息 - 7.2 修订版。 141226,面向营销人员的 Web 表单 2.4 修订版 140117
添加进一步的细节- 如果上面的代码片段中 return 为假,我不确定如何返回我的页面而不是重定向。 一旦提交按钮被点击,上面的函数——Execute——就会被调用。 如何返回页面 - 我是否需要覆盖任何功能或自定义某些内容。
如果在保存数据时出现任何异常 - 然后控件将返回到同一页面并保留用户填写的所有值 - 保存操作失败在 Sitecore 中配置的消息。 所以我的要求是在保存数据时以 return 值出现异常时转到表单,并放置可能会更改的自定义错误消息时间,所以不是静态配置的,而是动态配置的。 谢谢! 索拉布
一个选项是重定向到打开表单的原始页面。
使您的表单能够使用 ReadQueryString
属性 通过查询字符串填充字段,通过表单呈现器的演示详细信息:
因此,在 Save Action
的 false
上,您创建了一个查询字符串集合,其中包含每个字段的名称,如表单中显示的那样,后跟用户的值。
下面的代码将循环遍历您的所有字段,并将它们排列成一个带有 FieldName 和 Value 的 QueryString;
string urlOfForm = HttpContext.Current.Request.Url.AbsolutePath;
var queryString = new StringBuilder("?");
foreach (AdaptedControlResult field in fields)
{
queryString.Append(string.Format("{0}={1}&", field.FieldName, field.Value));
}
urlOfForm = urlOfForm + queryString;
HttpContext.Current.Response.Redirect(urlOfForm);
Sitecore 随后会自动使用这些值填充适当的字段,从而满足您的要求。
编辑
我发现抛出的大多数异常都会将用户带回到填充了值的表单。然后,您可以传递写入 CRM 失败的原因。请参阅下面的示例
if (submitFailed)
{
throw new Exception("The email address entered already exists in our System");
}
复杂性在于动态换出 Save Action Failed Message
以显示此 Exception Message
。我找到的所有关于自定义保存操作消息的帖子都指出,唯一真正的方法是通过自定义 Save Action
重定向到显示不同消息的不同页面。哪个不符合你的要求。
我找到了您需要修补 FormSubmitFailedArgs
和 SubmitFailedArgs
的管道参数。前者需要进行以下更改
public FormSubmitFailedArgs(ID formID, AdaptedResultList fields, ID actionFailed, Exception ex)
: base(formID, actionFailed, ex)
{
this.Fields = fields;
this.ErrorMessage = ex.Message;
}
后者需要
public SubmitFailedArgs(ID formID, ID actionFailed, string errorMessage, Exception innerException)
{
this.FormID = formID;
this.ActionFailed = actionFailed;
this.ErrorMessage = innerException.Message;
this.InnerException = innerException;
}
提交消息的位置和样式:
您需要找到 FormRender 子布局文件,默认为 website\sitecore modules\Web\Web Forms for Marketers\Control\SitecoreSimpleFormAscx.ascx
在那里您会找到一个名为 SubmitSummary
的组件,它会呈现提交消息,因此将其移动到您需要的位置。
另请注意,它引用了 CssClass
scfSubmitSummary
这是更改消息样式所需的目标。这个答案已经很长了,所以我不会一一列举如何更改 class 的样式,例如,请参见此处 - http://www.awareweb.com/awareblog/10-1-13-wffmguide
管道修补
我已经深入挖掘,为了使用我们为使用异常错误消息而创建的自定义 Args,您需要控制最终使用这些 Args 的管道,这是处理器 Sitecore.Form.Core.Pipelines.FormSubmit.FormatMessage, Sitecore.Forms.Core
<errorSubmit>
管道。
根据我的调查,它不应该花费太多精力然后它就是修补它的问题,您可以直接修改 Sitecore.Forms.config
或使用 [=30] 中的配置文件中的 patch:instead
=] 文件夹 - 请在此处查看 more info.
一种选择是创建自定义表单验证操作。您 可以 在此处保存数据,尽管最好在此处根据您的 API 验证数据,然后在自定义保存操作中保存数据,因为这看起来更合乎逻辑关于 WFFM 的运作方式。
using Sitecore.Data;
using Sitecore.Form.Core.Controls.Data;
using Sitecore.Form.Core.Submit;
using System;
using System.Collections.Generic;
namespace Custom.WFFM
{
public class CustomVerificationStep : BaseCheckAction
{
public string FailedMessage { get; set; }
public override void Execute(ID formid, IEnumerable<ControlResult> fields)
{
// Call your API
// You have access to the fields, so you can pass them through as parameters to your if needed
bool flag = ServiceAPI.ValidateUserData(param1, param2, etc);
if (!flag)
{
throw new Exception(string.Format(this.FailedMessage ?? "There was an error while verifying the data against the service call"));
}
}
public override ActionState QueryState(ActionContext context)
{
return ActionState.DisabledSingleCall;
}
}
}
在/sitecore/system/Modules/Web Forms for Marketers/Settings/Actions/Form Verification
下创建对应的Verification Action:
您可以通过在 Parameters
字段中将错误消息设置为 <FailedMessage>Custom Failed Error Message</FailedMessage>
来更改错误消息。
然后将您的验证步骤添加到您的表单中:
如果每个表单需要不同的错误消息,则可以将错误消息设置为从“错误消息”选项卡中显示。
然后用户将返回到相同的状态,而不会调用任何保存操作并且表单字段仍会填写。