Модели
Общее описание
Это абстрактный 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'); });
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.