Разработка
02
Авг
4

Дефолтное Представление по умолчанию с помощью плагина

Предположим, что у нас есть требование по умолчанию открывать разные представления в зависимости от Роли текущего пользователя или каких-либо других условий и т.д. Мы можем достигнуть этого с использованием Плагина.

Когда пользователь переходит к какому-либо объекту в основном окне (например к Контактам) в фоновом режиме происходит вызов метода RetreieveMultiple для объекта savedquery. savedquery это системный объект CRM, который хранит метаданные всех Представлений в системе. С ним нам и предстоит работать…

Итак, для установки дефолтного Представления создайте плагин с таким кодом:

using System;
using System.Diagnostics;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace defaultview
{
    public class defaultview : 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);

            if (context.InputParameters.Contains("Query") && context.InputParameters["Query"] is QueryExpression && context.Stage == 40)
            {
                QueryExpression qe = (QueryExpression)context.InputParameters["Query"];
                if (qe.Criteria != null)
                {
                    ConditionExpression condition = (ConditionExpression)qe.Criteria.Conditions[1];
                    // Проверяем что коды выполняется для определенного объекта - укажите код соответствуюзего объекта
                    if (condition.Values[0].Equals(2))
                    {
                        // Имя Представления которое необходимо сделать дефолтным
                        string defaultView = "Активные контакты";

                        // Получаем текущую коллекцию представлений
                        EntityCollection collection = (EntityCollection)context.OutputParameters["BusinessEntityCollection"];

                        // Просматриваем коллецию Представлений и сравнивает каждое из них с заданным
                        // Если совпадение найдено то делаем его дефолтным
                        foreach (Entity record in collection.Entities)
                        {
                            string viewName = (string)record["name"];
                            if (viewName.Equals(defaultView))
                            {
                                record["isdefault"] = new bool();
                                record["isdefault"] = true;
                            }
                            else
                            {
                                record["isdefault"] = new bool();
                                record["isdefault"] = false;
                            }
                        }

                        // Подменяем в OutputParameters коллекцию Представлений (с новым дефолтным Представлением)
                        context.OutputParameters["BusinessEntityCollection"] = collection;
                    }
                }
            }
        }
    }
}

Что тут происходит:

  • Сначала делаем кучу проверок. В том числе проверяем, что работаем с нужным объектом по его коду;
  • Из OutputParameters вытаскиваем коллекцию BusinessEntityCollection содержащую все возвращенные запросом Представления;
  • Просматриваем каждое Предсталение и сравниваем его имя с заданным. Если совпадение найдено, то устанавливаем для него свойство isdefault;
  • Заменяем коллекцию Представлений в OutputParameters обновленной коллекцией.

Зарегистрируйте плагин в CRM с такими параметрами:

  • Message: RetrieveMultiple;
  • Entity: SavedQuery;
  • Mode: Synchronous.
  • Stage: Post.

Идем смотреть…

З.Ы. Данный код будет работать только при первом (после запуска браузера) открытии Представлений объекта. Т.е. с началом нового «сеанса» работы с CRM. И не будет работать в двух случаях:

  • Если пользователь установил лично для себе другое Представление по умолчанию;
  • Если пользователь в течении одного «сеанса» работы с CRM переходил во время работы к другим Представлениям объекта, то по возвращении к нему будет всегда открываться последнее использованное Представление.



Комментарии (4)
  • Михаил 02.08.2012

    Простите за нубский вопрос, но какой сакральный смысл от первой строки:
    record[«isdefault»] = new bool();
    record[«isdefault»] = true;

  • slivka_83 02.08.2012

    Основной смысл — задать дефолтное представление.

  • Михаил 02.08.2012

    Для того, чтобы задать дефолтовое представление достаточно строки
    record[«isdefault»] = true;
    А зачем строка
    record[«isdefault»] = new bool();
    ?

  • slivka_83 02.08.2012

    Вполне возможно — не проверял.

*

code