Модели
Общее описание
Это абстрактный js-экстеншн, содержащий только один класс.
Этот класс в паре с Service\Converter призван обеспечить "бесшовный" и прозрачный обмен данными между бекендом и фронтендом.
Жизненный цикл выглядит следующим образом:
- Данные загружаются из базы данных.
- На бекенде они преобразуются в json с помощью Service\Converter.
- На основе данных создается наследник
crm.model, обеспечивающий удобный доступ к данным на стороне фронтенда. - Данные могут быть изменены на фронтенде по аналогии с методами
EntityObjectна бекенде. - После изменения данные могут быть сохранены вызовом метода
save, который сделает ajax-запрос на соответствующий контроллер. - Контроллер выполнит действие над элементом и вернет обратно актуальное состояние объекта снова в json формате.
Есть ещё вариант, когда на фронте есть только id и модель может получить актуальные данные с бекенда с помощью метода load().
Чтобы все эти действия работали, внутри модели должен быть способ получить название четырех ajax-действий:
get;add;update;delete.
По умолчанию названия действий получаются как 'crm.api.' + this.getModelName() + '.' + action.
Модель можно сконфигурировать, передав дополнительные get-параметры для каждого действия
Но чтобы вся цепочка заработала как задумано, на каждый тип данных необходимо иметь:
- свою реализацию конвертера;
- свою реализацию модели;
- свой контроллер.
Пока что всё это есть только для настроек смарт-процесса (crm.type-model).
Методы
| Метод | Описание | С версии |
|---|---|---|
constructor(data: {}, params: {})
|
Конструктор. Аргумент data используется как данные о модели. Аргумень params используется при ajax-запросах. | |
get actions() |
Вернет объект с ключами get, add, update, delete, где указаны названия ajax-действий для выполнения чтения, добавления, обновления и удаления данных. | |
compileActionString(action: string): string |
Соберет строку с названием ajax-действия для выполнения action . | |
getId(): ?number |
Вернет идентификатор. Если его нет, то считается, что это новые данные, ещё не сохраненные в БД. | |
getEntityTypeId(): ?number |
Вернет идентификатор типа сущности CRM. | |
isSaved(): boolean |
Вернет true, если id > 0. | |
isDeleted(): boolean |
Вернет true, если объект удален из базы данных (был вызван и успешно отработал метод delete). | |
setData(data) |
Запишет данные модели data. | |
getData() |
Вернет данные модели. | |
setGetParameters(action: string, parameters: getParameters) |
Запишет дополнительные get-параметры getParameters для действия с кодом action. | |
getGetParameters(action: string): getParameters |
Вернет дополнительные get-параметры для действия с кодом action. | |
getModelName(): string |
Вернет строковое представление модели. Абстрактный метод, должен быть определен в наследнике. | |
setDataFromResponse(response: {data: {}}) |
Записывает новые данные о модели из ответа на ajax-действие response. | |
load(): Promise<{data: {}},string[]> |
Выполнит ajax-запрос на действие с кодом get. Вернет Promise, который будет разрешен после обновления данных о модели. | |
save(): Promise<{data: {}},string[]> |
Выполнит ajax-запрос на действие с кодом add (если данные не были сохранены) или update. Вернет Promise, который будет разрешен после после выполнения запроса. | |
delete(): Promise<{data: {}},string[]> |
Выполнит ajax-запрос на действие с кодом delete (если данные не были сохранены) или update. Вернет Promise, который будет разрешен после после выполнения запроса. |
Наследники
TypeModel (crm.type-model)
Класс для работы с настройками смарт-процессов.
ajax-действия:
get: crm.type.getadd: crm.type.addupdate: crm.type.updatedelete: crm.type.delete
Позволяет полноценно работать с данными на стороне фронтенда.
Помимо методов базового класса обладает рядом именных методов для получения / изменения данных модели.
getTitle / setTitlegetCreatedBygetIsCategoriesEnabled / setIsCategoriesEnabledgetIsStagesEnabled / setIsStagesEnabledgetIsBeginCloseDatesEnabled / setIsBeginCloseDatesEnabledgetIsClientEnabled / setIsClientEnabledgetIsLinkWithProductsEnabled / setIsLinkWithProductsEnabledgetIsCrmTrackingEnabled / setIsCrmTrackingEnabledgetIsMycompanyEnabled / setIsMycompanyEnabledgetIsDocumentsEnabled / setIsDocumentsEnabledgetIsSourceEnabled / setIsSourceEnabledgetIsUseInUserfieldEnabled / setIsUseInUserfieldEnabledgetIsObserversEnabled / setIsObserversEnabledgetIsRecyclebinEnabled / setIsRecyclebinEnabledgetIsAutomationEnabled / setIsAutomationEnabledgetIsBizProcEnabled / setIsBizProcEnabledgetIsSetOpenPermissions / setIsSetOpenPermissionsgetLinkedUserFields / setLinkedUserFieldsgetCustomSectionId / setCustomSectionId
Помимо этих полей есть методы управления сложными данными о настройках - настройки дополнительных разделов и настройки связей:
getCustomSections / setCustomSectionsДанные о настройках дополнительных разделов имеют вид массива с элементами:
{ id: number, title: string, isSelected: boolean }getRelations / setRelationsДанные о настройках связей имеют вид
RelationsMap[]:declare type RelationsMap = { parent: Relation[], child: Relation[], } declare type Relation = { entityTypeId: number, isChildrenListEnabled?: boolean|null, isPredefined?: boolean, }
StageModel (crm.stage-model)
Модель данных о стадии. Не работает с ajax-действиями, работает только на фронтенде.
Имеет набор именованных методов для получения данных о стадии:
getName / setNamegetEntityIdgetStatusIdgetSort / setSortgetColor / setColorgetSemanticsgetCategoryIdisFinalisSuccessisFailure
CategoryModel (crm.category-model)
Модель данных о направлении произвольного типа сущности. Не работает с ajax-действиями, работает только на фронтенде.
Имеет набор именованных методов для получения данных о направлении:
getName / setNamegetSort / setSortisDefault / setDefault
Примеры
$entityTypeId = 140; $type = \Bitrix\Crm\Model\Dynamic\TypeTable::getByEntityTypeId($entityTypeId)->fetchObject(); \Bitrix\Main\UI\Extension::load(['crm.type-model']);
const typeModel = new BX.Crm.Models.TypeModel(= CUtil::PhpToJSObject($type->jsonSerialize()) ?>);
typeModel.setTitle('newTitle);
typeModel.save().then(() => {
console.log('typeModel updated');
});