Параметры плагинов
Параметры контекста
Параметры контекста передаются плагину при его выполнении. Параметры контекста представляют собой глобальные системные значения, свойства связанные с объектом и контекстом события, а также коллекции других параметров (об этом чуть позже). Присутствуют во всех плагинах и различаются лишь значением переменных.
Полный их перечень приведен в статье Введение в разработку плагинов для Microsoft CRM 4.0, поэтому повторяться не буду… Приведу лишь пример как выцепить один из них… например, дату и время возникновения события:
Для этого создайте плагин с таким кодом:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; namespace ClassLibrary1 { public class imageTest : IPlugin { public void Execute(IPluginExecutionContext context) { // Выводим в сообщении время возникновения события throw new InvalidPluginExecutionException(context.CorrelationUpdatedTime.Value); } } }
и зарегистрируйте его на любое событие 🙂
Pre-image и Post-image
PreEntity Images и PostEntity Images – это своего рода «снимок» данных на определенный момент времени. В данном случаи (т.е. при работе с плагинами) этими моментами являются момент до начала выполнения основной операции в CRM (на которую зарегистрирован плагин, а точнее его шаг) и после нее.
Чтобы PreEntity и PostEntity Images были доступны в контексте выполнения плагина (они передаются ему как коллекция параметров) их необходимо зарегистрировать в Plugin Registration Tool. Но т.к. регистрация происходит после разработки, то обо всем по порядку 🙂
Рассмотрим небольшой пример в их работе. Допустим нам необходимо получить значения некоторых полей записи Контакта до их изменения…
- Создайте новый плагин, подпишите его и подключите к нему SDK сборки;
- Добавьте в него следующий код:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; namespace ClassLibrary1 { public class imageTest : IPlugin { public void Execute(IPluginExecutionContext context) { // Проверяем что pre-снимок существует if (context.PreEntityImages.Properties.Contains("ContactImage") && context.PreEntityImages.Properties["ContactImage"] is DynamicEntity) { // Получаем pre-снимок как объект DynamicEntity DynamicEntity preContact = (DynamicEntity)context.PreEntityImages.Properties["ContactImage"]; // Получаем GUID записи из снимка Key keyContactId = (Key)preContact.Properties["contactid"]; string ContactId = keyContactId.Value.ToString(); // Получаем лукап записи из снимка Lookup lkpPrice = (Lookup)preContact.Properties["defaultpricelevelid"]; string strLkpPriceGuid = lkpPrice.Value.ToString(); // Получаем владельца записи из снимка Owner ownerContact = (Owner)preContact.Properties["ownerid"]; string strOwnerGuid = ownerContact.Value.ToString(); // Получаем значение денежного поле записи из снимка CrmMoney creditlimit = (CrmMoney)preContact["creditlimit"]; string strCreditlimit = creditlimit.Value.ToString(); // Получаем значение строкого поля из снимка String strName = (String)preContact["firstname"]; // Получаем значение пиклиста из снимка Picklist accountrolecode = (Picklist)preContact["accountrolecode"]; string strRole = accountrolecode.name; // Выводим значения полей в сообщении throw new InvalidPluginExecutionException( "GUID Контакта: " + ContactId + ", " + "GUID прайс-листа: " + strLkpPriceGuid + ", " + "GUID владельца: " + strOwnerGuid + ", " + "Кредитный лимит:" + strCreditlimit + ", " + "Имя: " + strName + ", " + "Роль: " + strRole); } // Проверяем что post-снимок существует if (context.PostEntityImages.Properties.Contains("ContactImage") && context.PostEntityImages.Properties["ContactImage"] is DynamicEntity) { // Получаем post-снимок как объект DynamicEntity DynamicEntity postSaveEntity = (DynamicEntity)context.PostEntityImages.Properties["ContactImage"]; // Работаем с PostEntityImages } } } }
- Теперь его нужно зарегистрировать. Откройте Plugin Registration Tool и зарегистрируйте сборку плагина;
- Добавьте новый шаг на обновление объекта Контакт, а стадией выберите Pre Stage;
- И последнее – регистрация нового снимка. Тут нам нужно определить три параметра:
- Pre Image и Post Image – выбираем, на какой момент времени (по отношении к основной операции) нам нужен «срез» данных;
- Parameters – задаем нужные нам поля (или все поля);
- Entity Alias – название снимка, по которому будем обращаться к нему в коде.
Для нашего примера выделите Pre Image, в качестве имени укажите ContactImage и выделите галками все поля, которые приведены в коде;
- Можете тестировать. Откройте какую-либо существующую запись Контакта (только убедитесь, что у нее заполнены все указанные в коде поля) и измените значение любого ее поля.
InputParameters и OutputParameters
InputParameters и OutputParameters это тоже коллекция параметров доступная в контексте выполнения плагина.
InputParameters — параметры сообщения запроса, который был вызван событием. Т.е. есть представляет собой данные, которые переданы платформе наряду с основным запросом. Имеет два ключа Target и OptionalParameters.
- Target property передается как DynamicEntity и представляет собой снимок данных.
- OptionalParameters – дополнительные параметры, которые могут быть переданы с сообщением запроса (например CreateDuplicatesOptionalParameters).
OutputParameters заполняется платформой и содержит валидные данные стадии после основной операции.Т.е. содержат параметры сообщения ответа. Самый типичный представитель этих параметров – id (представлен как Guid). Имеет один ключ – OptionalParameters.
Input и Output Parameters различаются в зависимости от стадии и типа сообщения.
Более точные данные по всем входным и выходным параметрам Вы можете получить с помощью Microsoft CRM 4.0 Developers Tool или из этого Excel файлика Crm Message Parameters.xls.
А сейчас совсем простой пример… проверим что плагин выполняется для объекта Контакт. Вот коде:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; namespace ClassLibrary1 { public class imageTest : IPlugin { public void Execute(IPluginExecutionContext context) { // Проверяем что input parameters содержат снимок данных target и target имееет тип DynamicEntity if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is DynamicEntity) { DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"]; // Проверяем что полагин выполняется для объекта Контакт if (entity.Name == EntityName.contact.ToString()) { throw new InvalidPluginExecutionException("Это точно контакт!"); } } } } }
Регистрируем его на событие Update стадии Pre Stage для объекта Контакт и смотрим 🙂
Спасибо, за такие полезные и доступные для понимания статьи. Нашел ответы на многие вопросы по плагинам. Был бы рад почитать на вашем блоге о сборках для бизнес-правил в похожем стиле. Спасибо
Хотелось бы подробнее узнать про triggerring pipeline
-> Олег
Обязательно будет статья и про кастомные шаги БП 🙂
-> Огурец
А что конкретно Вам нужно? При срабатывании плагина событие проходит через такой конвеер:
10 Pre-Event
20 Pre-Event (системная)
30 Core Operation
40 Post-Event (системная)
50 Post-Event
на 10 и 50 можно повесить плагин 🙂 Даже не знаю, что тут еще может быть интересного 🙂
А можно зарегистрировать плагин на открытие контакта или бизнес-партнера.
Да, можно. Сообщение — Retrieve.