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