Разработка расширения для формирования описаний ссылок
Описание ссылки, отображаемое в списке ссылок в элементе Ссылки
, может формироваться одним из трёх способов:
-
Стандартное — используется описание карточки, на которую указывает ссылка.
-
Разметка — используется специальная разметка, в которой выводятся требуемые данные карточки.
-
Расширение — для формирования описаний ссылок используется расширение 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-клиента:
-
Добавьте разработанный метод (
GetReferenceForLink
в данном примере) в ядро расширения. -
Переопределите метод
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-разметок
Во втором параметре указывается делегат на разработанный метод формирования описания ссылки.
-
Опубликуйте разработанное расширение на сервере Web-клиента.
-
Откройте в программе Конструктор Web-разметок разметку карточки, в которой описание ссылок должно формироваться с помощью расширения.
-
В свойстве
Метод для описания
элементаСсылки
выберите вариант Расширение, а в свойствеНаименование метода для описания
укажите название разработанного метода, с которым он был зарегистрирован в сервисе ссылок (в данном примере — названиеSomeLinkGenerator
). -
Сохраните разметку и перезапустите сервер Web-клиента.