Реализация методов для работы с карточками из разметок
Программисту предоставляется возможность добавить новую функциональность в механизмы создания и работы с карточками из разметок. Данная возможность реализуется с помощью специального класса с интерфейсом ICardLifeCycle
. Интерфейс ICardLifeCycle
предоставляет методы, которые вызываются на различных этапах работы с карточкой:
public interface ICardLifeCycle
{
Guid Create(SessionContext sessionContext, Guid? cardKindId, Guid? parentCardId); (1)
Guid CreateFromTemplate(SessionContext sessionContext, Guid templateId, Guid? parentCardId); (2)
string GetDigest(SessionContext sessionContext, Guid cardId); (3)
bool Validate(SessionContext sessionContext, Guid cardId, out List<ValidationResult> validationResults); (4)
void OnSave(SessionContext sessionContext, Guid cardId); (5)
bool CanDelete(SessionContext sessionContext, Guid cardId, out string message); (6)
void OnDelete(SessionContext sessionContext, Guid cardId); (7)
}
1 | Create — Вызывается при получении разметки создания карточки. |
2 | CreateFromTemplate — Вызывается при получении разметки создания карточки по шаблону. |
3 | Validate — Вызывается перед сохранением изменений карточки в БД с возможностью прервать сохранение. |
4 | GetDigest — Вызывается при получении дайджеста карточки при её сохранении. Позволяет добавить собственную логику формирования дайджеста. Метод GetDigest используется, только когда способ формирования дайджеста не настроен в Docsvision и карточка сохраняется из пользовательского интерфейса (при нажатии кнопки Сохранить, сохранении по месту или скриптом). |
5 | OnSave — Вызывается при сохранении изменений карточки. Позволяет добавить дополнительную логику в сохранение карточки, но без возможности прервать сохранение. |
6 | CanDelete — Вызывается перед удалением карточки. Позволяет прервать удаление. |
7 | OnDelete — Вызывается при удалении карточки. Позволяет добавить дополнительную логику в удаление карточки, но без возможности прервать удаление. |
Указанные методы используются исключительно при выполнении стандартных операций со строками из разметок или с использованием JS WebAPI разметок. В других случаях методы интерфейса ICardLifeCycle
не вызываются и не влияют на работу сервера Web-клиента с карточками.
Следующий код демонстрирует пример реализации класса, в котором определены собственные функции создания и сохранения карточки.
public class DocumentCardLifeCycle : BaseCardLifeCycle
{
public override Guid Create(SessionContext sessionContext, Guid? cardKindId, Guid? parentCardId)
{
if (!cardKindId.HasValue)
throw new ArgumentNullException(nameof(cardKindId));
var objectContext = sessionContext.ObjectContext;
var kindsCardKind = objectContext.GetObject<KindsCardKind>(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 Guid CreateFromTemplate(SessionContext sessionContext, Guid templateId, Guid? parentCardId)
{
var objectContext = sessionContext.ObjectContext;
var documentService = objectContext.GetService<IDocumentService>();
var document = documentService.CreateDocumentFromTemplate(templateId);
objectContext.AcceptChanges();
return document.GetObjectId();
}
public override void Save(SessionContext sessionContext, Guid cardId)
{
base.Save(sessionContext, cardId);
var objectContext = sessionContext.ObjectContext;
var document = objectContext.GetObject<Docsvision.BackOffice.ObjectModel.Document>(cardId);
document.MainInfo.Name = "Принудительно установленное наименование документа";
objectContext.AcceptChanges();
}
}
В приведенном коде класс DocumentCardLifeCycle
наследуется от базовой реализации интерфейса ICardLifeCycle
— класса BaseCardLifeCycle
с абстрактными методами. Помимо класса BaseCardLifeCycle
с базовой реализацией, API включает реализующий интерфейс ICardLifeCycle
класс DefaultCardLifeCycle
с реализацией по умолчанию методов Create
и CreateFromTemplate
.
Метод Create
в приведенном выше коде создаёт новую карточку Документ с предустановленным названием (document.MainInfo.Name
). Метод CreateFromTemplate
создаёт карточку Документа по шаблону. Метод Save
изменяет значение поля document.MainInfo.Name
при сохранении карточки.
Тип с интерфейсом ICardLifeCycle
нужно добавить в IoC-контейнер в ядре расширения:
public override void InitializeContainer(ContainerBuilder containerBuilder) {
var cardTypeID = new Guid("B9F7BFD7-7429-455E-A3F1-94FFB569C794"); (1)
containerBuilder.RegisterType<DocumentCardLifeCycle>().Keyed<ICardLifeCycle>(cardTypeID).SingleInstance();
}
1 | Идентификатор типа карточек. |
Серверное расширение должно быть опубликовано стандартным образом.