Реализация методов для работы с карточками из разметок
Программисту предоставляется возможность добавить новую функциональность в механизмы создания и работы с карточками из разметок. Данная возможность реализуется с помощью специального класса с интерфейсом 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 | Идентификатор типа карточек. |
Серверное расширение должно быть опубликовано стандартным образом.