Сохранение веб-формы Sitecore для маркетологов программно

Как сохранить форму, не используя кнопку отправки (у меня есть другой триггер на странице, который можно использовать для запуска кода сохранения). Форма никогда не показывается пользователю, мне просто нужно сохранить ее в веб-форме для базы данных маркетологов, если, конечно, нет более разумного способа.

Я могу получить это просто отлично, используя

Sitecore.Forms.Core.Data.FormItem form =
 Sitecore.Forms.Core.Data.FormItem.GetForm(formID);

Тем не менее, я хочу

  1. Изменить данные в полях формы

(то есть что-то вроде)

form.Fields["Name"] = "Test name"; 
// this wont work, I dont know how to access the field's value before I store it.
  1. Сохраните данные формы в веб-форме для базы данных маркетологов в sitecore.

После того, как я изменил поля, я бы хотел его сохранить.

4 ответа

Решение

Способ сделать это - сначала получить копию формы, установить ее поля с помощью списка AdaptedControlResult и сохранить его с помощью InsertForm. Таким образом, он корректно попадает в таблицу данных WFFM.

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

Код:

string formID = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";
DataUri uri = new DataUri(new ID(formID));
Sitecore.Data.Items.Item formItem = Sitecore.Context.Database.GetItem(uri);

// if the item exists, run through all the known fields and add the values from the customerinfo into them.
if (formItem != null)
{
   List<AdaptedControlResult> acrList = new List<AdaptedControlResult>();
   Sitecore.Data.Items.Item[] fieldItems = formItem.Axes.GetDescendants();

   foreach (Sitecore.Data.Items.Item fieldItem in fieldItems) //.Where(x => x.TemplateName == "Field"))
   {
      if (fieldItem.Name == "E-mail")
      {
         acrList.Add(new AdaptedControlResult(new ControlResult(fieldItem.Name, System.Web.HttpUtility.UrlDecode(customerInfo.Email), string.Empty) { FieldID = fieldItem.ID.ToString(), FieldName = fieldItem.Name, Value = System.Web.HttpUtility.UrlDecode(customerInfo.Email) }, true));
         continue;
      }

   // same for all other fields.
   }

   // save data
   if (acrList.Count > 0)
   {
      AdaptedResultList arl = new AdaptedResultList(acrList);

      try
      {
         Sitecore.Forms.Data.DataManager.InsertForm(formItem.ID, arl, Sitecore.Data.ID.NewID, null);
      }
      catch (Exception ex)
      {
         // Log data here
      }
   }
}

Если вы пытаетесь программно передать данные в таблицу WFFM в БД, вы можете использовать следующее:

Скажем, у вас есть список полей, заполненных в списке этого класса:

public class WffmField
    {
        public string FieldName { get; set; }
        public string FieldGuid { get; set; }
        public string FieldValue { get; set; }
    }

полевой гид будет гидом из sitecore:

Затем вы можете сохранить в базе данных WFFM:

// This should be populated with the data you want to send to the WFFM database
var fields = new List<WffmField>(); 
var wffmDatabaseFields = fields.Select(GetWFFMDatabaseField).ToList();

Sitecore.Forms.Data.DataManager.InsertForm(
    formId: new Sitecore.Data.ID("<Form guid here>"),
    fields: new AdaptedResultList(wffmDatabaseFields),
    sessionID: AnalyticsTracker.SessionId,
    data: null);

Надеюсь это поможет!

У меня недавно было подобное требование к этому вопросу. Ответ Jesper Hoff выше, если вы все, что вам нужно, это сохранить данные формы, сохраненные в сконфигурированной базе данных для WFfM. Однако, что он не делает, так это уважает действия по сохранению, связанные с формой. Так что это нормально, если вы хотите записать представления в SQL Server, но это не поможет, если вам нужно отправить их по электронной почте или передать их в CRM. Мне нужно, чтобы отправка электронной почты работала в коде, над которым я работал, поэтому я немного больше покопался во внутренностях WFfM:

Если вы хотите, чтобы ваша отправка на основе кода соответствовала сконфигурированным Сохранить действия для формы, вам нужно внести три ключевых изменения в приведенный выше код:

  • Во-первых, вам нужно использовать Sitecore.Form.Core.Submit.SubmitActionManager.Execute() метод, а не Sitecore.Forms.Data.DataManager.InsertForm(), Похоже, это то, что называют внутренности WFfM, когда вы отправляете обратно верную форму.
  • Во-вторых, вам нужно получить и настроить набор действий сохранения, которые были настроены для вашего WFfM для определения. И для того, чтобы получить эти данные в нужном формате, нужно немного поработать.
  • И в-третьих, вам нужно собрать данные вашей формы как ControlResult объекты не AdaptedControlResult, Данные, которые вы передаете, автоматически упаковываются как часть вызова Execute(),

Игнорируя проверку ошибок для ясности, я получил такой код:

List<ControlResult> results = new List<ControlResult>();
results.Add(makeControlResult(_nameFieldID, "Name", "Bob Jones"));
results.Add(makeControlResult(_emailFieldID, "Email", "B.Jones@test.com"));
results.Add(makeControlResult(_messageFieldID, "Message", "Lorem ipsum. Dolor sit amet."));

Item formItem = Sitecore.Context.Database.GetItem(_yourFormID);

SitecoreSimpleForm simpleForm = new SitecoreSimpleForm(formItem);
var saveActionXml = simpleForm.FormItem.SaveActions;
var actionList = Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse(saveActionXml);

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

Sitecore.Form.Core.Submit.SubmitActionManager.Execute(_formID, results.ToArray(), actionDefinitions.ToArray());

Набор действий сохранения и их конфигурация сохраняются в Item для вашей формы, но вы должны обернуть элемент в SitecoreSimpleForm объект, чтобы получить это. То, что вы получите, это XML, поэтому вам нужно проанализировать его с Sitecore.Form.Core.ContentEditor.Data.ListDefinition.Parse() метод для возврата набора десериализованных объектов Save Action. Тем не менее, они не являются подходящими объектами для SubmitActionManager так что вам нужно спроецировать их в ActionDefinition объекты для того, чтобы использовать их.

(Обратите внимание, что объекты Save Action, которые вы получаете после анализа XML, не находятся в плоском списке, поэтому вам нужно использовать что-то вроде SelectMany() чтобы сплющить его перед использованием)

makeControlResult() метод, упомянутый выше, просто чтобы сделать фрагмент более понятным. Это просто создает ControlResult Объект из данных о поле формы:

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

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

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

Если я правильно понимаю ваш вопрос; Вы смешиваете два принципа здесь. Вы хотите, чтобы форма проходила через собственные подпрограммы отправки - но также выглядит так, как будто вы пытаетесь написать собственную отправку формы, используя код на стороне сервера, который никогда не будет работать так, как вы описали.

Наилучший подход к отправке WFM из другого элемента управления на странице состоит в том, чтобы он по-прежнему использовал кнопку "Отправить" в форме, но использовал CSS, чтобы скрыть фактический элемент управления. У него есть отдельный класс CSS, который вы можете использовать, чтобы скрыть его. Затем - из другой области вашей страницы, которой вы хотите управлять отправкой, запустите событие OnClick скрытого элемента управления, чтобы вернуть форму и сохранить содержимое.

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

Другие вопросы по тегам