Sitecore WFFM - Предварительная загрузка формы с данными из сеанса

Я пытаюсь создать форму WFFM в Sitecore для редактирования профиля текущего пользователя, который хранится в сеансе (отличается от Sitecore.Context.User.Profile). С этой целью я ищу способ предварительно загрузить поля формы с данными профиля из сеанса.

Можно ли это сделать? Я использую Sitecore CMS 6.5 и WFFM 2.3.


person George    schedule 26.01.2013    source источник


Ответы (4)


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);
        }
    }
}
person Kevin Brechbühl    schedule 07.03.2013

Я рекомендую вам декомпилировать FormRenderer WebControl и создать свой собственный, который делает то же самое. Это стандартный элемент управления презентацией для рендеринга форм через модуль WFFM.

person Mark Ursino    schedule 26.01.2013
comment
Спасибо, Марк, похоже, что декомпиляция все-таки была подходящим способом, но не для этого класса. Смотрите мой ответ ниже. - person George; 28.01.2013

Кажется, что решение проблемы было немного сложнее. Прежде всего, я переместил всю информацию о профиле из сеанса в Profile пользователя Sitecore.Context.User. Для этого необходимо было реализовать собственный класс профиля пользователя. Используя этот подход, я знаю, что нужно предварительно загружать поля формы из этого пользовательского профиля вместо сеанса.

Для этого я создал папку под деревом содержимого под названием «Переменные профиля», которая представляла свойства пользовательского профиля, которые необходимо было прочитать, в точечной нотации. Например: { DisplayName: "Home Telephone", Value: "ContactDetails.HomeTelephone" }.

Наконец, я создал настраиваемый тип поля WFFM, основанный на типе поля «Однострочный текст», который принимает еще одно свойство, PreloadField, беря значения из узла «Переменные профиля», и OnInit настраиваемого типа поля, который я считываю из пользовательского контекста. profile, используя отражение значения свойства, хранящегося в PreloadField, и установите это значение для свойства Text текстового поля.

Надеюсь, это поможет кому-то еще в поисках чего-то подобного.

person George    schedule 28.01.2013

Я ищу, чтобы сделать что-то подобное. В версии 2.3 WFFM есть некоторые действия правил, которые позволяют вам установить значение поля из профиля пользователя.

См. Действия: используйте значение по умолчанию из параметра поля профиля пользователя до Правила при выборе поля формы.

Вы можете использовать полное имя, адрес электронной почты, комментарий или любое другое пользовательское свойство.

Единственное поле, которое не включено, — это поле UserName. Вы можете написать настраиваемое действие, возвращающее поле имени пользователя.

person Nona Drake    schedule 12.12.2014