Перейти к содержанию

Обновление полного номера карточки для учёта изменившихся плейсхолдеров

Обновление полного номера карточки для учёта изменившихся плейсхолдеров

Если требуется обновить полный номер FullNumber карточки, чтобы учесть в нём изменившиеся значения плейсхолдеров, то в одном из расширений (серверных или клиентских) требуется написать код, взаимодействующий с API номеров. Таким расширением может быть обработчик плитки TileExtension, кастомный запрос RequestExtension, расширение при сохранении карточки CardStoreExtension (метод BeforeRequest) и пр.

Note

Если изменение выполняется в CardStoreExtension.BeforeRequest на сервере, то следует учесть, что в контексте карточки присутствуют только явно изменённые поля, поэтому полей номера здесь скорее всего не будет. В этом случае рекомендуется выполнять вложенную загрузку карточки с возможным сохранением, см. Изменение поля карточки через низкоуровневое API. Если в системе включена возможность регистрации для типа карточки, то поля карточки следует загружать не через ICardGetStrategy, а используя расширения ICardRepository ExtendedWithoutTransaction. При этом загрузится информация по состоянию документа в виртуальных полях, которая уже будет задействована в NumberDirector для определения того, какой формат номера использовать: проектный номер или регистрационный. Сохранение можно выполнять без расширений через низкоуровневое API.

using Tessa.Cards; using Tessa.Cards.Numbers;

// получаем из Unity в конструкторе расширения: IUnityContainer unityContainer = ...;

var numberDirectorContainer = unityContainer.Resolve<INumberDirectorContainer>();

// получаем информацию по карточке и её типу Card card = ...; CardType cardType = ...;

// инициализируем контекст действий с номерами INumberDirectorProvider numberProvider = numberDirectorContainer.GetProvider(cardType.ID); INumberDirector numberDirector = numberProvider.GetDirector(); INumberComposer numberComposer = numberProvider.GetComposer(); INumberContext numberContext = numberDirector.CreateContext(numberComposer, card, cardType); numberContext.Initialize(numberDirector, NumberEventTypes.CustomAction);

// получаем номер Primary, т.е. основной номер карточки, отображаемый во всех представлениях и в заголовке карточки INumberObject currentNumber = numberComposer.GetNumber(numberContext, NumberTypes.Primary);

// создаём объект номера с обновлённым полем FullNumber INumberObject newNumber = currentNumber.RefreshFullNumber(numberContext);

// сохраняем поля номера в карточку, перезаписывая предыдущие поля if (newNumber.Store(numberContext)) { // сохраняем карточку card, выполнив RemoveAllButChanged и затем cardRepository.Store // (если мы уже не в расширении CardStoreExtension) }

Back to top