Разработка расширения для формирования описаний ссылок

Описание ссылки, отображаемое в списке ссылок в элементе Ссылки, может формироваться одним из трёх способов:

  • Стандартное — используется описание карточки, на которую указывает ссылка.

  • Разметка — используется специальная разметка, в которой выводятся требуемые данные карточки.

  • Расширение — для формирования описаний ссылок используется расширение Web-клиента.

Особенности использования стандартного способа формирования описаний, а также формирования описаний с помощью разметок рассмотрены см. в описании элемента управления Ссылки в Руководстве пользователя программы Конструктор Web-разметок.

В данном пункте рассмотрен пример разработки расширения для формирования описаний.

Описание ссылки формируется с помощью метода, зарегистрированного в сервисе ссылок ILinksService и указанного в качестве Метода для описания в настройках элемента Ссылки в программе Конструктор Web-разметок.

Ниже приведён пример такого метода. Здесь в описание ссылки включается название карточки, на которую ведёт ссылка, а также название метки карточки (устанавливается в Windows-клиенте).

private string GetReferenceForLink(SessionContext sessionContext, ReferenceListReference reference, ref object cache); (1) (2) (3)
{
    var labels = new StringBuilder();

    foreach (var label in sessionContext.AdvancedCardManager.GetCardData(reference.Card).Labels) (4)
    {
        labels.AppendFormat("{0} ", label.Name);
    }

    string linkTitle = labels.Length > 0 ? string.Format("{0} [{1}]", reference.CardDescription, labels) : reference.CardDescription; (5)

    return linkTitle;
}
1 sessionContext — контекст сессии, из которого могут быть получены сервисы или другие функции. Сервисы или другие функции могут быть полезны при формировании описания ссылки.
2 reference — ссылка, для которой формируется описание.
3 cache — кэш, содержащий результаты формирования описаний ссылок.
4 Формируем строку из меток карточки reference.Card. Переменная reference.Card содержит в себе идентификатор карточки, на которую указывает ссылка.
5 Формируем описание ссылки. Если меток нет, в описание добавляем только название карточки.

С целью оптимизации в методе формирования описания может использоваться кэш. В этом случае метод GetReferenceForLink будет иметь следующий вид:

private string GetReferenceForLink(SessionContext sessionContext, ReferenceListReference reference, ref object cache);
{
    var dictionary = cache != null ? cache as ConcurrentDictionary<Guid, string> : new ConcurrentDictionary<Guid, string>();

    if (!dictionary.TryGetValue(reference.Card, out string description)) (1)
    {
        description = GenDescription(sessionContext, reference);
        dictionary.TryAdd(reference.Card, description);
    }

    return description;
}

private string GenDescription(SessionContext sessionContext, ReferenceListReference reference) (2)
{
    var labels = new StringBuilder();
    foreach (var label in sessionContext.AdvancedCardManager.GetCardData(reference.Card).Labels)
    {
        labels.AppendFormat("{0} ", label.Name);
    }
    return labels.Length > 0 ? string.Format("{0} [{1}]", reference.CardDescription, labels) : reference.CardDescription;
}
1 Получаем описание из кэша или формируем новое.
2 Формирование описания вынесено в отдельный метод.

Дополнительной оптимизацией механизма получения описания ссылок может быть отказ от использования объектной модели карточек в пользу отчётов (хранимых процедур). В данном случае описание будет формироваться непосредственно в БД. Вызвать такой отчёт можно с помощью менеджера отчётов (см. Руководство программиста Docsvision):

Report report = sessionContext.Session.ReportManager.Reports[ReportID]; (1)
1 ReportId — идентификатор отчёта.

Разработанный метод необходимо зарегистрировать в серверном расширении Web-клиента:

  1. Создайте проект серверного расширения

  2. Добавьте разработанный метод (GetReferenceForLink в данном примере) в ядро расширения.

  3. Переопределите метод OnLoad(ILifetimeScope) ядра расширения следующим образом:

     public override void OnLoad(ILifetimeScope lifetimeScope)
     {
     var linksService = lifetimeScope.Resolve<ILinksService>(); (1)
    
       linksService.RegisterDescriptionColumnGenerator("SomeLinkGenerator", GetReferenceForLink); (2)
    
       base.OnLoad(lifetimeScope);
    }
    1 Получение сервиса для работы со ссылками.
    2 Регистрация метода для описания.

    В первом параметре указывается любое текстовое название метода (без пробелов, спецсимволов и пр.), по которому его можно вызывать. Данное название метода нужно будет указать в программе Конструктор Web-разметок

    Во втором параметре указывается делегат на разработанный метод формирования описания ссылки.

  4. Опубликуйте разработанное расширение на сервере Web-клиента.

  5. Откройте в программе Конструктор Web-разметок разметку карточки, в которой описание ссылок должно формироваться с помощью расширения.

  6. В свойстве Метод для описания элемента Ссылки выберите вариант Расширение, а в свойстве Наименование метода для описания укажите название разработанного метода, с которым он был зарегистрирован в сервисе ссылок (в данном примере — название SomeLinkGenerator).

  7. Сохраните разметку и перезапустите сервер Web-клиента.

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

    Пример отображения ссылок в карточке
    Рисунок 1. Пример отображения ссылок в карточке