C# Sitecore WFFM-使用会话中的数据预加载表单
我正在尝试在Sitecore中创建WFFM表单以编辑当前用户的配置文件,该配置文件存储在会话中(不同于C# Sitecore WFFM-使用会话中的数据预加载表单,c#,.net,sitecore,sitecore6,web-forms-for-marketers,C#,.net,Sitecore,Sitecore6,Web Forms For Marketers,我正在尝试在Sitecore中创建WFFM表单以编辑当前用户的配置文件,该配置文件存储在会话中(不同于Sitecore.Context.user.profile)。为此,我正在寻找一种方法,用会话中的概要文件数据预加载表单字段 这能做到吗?我正在使用Sitecore CMS 6.5和WFFM 2.3。我建议您反编译FormRenderer网络控件,并构建自己的网络控件。这是通过WFFM模块呈现表单的标准表示控件。问题的解决方案似乎更复杂一些。首先,我将所有配置文件信息从会话移动到Sitecore
Sitecore.Context.user.profile
)。为此,我正在寻找一种方法,用会话中的概要文件数据预加载表单字段
这能做到吗?我正在使用Sitecore CMS 6.5和WFFM 2.3。我建议您反编译
FormRenderer
网络控件,并构建自己的网络控件。这是通过WFFM模块呈现表单的标准表示控件。问题的解决方案似乎更复杂一些。首先,我将所有配置文件信息从会话移动到Sitecore.Context.User
的profile
。为此,必须实现一个自定义用户配置文件类。使用这种方法,我知道需要从这个定制概要文件而不是会话中预加载表单字段
为此,我在内容树下创建了一个名为“Profile Variables”的文件夹,它以点表示法表示需要读取的自定义概要文件属性。例如:{DisplayName:“家庭电话”,值:“ContactDetails.homephone”}
最后,我基于单行文本字段类型创建了一个自定义WFFM字段类型,该字段类型接受另一个属性,prelofield
,从“Profile Variables”节点获取值,在自定义字段类型的OnInit
上,我使用反射从上下文用户的配置文件中读取存储在prelofield
中的属性值,并将文本字段的text
属性设置为该值
希望这能帮助其他人寻找类似的东西。WFFM无法在开箱即用的情况下完成这项工作。我们选择了另一种方法来解决这个问题。在
/sitecore/layout/Renderings/Modules/Web Forms for Marketers/form
下的表单呈现中,您有一个字段Parameters
,您可以在其中添加一个参数FormTemplate
,其中包含一个用于呈现表单的自定义用户控件:
FormTemplate=/sitecore modules/web/Web Forms for Marketers/Control/CustomSimpleFormAscx.ascx
在这个用户控件中,我们循环遍历每个字段,并根据用户的自定义属性设置输入字段的值。当然,您可以将其增强到其他字段,如select等。下面是一些示例代码:
public partial class CustomSimpleFormAscx : SitecoreSimpleFormAscx
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
FillInUserData(this.FieldContainer);
}
private void FillInUserData(System.Web.UI.Control control)
{
foreach (System.Web.UI.Control child in control.Controls)
{
if (child is BaseControl)
{
if (child is InputControl)
{
InputControl field = (InputControl)child;
field.Text = Sitecore.Context.User.Profile.GetCustomProperty(field.ControlName);
}
}
FillInUserData(child);
}
}
}
我想做类似的事情。在WFFM的2.3版本中,有一些规则操作允许您从用户配置文件中设置字段的值 请参阅操作:在选择表单字段时,使用“用户配置文件特定字段”选项的默认值,直到规则生效 您可以使用全名、电子邮件、注释或任何其他自定义属性
其中一个未包含的字段是用户名字段。您可以编写一个自定义操作,返回用户名字段。谢谢,Mark,看来反编译毕竟是一种方法,但不是这个类。见下面我的答案。