Валидация уже существующей записи при попытке её сохранить после редактирования

Доброго времени суток! Я новичок в bpm-разработке, нужна помощь.

Имеется раздел с записями, у каждой записи в карточке есть поле с названием и галочка "активна". Нужно реализовать проверку, чтобы было невозможно сохранить запись, которая является активной, если уже сохранено N активных записей (по системной настройке). Данный функционал реализовал с помощью asyncValidate и ESQ в своем методе validateCard.

Все работает, но возникла проблема. Когда у меня сохранено максимальное число активных записей и я открываю страницу редактирования одной из них и хочу просто поменять её название, система не сохраняет её, т. к. срабатывает валидация - активных записей уже максимум.

Вопрос: Как можно считать данные полей записи при инициализации её окна редактирования, чтобы не учитывать активную запись при валидации? (вычитать её из числа активных при инициализации, а затем заново плюсовать к числу активных, если галочку во время редактирования не убирали?) Где находится слушатель события, по которому происходит моя валидация?

Нравится

6 комментариев
Лучший ответ

Добрый день.

Решение очень простое: при подсчете количества записей учитывайте все записи в системе, кроме той, которую хотите сохранить.

Таким образом, если, например, у Вас в настройке указано 10 и уже создано 10, то создавая 11, система выдаст сообщение о том, что лимит исчерпан, а, если редактируете 10-ю, то система подсчитает количество записей 9 и разрешит сохранить 10-ю.

Для ответа на второй вопрос о слушателе, рекомендую отладиться на клиенте.

Добрый день.

Решение очень простое: при подсчете количества записей учитывайте все записи в системе, кроме той, которую хотите сохранить.

Таким образом, если, например, у Вас в настройке указано 10 и уже создано 10, то создавая 11, система выдаст сообщение о том, что лимит исчерпан, а, если редактируете 10-ю, то система подсчитает количество записей 9 и разрешит сохранить 10-ю.

Для ответа на второй вопрос о слушателе, рекомендую отладиться на клиенте.

в методе init можно сделать проверку

if (this.isAddMode() || this.isCopyMode()) и делать проверку только для новых записей

Алла Савельева,

Спасибо за ответ! Дело в том, что если я буду редактировать существующую НЕактивную запись и сделаю её активной, а система у меня считает на 1 меньше, то она разрешит её сохранить и в итоге получится уже 11 активных. Поэтому и нужно считывать информацию - активна ли была запись при её открытии, но до редактирования.

Владимир Соколов,

Спасибо за ответ! Если я буду делать активной существующую НЕактивную запись, то система будет её сохранять, и в итоге активных получится больше максимума. Мне нужно проверить: из числа ли активных записей выбранная запись?

Сергей Яцюк пишет:

Прочитайте признак активности до редактирования. И тогда учитывайте его при валидации (Если изначально была неактивная, а стала активная, то к количеству активных добавьте 1. Если наоборот, то отнимите 1. Ну, и если не менялось, то ничего не добавляйте) 

Владимир Соколов,

Спасибо большое за наводки! Разобрался и решил задачу.

 Сделал собственный атрибут "isActiveByDefault" c "value": false по умолч. Затем использовал метод onEntityInitialized, в котором проверил установлена ли галочка активности у записи, и если да, то this.set("isActiveByDefault", true).

После этого в моем валидаторе перед проверкой добавил ещё одно условие: if(this.get("isActiveByDefault")) {count = count - 1;}, где вычитаю текущую карточку из числа существующих активных, что позволяет её сохранить.

Единственное, что непонятно - как работают методы this.get и this.set и почему нельзя достучаться до значения атрибута через this.attributes.isActiveByDefault.value

Показать все комментарии