Разработка
20
Окт
0

Перехват сообщения плагина в JS

Если в результате работы плагина возникнет какая-либо ошибка, или если принудительно ее вызвать следующим образом:

throw new InvalidPluginExecutionException("Craaaaaash!!!11");

то пользователи (работающие с карточкой) увидят стандартный системный «алерт» об ошибке.

В некоторых случаях Вам может понадобится обработать возвращенный плагином ответ в коде JS (при сохранении) и соответствующим образом изменить бизнес логику. Для примера просто «укажем» на определенное поле при возникновении ошибки…

Допустим, у нас имеется следующий плагин (, который висит на событие обновления карточки Организации (З.Ы. данный плагин просто выдает ошибку для объекта Организация). Зарегистрируем плагин на синхронное обновление объекта Организация.

using Microsoft.Xrm.Sdk;
using System;

namespace ConvertPluginMessage
{
    public class ConvertPluginMessage : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                // Если сущность Контакт – возвращаем ошибку
                Entity entity = (Entity)context.InputParameters["Target"];

                if (entity.LogicalName == "contact")
                {
                    throw new InvalidPluginExecutionException("Fax не корректный!");
                }
            }
        }
    }
}

Здесь все довольно просто – проверяем что текущая сущность Контакт и возвращаем ошибку.

Далее добавляем к карточке следующий код и вызываем как-нибудь функцию onChange (например, на изменение какого-либо поля):

function onChange() {
    // Принудительно сохраняем запись и задаем обработчики успешного и ошибочного ответа
    Xrm.Page.data.save().then(successCallback, errorCallback);
}

function successCallback() {
    alert("Hello");
}

// Обрабатываем ошибку
function errorCallback(saveErrorResponse) {
    if (saveErrorResponse != null) {
        if (saveErrorResponse.message != 'undefined' && saveErrorResponse.message != null) {
            // Если ответ содержит слово "Fax"
            if (saveErrorResponse.message.indexOf("Fax") != -1) {
                // Добавляем уведомление к полю
                Xrm.Page.getControl("fax").setNotification("Исправьте номер Факса");
                Xrm.Page.getControl("fax").setFocus();
            }
        }
    }
}

Здесь у нас три функции:

  1. onChange – вызывается при изменении поля и принудительно инициирует сохранение текущей карточки;
  2. successCallback – обрабатывает успешное сохранение;
  3. errorCallback – обрабатывает ошибку сохранения. Тут мы проверяем содержимое ответа, который получен при сохранении. И если он содержит слово «Fax», то вешаем на поле Факс уведомление (на практике можно передавать/перехватывать какой-либо код).



Комментарии (0)

*

code