Генерируем виртуальный файл по файловому шаблону
Генерируем виртуальный файл по файловому шаблону¶
Для примера рассмотрим сценарий, когда вместо типового листа согласования требуется получить контент файла из некоторого файлового шаблона. Для этого достаточно написать расширение на получение контента файла, которое выполняется перед типовым расширением, определяет идентификатор файлового шаблона по некоторым правилам, а затем подменяет параметры запроса context.Request
, чтобы платформа выполнила генерацию файла по шаблону.
В типовом решении присутствует расширение KrCardGetFileContentExtension
для получения контента виртуального листа согласования. Его регистрация в классе Tessa.Extensions.Default.Server.Workflow.KrProcess.Registrator
выполняется с порядковым номером BeforePlatform, 0
. Поэтому наше расширение должно регистрироваться раньше, с порядковым номером BeforePlatform, -1
.
using System;
using Tessa.Cards;
using Tessa.Cards.Extensions;
using Tessa.Extensions.Default.Shared.Workflow.KrProcess;
namespace Tessa.Extensions.Server.Files
{
public sealed class MyApprovalListGetFileContentExtension : CardGetFileContentExtension
{
public override void BeforeRequest(ICardGetFileContentExtensionContext context)
{
CardGetFileContentRequest request = context.Request;
Guid? cardID;
if (context.CardType == null
|| request.FileID != KrApprovalListHelper.FileID
|| !(cardID = request.CardID).HasValue)
{
return;
}
// указываем идентификатор файлового шаблона, здесь его можно получить запросом из базы через context.DbScope,
// в т.ч. в зависимости от версии файла request.VersionRowID: обычный или печатный лист согласования
Guid templateID = new Guid("15254c2f-3702-44b6-acd1-1d5d03433219");
request.CardID = templateID;
request.VersionRowID = CardHelper.ReplacePlaceholdersVersionRowID;
request.Info[CardHelper.PlaceholderCurrentCardIDInfo] = cardID;
request.FileID = null;
request.CardTypeID = null;
request.CardTypeName = null;
request.FileTypeID = null;
// удаляем права доступа типового решения, если они были, т.к. мы будем генерировать файл по файловому шаблону,
// а карточка шаблона не подчиняется типовой системе прав доступа
KrToken.Remove(request.Info);
}
}
[Registrator]
public sealed class Registrator : RegistratorBase
{
public override void RegisterExtensions(IExtensionContainer extensionContainer)
{
extensionContainer
.RegisterExtension<ICardGetFileContentExtension, MyApprovalListGetFileContentExtension>(x => x
.WithOrder(ExtensionStage.BeforePlatform, -1)
.WithSingleton())
;
}
}
}
Версии виртуальных файлов листа согласования добавляются в типовом расширении Tessa.Extensions.Default.Server.Files.KrAddApprovalListGetExtension
. Если вам требуется добавить новый виртуальный файл, то напишите расширение, добавляющее его, по аналогии с типовым расширением.