Разработка
23
Фев
5

Параметры плагинов

Параметры контекста

Параметры контекста передаются плагину при его выполнении. Параметры контекста представляют собой глобальные системные значения, свойства связанные с объектом и контекстом события, а также коллекции других параметров (об этом чуть позже). Присутствуют во всех плагинах и различаются лишь значением переменных.
Полный их перечень приведен в статье Введение в разработку плагинов для 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 для объекта Контакт и смотрим 🙂


Комментарии (5)
  • Олег 23.02.2010

    Спасибо, за такие полезные и доступные для понимания статьи. Нашел ответы на многие вопросы по плагинам. Был бы рад почитать на вашем блоге о сборках для бизнес-правил в похожем стиле. Спасибо

  • Огурец 23.02.2010

    Хотелось бы подробнее узнать про triggerring pipeline

  • slivka_83 23.02.2010

    -> Олег
    Обязательно будет статья и про кастомные шаги БП 🙂

    -> Огурец
    А что конкретно Вам нужно? При срабатывании плагина событие проходит через такой конвеер:
    10 Pre-Event
    20 Pre-Event (системная)
    30 Core Operation
    40 Post-Event (системная)
    50 Post-Event

    на 10 и 50 можно повесить плагин 🙂 Даже не знаю, что тут еще может быть интересного 🙂

  • Aleks 23.02.2010

    А можно зарегистрировать плагин на открытие контакта или бизнес-партнера.

  • slivka_83 23.02.2010

    Да, можно. Сообщение — Retrieve.

*

code