Модели
Общее описание
Это абстрактный 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.get
add: crm.type.add
update: crm.type.update
delete: crm.type.delete
Позволяет полноценно работать с данными на стороне фронтенда.
Помимо методов базового класса обладает рядом именных методов для получения / изменения данных модели.
getTitle / setTitle
getCreatedBy
getIsCategoriesEnabled / setIsCategoriesEnabled
getIsStagesEnabled / setIsStagesEnabled
getIsBeginCloseDatesEnabled / setIsBeginCloseDatesEnabled
getIsClientEnabled / setIsClientEnabled
getIsLinkWithProductsEnabled / setIsLinkWithProductsEnabled
getIsCrmTrackingEnabled / setIsCrmTrackingEnabled
getIsMycompanyEnabled / setIsMycompanyEnabled
getIsDocumentsEnabled / setIsDocumentsEnabled
getIsSourceEnabled / setIsSourceEnabled
getIsUseInUserfieldEnabled / setIsUseInUserfieldEnabled
getIsObserversEnabled / setIsObserversEnabled
getIsRecyclebinEnabled / setIsRecyclebinEnabled
getIsAutomationEnabled / setIsAutomationEnabled
getIsBizProcEnabled / setIsBizProcEnabled
getIsSetOpenPermissions / setIsSetOpenPermissions
getLinkedUserFields / setLinkedUserFields
getCustomSectionId / 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 / setName
getEntityId
getStatusId
getSort / setSort
getColor / setColor
getSemantics
getCategoryId
isFinal
isSuccess
isFailure
CategoryModel (crm.category-model)
Модель данных о направлении произвольного типа сущности. Не работает с ajax-действиями, работает только на фронтенде.
Имеет набор именованных методов для получения данных о направлении:
getName / setName
getSort / setSort
isDefault / 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'); });