3

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

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

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

The members of Sitecore.Form.Core.Submit.SubmitActionManager class have been moved to the IActionExecutor interface.To obtain the instance of this interface use the (IActionExecutor)Factory.CreateObject ("wffm/wffmActionExecutor", false) call.

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

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 

ответ

7

Как вы используете 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; 

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

+0

Спасибо! Именно это и помешало коду вызвать вызовы сохраненных действий. Однако я все еще остаюсь с одной проблемой. Я не вижу данные формы внутри отчетов форм/mongoDB, что мешает мне получать какие-либо статистические данные/отчеты. Внутри журналов ошибок нет. (Я вижу предупреждение, но я уверен, что он полностью не связан, но все равно его опубликует на всякий случай) – Freecode

+0

> 25368 12:12:50 WARN Аутентификация на службе CES Discovery не удалась. Исключение: System.Net.WebException Сообщение: Удаленный сервер возвратил ошибку: (403) Запрещено. Источник: Система на System.Net.HttpWebRequest.GetResponse() в Sitecore.CES.Client.WebClient.ExecuteRequest (Строка requestUri) в Sitecore.CES.Client.ResourceConnector'1.Request (String конечной точки, Object [] параметры) at Sitecore.CES.Discovery.EndpointSource.GetEndpoint (String> serviceName) – Freecode

+0

Я попытался добавить вызов SaveFormToDatabase после выполнения вызова ExecuteSaving. И я не вижу, чтобы это хранили. 'code'SubmitActionManager.SaveFormToDatabase (ID.Parse (Models.Constants._contactUsFormID), новый AdaptedResultList (adaptResults)); – Freecode

Смежные вопросы