Светофор 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:
- Объект: Интерес;
- Сообщения: Создание/Обновление;
- Стадия: Пост;
- Режим: Синхронно;
- Для сообщения Обновления добавьте фильтрацию по атрибуту Оценка.
З.Ы. Единственное что не получилось сделать – это динамически обновить поле рисунка? как это делает . Поэтому после сохранения необходимо обновить карточку, чтобы появилось изображение. Но технически это возможно – так делает стандартный диалог загрузки рисунка. Если кто-нибудь знает как это добиться, просьба подсказать 🙂