WFFM 8 - отправлять данные программно

I am on WFFM 8 rev. 150625

Я создал форму, которая будет программно отправлять данные в WFFM.

Код, отрезанный для отправки данных:

var simpleForm = new SitecoreSimpleForm(sitecoreFormItem);
var actionList = simpleForm.FormItem.ActionsDefinition;

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

//crList is ControlResult[] and contains field values. 
SubmitActionManager.Execute(sitecoreFormItem.ID, 
                            crList.ToArray(), actionDefinitions.ToArray());

Моя форма WFFM в sitecore не имеет действия по сохранению, так как я отправляю электронное письмо в самом коде. Я заметил, что данные сохраняются в MongoDB, а не в базе данных отчетов.

Можно ли каким-либо образом запустить сохранение для создания отчета о действии БД? Нужно ли мне вызывать какую-то другую функцию для выполнения этого бита?


person NomadTraveler    schedule 04.09.2015    source источник
comment
В базе данных отчетов есть таблица фактов для WFFM, которую необходимо установить вместе с WFFM. Вы хотите добавить данные сюда? Я думаю, что в таблице хранятся сводные данные, а не отдельные записи данных отправки, как это было в старой версии.   -  person Ian Graham    schedule 04.09.2015
comment
Эй, Ян, я имею в виду данные, хранящиеся в SQL для целей отчетности. Такие таблицы, как FormFieldValues, по-прежнему хранят данные формы и связаны с Fact_FormSummary и т. д. Просто интересно, почему он не будет обрабатывать и хранить эти данные, если форма была отправлена ​​программно. Или мне нужно вызвать какую-то другую функцию, чтобы сделать это?   -  person NomadTraveler    schedule 07.09.2015
comment
Вы решили эту проблему? У меня такая же проблема, при отправке формы через сервис   -  person Kristian Nissen    schedule 08.02.2017


Ответы (2)


Это должно быть возможно. По сути, вам нужно создать новый экземпляр SaveToDatabase в вашем коде. Затем вам нужно выполнить передачу Save Action в FormId, AdaptedResultList, содержащую Fields и Values.

    public void SubmitToDatabase(FormItem formItem, string[] values)
    {
        // Create AdaptedControlResult for the Fields of the form 
        // even better if you can pass the AdaptedResultList
        // from the form directly
        var adaptedControlResults = new List<AdaptedControlResult>();
        foreach (FieldItem fieldItem in formItem.FieldItems.ToList())
        {
            adaptedControlResults.Add(new AdaptedControlResult(new ControlResult(fieldItem.Name, values[formItem.FieldItems.ToList().IndexOf(fieldItem)], null), true));
        }

        var adaptedResultList = new AdaptedResultList(adaptedControlResults);

        Sitecore.Form.Submit.SaveToDatabase saveToDatabaseSaveAction = new Sitecore.Form.Submit.SaveToDatabase();
        try
        {
            saveToDatabaseSaveAction.Execute(formItem.ID, adaptedResultList, null);
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error(ex.Message, ex, this);
        }

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

Ссылка — http://mikerobbins.co.uk/2014/10/15/write-to-web-forms-programmatically/

person Jonathan Robbins    schedule 09.09.2015
comment
Привет, Джонатан, это то, что я уже делаю, и это сохраняет данные в mongoDB, но не в базе данных отчетов. - person NomadTraveler; 11.09.2015
comment
SubmitActionManager вызывает функцию savetoDatabase - person NomadTraveler; 11.09.2015

Попробуйте этот код. Он будет работать для Sitecore 8.0 и выше. Обратите внимание, что этот код не запускает действия по сохранению. Если вы хотите активировать их, вам нужно вручную передать их в FormDataHandler.ProcessData.

 var controlResults = new List<ControlResult>();
                    controlResults.Add(new ControlResult(Pdf_Request_Form.Name.ItemID.ToString(), "Name", name, string.Empty));
                    controlResults.Add(new ControlResult(Pdf_Request_Form.Email.ItemID.ToString(), "Email", email, string.Empty));

    #pragma warning disable 618
                    FormDataHandler.ProcessData(Pdf_Request_Form.ItemID, controlResults.ToArray(), new IActionDefinition[] {}, DependenciesManager.ActionExecutor);
    #pragma warning restore 618
person Jack Spektor    schedule 19.04.2017