WFFM覆盖演示详细信息中选择的FormID

时间:2015-06-18 14:24:45

标签: sitecore web-forms-for-marketers

在某种情况下,我需要以编程方式更改表单呈现器中显示的WFFM表单。表单渲染器本身通过演示详细信息添加到占位符。

我可以访问Form Render并设置FormID并将其参数更新为我想要显示的Form的ID。然而,就好像Sitecore不尊重这些属性并显示原始形式,即使我在页面生命周期的早期移动我的代码,例如Page_Init。我的代码如下

    // Pass in controls of the sublayout
    public FormRender SetFormRender(Control control, string dataSource)
    {
        FormRender formRender = null;

        // loop through controls contained in passed in control
        foreach (Control child in control.Controls)
        {
            if (child is FormRender)
            {
                formRender = child as FormRender;
                if (formRender != null)
                {
                    formRender.FormID = dataSource;
                    formRender.Parameters = "FormID=" + HttpUtility.HtmlEncode(dataSource);
                    break;
                }
            }

            // If control has controls pass to this method for recursion 
            if (control.HasControls())
            {
                var nestedFormRender = SetFormRender(child, dataSource);
                if (nestedFormRender != null && formRender == null)
                {
                    formRender = nestedFormRender;
                    break;
                }

            }
        }

        return formRender;
    }

3 个答案:

答案 0 :(得分:4)

也许在设置FormID和参数后,您需要调用FormRender.OnInit(),所以您的代码可能是这样的:

....
formRender.FormID = dataSource;
formRender.Parameters = "FormID=" + HttpUtility.HtmlEncode(dataSource);
formRender.OnInit(null);                   
break;
....

修改

我不认为您可以从代码中调用formRender.OnInit()作为其受保护的方法,但您可以做的是创建一个新的控件来继承FormRender并用此替换演示详细信息上的控件,并且然后重写OnInit()方法并放置处理FormID属性的代码,然后调用base.OnInit()

Mike Reynolds有一篇关于如何根据查询字符串here

加载不同表单的博客

答案 1 :(得分:2)

我找到了一个基于Mike Reynolds blog的解决方案,因为艾哈迈德奥库建议让我50%的路上但需要额外的工作。

我创建了一个新的FormRender,它公开了要传递的覆盖表单ID的公共属性。这个新的FormRender实现了现有的一个,但是覆盖基础OnInit()仍然会产生一个受保护的方法,这意味着它在我们需要它时无法被调用。因此,我创建了一个非重写的公共OnInit()方法:

public class PublicFormRender : FormRender
{
    public string OverridingFormId { get; set; }

    public void OnInit()
    {
        OnInit(new EventArgs());
    }

    protected override void OnInit(System.EventArgs e)
    {
        // New logic added here so overriding Id is always honoured
        // especially in the case of PublicFormRender is added via the FrontEnd
        if (!string.IsNullOrEmpty(OverridingFormId))
        {
            FormID = OverridingFormId;
            var parameters = WebUtil.ParseUrlParameters(Parameters);
            if (parameters["FormID"] != null)
                parameters["FormID"] = HttpUtility.HtmlEncode(OverridingFormId);
            Parameters = parameters.ToString();
        }

        base.OnInit(e);
    }
}

我在路径/sitecore/layout/Renderings/Modules/Web Forms for Marketers/中复制Sitecore中的FormRender,引用PublicFormRender并使用它在演示文稿详细信息中添加表单

    public PublicIdFormRender SetFormRender(Control control, string dataSource)
    {
        PublicIdFormRender formRender = null;

        // Loop through to find the new PublicFormRender
        foreach (Control child in control.Controls)
        {
            var publicFormRender = child as PublicFormRender;
            if (publicFormRender != null)
            {
                // Set the new public property to the data source
                publicFormRender.OverridingFormId = dataSource;
                // Initialise the Form via the non-overriding public method
                publicFormRender.OnInit();
                formRender = publicFormRender;
                break;
            }

            if (control.HasControls())
            {
                var nestedFormRender = SetFormRender(child, dataSource);
                if (nestedFormRender != null && formRender == null)
                {
                    formRender = nestedFormRender;
                    break;
                }

            }
        }

        return formRender;
    }

答案 2 :(得分:0)

这是因为表单在添加到控件集合时实际呈现。如果您必须遵守此架构,我的建议是从集合中删除控件,然后通过

添加它
control.Controls.Add(formRender);

效率不高,但应该有效。