Добавление условия выбора разметок

Данный раздел содержит описание примера серверного расширения. Пример демонстрирует добавление условия выбора разметок по группе, пользователю, роли.

Ссылка на пример на GitHub: CustomConditionTypes.

После сохранения изменений в конструкторе разметок, разметка отображается в соответствии с заданными условиями.

Пример рассчитан на версию Web-клиента 6.1 или выше.

Перечень необходимых инструментов:

Сборка и установка

  1. Откройте /Samples.sln.

  2. Соберите проект ServerExtensions > CustomConditionTypes > CustomConditionTypesDesignerExtension.

  3. Соберите проект ServerExtensions > CustomConditionTypes > CustomConditionTypesLayoutExtension.

  4. Соберите проект ServerExtensions > CustomConditionTypes > CustomConditionTypesInterfaces.

  5. Скопируйте каталог SamplesOutput\Plugins\CustomConditionTypesDesignerExtension в каталог Путь к директории с исполняемым файлом конструктора Web-разметок\Plugins.

  6. Скопируйте каталог SamplesOutput\Plugins\CustomConditionTypesInterfaces в каталог Путь к директории с исполняемым файлом конструктора Web-разметок\Plugins.

  7. Скопируйте каталог SamplesOutput\Extensions\CustomConditionTypesInterfaces в каталог Путь к сайту Web-клиента\Extensions.

  8. Скопируйте каталог SamplesOutput\Extensions\CustomConditionTypesLayoutExtension в каталог Путь к сайту Web-клиента\Extensions.

  9. Перезапустите dvwebclient.

Проверка примера

  1. Запустите Конструктор Web-разметок.

  2. Выберите или создайте любую разметку в локации WebFrame  MainMenu.

  3. Откройте вкладку условия использования разметки.

  4. Добавьте новое условие выбора или измените существующее.

  5. Измените в условии выбора роль, группу, пользователя или все сразу.

  6. Запустите Web-клиент.

  7. Заданная разметка отображается только если выполняются условия выбора разметки.

Проект "CustomConditionTypesWebLayoutsDesignerExtension"

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

    [SupportedOSPlatform("windows")]
    internal class CustomConditionTypesProvider : IConditionTypesProvider
    {
        public Guid Id => Constants.ExtensionId;

        public List<Staff> GetStaffTree() (1)
        {
            var staffTree = new List<Staff>();

            var sessionContext = this.SessionContextProvider.GetOrCreateCurrentSessionContext();

            var staffService = sessionContext.ObjectContext.GetService<IStaffService>();
            var units = staffService.GetUnits(null, true).OrderBy(u => u.Name);

            foreach (var unit in units)
            {
                var nodeStaff = unit.Staff;
                staffTree.Add(nodeStaff);
            }

            return staffTree;
        }

        public List<StaffEmployee> GetUsersTree() (2)
        {
            var usersTree = new List<StaffEmployee>();

            var sessionContext = this.SessionContextProvider.GetOrCreateCurrentSessionContext();
            var staffService = sessionContext.ObjectContext.GetService<IStaffService>();
            var units = staffService.GetUnits(null, true).OrderBy(u => u.Name);
            foreach (var unit in units)
            {
                foreach (var employee in unit.Employees)
                    usersTree.Add(employee);
            }

            return usersTree;
        }

        private readonly IServiceProvider serviceProvider;
        private ICurrentObjectContextProvider sessionContextProvider;

        public CustomConditionTypesProvider(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider;
        }

        private ICurrentObjectContextProvider SessionContextProvider
        {
            get
            {
                if (this.sessionContextProvider == null)
                    this.sessionContextProvider = DocsVision.Platform.Tools.LayoutEditor.ServiceUtil.GetService<ICurrentObjectContextProvider>(this.serviceProvider);
                return this.sessionContextProvider;
            }
        }
1 Получение списка штатов сотрудников.
2 Получение списка сотрудников.

Проект "CustomConditionTypesLayoutExtension"

Проект-расширение для Web-клиента, которое позволяет определить, выполняется условие выбора разметки или нет для текущего контекста.

Фрагмент "CustomConditionTypesLayoutExtension.cs"
    public class CustomConditionTypesLayoutExtension : ILayoutExtension
    {
        public CustomConditionTypesLayoutExtension()
        {
            this.LayoutExtensionDescription = new LayoutExtensionDescription
            {
                Id = Constants.ExtensionId,
                Name = "Custom condition types layout extension",
                Version = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion,
                ConditionTypes = this.GetConditionTypes(),
                ModeConditionTypes = this.GetLayoutTypes()
            };
        }

При внесении изменений необходимо увеличивать номер версии расширения в AssemblyFileVersion.

Проект "CustomConditionTypesInterfaces"

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

Фрагмент "Constants.cs"
    public static class Constants
    {
        public static readonly Guid ExtensionId = new Guid("7BDD6F65-B6F2-414F-B97F-13E87E972F85");
        public static readonly Guid LocationExtensionId = new Guid("7e794753-46ed-42f3-85b2-2e172c00d045");

        public static class ConditionTypes
        {
            public static readonly Guid GroupsConditionType = new Guid("AC83CC41-CB31-4804-B330-A180FA02BA9D");
            public static readonly Guid UnitConditionType = new Guid("103B4D34-594A-479B-BE72-D481677C5136");
            public static readonly Guid RolesConditionType = new Guid("986E19CD-6101-4979-A99B-77CA50C0D781");
        }

        public static class MainMenu
        {
            public const string Id = "DV.MainMenu";
        }
    }