Разработка
25
Сен
0

Светофор 3 (C#)

Давным-давно в CRM появилась такая фича, как Веб-ресурсы изображений. А совсем недавно появилась возможность добавлять к карточкам CRM изображения. А значит будет преступлением их не скрестить 🙂
Реализуем такую штуку: на Интересе, имеется поля оценка с тремя значениям – Высокий, Средний и Низкий. При выборе какого-либо значения будем в рисунок формы подставлять однотонный квадратик соответствующего цвета (красный, желтый и голубой), которые будем хранить в PNG Веб-ресурсах.

Приступим:

  • Создайте три PNG Веб-ресурса:
  • Создайте плагин с таким кодом:
    using System;
    using System.Collections.Generic;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;
    
    namespace entityImage
    {
        public class Plugin : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = factory.CreateOrganizationService(context.UserId);
    
                Entity tardet = (Entity)context.InputParameters["Target"];
    
                if (tardet.Contains("leadqualitycode"))
                {
                    // Получаем значение пиклиста
                    OptionSetValue leadqualitycode = tardet.Attributes["leadqualitycode"] as OptionSetValue;
    
                    // Запрашиваем содержимое нужного Веб-ресурса
                    QueryByAttribute requestWebResource = new QueryByAttribute
                    {
                        EntityName = "webresource",
                        ColumnSet = new ColumnSet("content")
                    };
                    requestWebResource.Attributes.AddRange("name");
                    requestWebResource.Values.AddRange("new_leadqualitycode" + leadqualitycode.Value.ToString() + ".png");
    
                    EntityCollection webResourceCollection = service.RetrieveMultiple(requestWebResource);
                    if (webResourceCollection.Entities.Count == 0)
                        throw new InvalidPluginExecutionException("Specified Webresource does not exist");
    
                    // Конертируем рисунок в байты
                    Entity webResource = (Entity)webResourceCollection.Entities[0];
                    byte[] imageBytes = Convert.FromBase64String(webResource.Attributes["content"].ToString());
    
                    // Создаем объект для обновления
                    Entity updLead = new Entity("lead");
                    updLead["leadid"] = context.PrimaryEntityId;
                    updLead["entityimage"] = imageBytes;
    
                    // Обновляем запись
                    service.Update(updLead);
                }
            }
        }
    }
    

    Что он делает:

    • Если на входе передано поле Оценка, получаем его значение;
    • Запрашиваем содержимое соответствующего PNG Веб-ресурса;
    • Обновляем поле рисунка текущей записи.
  • Зарегистрируйте плагин в CRM:
    • Объект: Интерес;
    • Сообщения: Создание/Обновление;
    • Стадия: Пост;
    • Режим: Синхронно;
    • Для сообщения Обновления добавьте фильтрацию по атрибуту Оценка.



З.Ы. Единственное что не получилось сделать – это динамически обновить поле рисунка? как это делает . Поэтому после сохранения необходимо обновить карточку, чтобы появилось изображение. Но технически это возможно – так делает стандартный диалог загрузки рисунка. Если кто-нибудь знает как это добиться, просьба подсказать 🙂

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

*

code