Реализация методов для работы с карточками из разметок
Программисту предоставляется возможность добавить новую функциональность в механизмы создания и работы с карточками из разметок. Данная возможность реализуется с помощью специального класса с интерфейсом ICardLifeCycleEx
. Интерфейс ICardLifeCycleEx
предоставляет методы, которые вызываются на различных этапах работы с карточкой:
public interface ICardLifeCycleEx
{
Guid CardTypeId { get; } (1)
Guid Create(SessionContext sessionContext, CardCreateLifeCycleOptions options); (2)
bool Validate(SessionContext sessionContext, CardValidateLifeCycleOptions options, out List<ValidationResult> validationResults); (3)
void OnSave(SessionContext sessionContext, CardSaveLifeCycleOptions options); (4)
bool CanDelete(SessionContext sessionContext, CardDeleteLifeCycleOptions options, out string message); (5)
void OnDelete(SessionContext sessionContext, CardDeleteLifeCycleOptions options); (6)
string GetDigest(SessionContext sessionContext, CardDigestLifeCycleOptions options); (7)
}
1 | Идентификатор типа карточек. |
2 | Create — Вызывается при получении разметки создания карточки. |
3 | Validate — Вызывается перед сохранением изменений карточки в БД с возможностью прервать сохранение. |
4 | OnSave — Вызывается при сохранении изменений карточки. Позволяет добавить дополнительную логику в сохранение карточки, но без возможности прервать сохранение. |
5 | CanDelete — Вызывается перед удалением карточки. Позволяет прервать удаление. |
6 | OnDelete — Вызывается при удалении карточки. Позволяет добавить дополнительную логику в удаление карточки, но без возможности прервать удаление. |
7 | GetDigest — Вызывается при получении дайджеста карточки при её сохранении. Позволяет добавить собственную логику формирования дайджеста. Метод GetDigest используется, только когда способ формирования дайджеста не настроен в Docsvision и карточка сохраняется из пользовательского интерфейса (при нажатии кнопки Сохранить, сохранении по месту или скриптом). |
Указанные методы используются исключительно при выполнении стандартных операций со строками из разметок или с использованием JS WebAPI разметок. В других случаях методы интерфейса ICardLifeCycleEx
не вызываются и не влияют на работу сервера Web-клиента с карточками.
Следующий код демонстрирует пример реализации класса, в котором определены собственные функции создания и сохранения карточки.
using System;
using DocsVision.BackOffice.ObjectModel.Services;
using DocsVision.BackOffice.ObjectModel;
using DocsVision.Platform.WebClient;
using DocsVision.WebClientLibrary.ObjectModel.Services.EntityLifeCycle;
using DocsVision.WebClientLibrary.ObjectModel.Services.EntityLifeCycle.Options;
using DocsVision.BackOffice.CardLib.CardDefs;
internal class DocumentCardLifeCycle : BaseCardLifeCycleEx
{
public override Guid CardTypeId => CardDocument.ID;
public override Guid Create(SessionContext sessionContext, CardCreateLifeCycleOptions options)
{
if (!options.CardKindId.HasValue)
throw new ArgumentNullException(nameof(options.CardKindId));
var objectContext = sessionContext.ObjectContext;
var kindsCardKind = objectContext.GetObject<KindsCardKind>(options.CardKindId);
var documentService = objectContext.GetService<IDocumentService>();
var document = documentService.CreateDocument(null, kindsCardKind);
document.Description = document.SystemInfo.CardKind.Name;
document.MainInfo.Name = "Наименование документа";
objectContext.AcceptChanges();
return document.GetObjectId();
}
public override void OnSave(SessionContext sessionContext, CardSaveLifeCycleOptions options)
{
base.OnSave(sessionContext, options);
var objectContext = sessionContext.ObjectContext;
var document = objectContext.GetObject<Document>(options.CardId);
document.MainInfo.Name = "Принудительно установленное наименование документа";
objectContext.AcceptChanges();
}
}
В приведенном коде класс DocumentCardLifeCycle
наследуется от базовой реализации интерфейса ICardLifeCycleEx
— класса BaseCardLifeCycle
с абстрактными методами. Помимо класса BaseCardLifeCycle
с базовой реализацией, API включает реализующий интерфейс ICardLifeCycleEx
класс DefaultCardLifeCycle
с реализацией по умолчанию методов Create
и CreateFromTemplate
.
Метод Create
в приведенном выше коде создаёт новую карточку Документ с предустановленным названием (document.MainInfo.Name
). Метод CreateFromTemplate
создаёт карточку Документа по шаблону. Метод Save
изменяет значение поля document.MainInfo.Name
при сохранении карточки.
Тип с интерфейсом ICardLifeCycleEx
нужно добавить в IoC-контейнер в ядре расширения:
public override void InitializeServiceCollection(IServiceCollection services)
{
services.AddTransient<ICardLifeCycleEx, DocumentCardLifeCycle>();
}
Серверное расширение должно быть опубликовано стандартным образом.