Sitecore WFFM: проблемы с отправкой формы программно

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

Я начал со следующих шагов: https://jermdavis.wordpress.com/2015/05/18/programmatic-wffm-submissions/

Мне пришлось внести небольшие изменения в код, чтобы заставить SubmitActionManager работать.

Члены класса Sitecore.Form.Core.Submit.SubmitActionManager перемещены в интерфейс IActionExecutor. Чтобы получить экземпляр этого интерфейса, используйте вызов (IActionExecutor)Factory.CreateObject ("wffm/wffmActionExecutor", false).

Ниже приведен код, который у меня есть до сих пор:

public void SubmitData(ContactUsFormModel data)
    {
        var results = new List<ControlResult>();
        results.Add(makeControlResult(Models.Constants._cufFirstNameID, "First Name", data.FirstName));
        results.Add(makeControlResult(Models.Constants._cufLastNameID, "Last Name", data.LastName));
        results.Add(makeControlResult(Models.Constants._cufEmailID, "Email", data.Email));
        results.Add(makeControlResult(Models.Constants._cufCompanyID, "Company", data.Company));
        results.Add(makeControlResult(Models.Constants._cufSubjectID, "Subject", data.Subject));
        results.Add(makeControlResult(Models.Constants._cufMessageID, "Message", data.Message));

        var formItem = Sitecore.Context.Database.GetItem(Models.Constants._contactUsFormID);
        var simpleForm = new SitecoreSimpleForm(formItem);
        var saveActionXml = simpleForm.FormItem.SaveActions;
        var actionList = Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse(saveActionXml);

        var actionDefinitions = new List<ActionDefinition>();
        actionDefinitions.AddRange(actionList.Groups.SelectMany(x => x.ListItems).Select(li => new ActionDefinition(li.ItemID, li.Parameters) { UniqueKey = li.Unicid }));

        var SubmitActionManager = (IActionExecutor)Factory.CreateObject("wffm/wffmActionExecutor", false);
        Sitecore.Form.Core.WffmActionEvent sessionID = new Sitecore.Form.Core.WffmActionEvent();// SessionIDGuid

        var result = SubmitActionManager.ExecuteSaving(ID.Parse(Models.Constants._contactUsFormID), results.ToArray(), actionDefinitions.ToArray(), true, ID.Parse( sessionID.SessionIDGuid ));
    }

    private ControlResult makeControlResult(string fieldID, string fieldName, string fieldValue)
    {
        return new ControlResult(fieldName, fieldValue, string.Empty)
        {
            FieldID = fieldID,
            FieldName = fieldName,
            Value = fieldValue,
            Parameters = string.Empty
        };
    }

Я не знал, где взять Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId, чтобы использовать его внутри ExecuteSaving, поэтому я использовал WffmActionEvent. Кроме того, в руководстве, которому я следовал, используется Execute, который теперь устарел, поэтому мне пришлось использовать ExecureSaving (мое лучшее предположение).

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

24688 17:20:39 WARN  [WFFM] Tracker.Current  is not initialized
24688 17:20:39 INFO  AUDIT (sitecore\admin): [WFFM] Form {978DBF4C-0F56-45A8-A9AC-52EF8D995DDF} is saving to db
24688 17:20:39 WARN  [WFFM] Tracker.Current.Contact  is not initialized
24688 17:20:39 WARN  [WFFM]  Tracker.Current.Interaction  is not initialized
24688 17:20:39 WARN  [WFFM] CurrentSession  is not initialized

person Freecode    schedule 05.01.2016    source источник


Ответы (1)


Поскольку вы используете Sitecore 8, отправка формы хранится в MongoDB. Реализация Sitecore MongoDB, xDB в основном полагается на отслеживание пользователей, называя их Contacts.

Большинство данных, хранящихся в xDB, связано с Contact через ContactId. В сообщениях об ошибках, которые вы находите в журнале, говорится, что отслеживание в настоящее время не включено, поэтому Contact отсутствует, и между сайтом и пользователем нет Interaction.

Поэтому вам нужно запустить Sitecore.Tracker Я рекомендую использовать следующий код

if (!Tracker.IsActive)
    Tracker.StartTracking();

if (!Tracker.IsActive || Tracker.Current.Contact == null)
{
    // handle no tracker and contact
}

Теперь, когда у вас работает отслеживание, вам нужно использовать правильный идентификатор для вашей переменной sessionID.

Блог, на который вы подписаны, основан на Sitecore 7, в Sitecore 8 Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId удален. Я декомпилировал код Sitecore 7, и Sitecore.Form.Core.Analytics.AnalyticsTracker.SessionId в конечном итоге использует Tracker.CurrentVisit.VisitId.

Однако это пространство имен изменилось в Sitecore 8. Посещения теперь называются взаимодействиями, поэтому вместо вашей переменной SessionID вы захотите использовать

Tracker.Current.Interaction.InteractionId;

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

person Jonathan Robbins    schedule 06.01.2016
comment
Спасибо! Именно это мешало коду вызывать сохраненные действия. Однако у меня все еще остается одна проблема. Я не вижу данные формы внутри отчетов форм/mongoDB, что не позволяет мне получать статистику/отчеты форм. В логах ошибок нет. (Я вижу предупреждение, но я уверен, что оно совершенно не связано, но я все равно опубликую его на всякий случай) - person Freecode; 06.01.2016
comment
› 25368 12:12:50 ПРЕДУПРЕЖДЕНИЕ Ошибка аутентификации в службе обнаружения CES. Исключение: System.Net.WebException Сообщение: Удаленный сервер возвратил ошибку: (403) Запрещено. Источник: система в System.Net.HttpWebRequest.GetResponse() в Sitecore.CES.Client.WebClient.ExecuteRequest(String requestUri) в Sitecore.CES.Client.ResourceConnector`1.Request(конечная точка строки, параметры Object[]) в Sitecore .CES.Discovery.EndpointSource.GetEndpoint(String › serviceName) - person Freecode; 06.01.2016
comment
Я попытался добавить вызов SaveFormToDatabase после вызова ExecuteSaving. И я не вижу, чтобы он сохранялся. codeSubmitActionManager.SaveFormToDatabase(ID.Parse(Models.Constants._contactUsFormID), новый AdaptedResultList(adaptedResults)); - person Freecode; 06.01.2016
comment
Хорошо, извините за бессвязность здесь. Я думаю, что слишком рано говорил о последнем. Не уверен, почему я ожидал, что результаты будут отображаться в SQL мгновенно .... но в конечном итоге они обрабатываются и сохраняются. Таким образом, он сохраняет формы правильно. Я в конечном итоге обновлю сообщение с правильным решением. - person Freecode; 06.01.2016
comment
Отлично - рад, что результаты отображаются правильно. Они не появятся сразу, поскольку они хранятся в сеансе и записываются в MongoDB, когда сеанс пользователя заканчивается. Обычно через 20 минут после последней активности. Затем результаты записываются в MongoDB и, в конечном итоге, в базу данных SQL для отчетов. Этот выбор дизайна призван сэкономить дорогостоящие повторные вызовы Mongo. - person Jonathan Robbins; 07.01.2016