TrackedObject
Методы подготовки данных
TrackedObject - подготовка данных об элементе.
TrackedObject
- это объект, который используется для подготовки данных для записи в историю. Он конфигурируется фабрикой и зависит от типа сущности и конкретного элемента, который этот объект представляет.
TrackedObject
через соответствующий метод фабрики. Не инстанцируйте его самостоятельно!Сам класс TrackedObject
является абстрактным. Для каждого типа элемента у него есть наследник. В нем определяется набор полей, для которых будет записываться история изменений. Так же в нем могут быть переопределены сообщения о различных событиях.
TrackedObject
умеет работать только с объектами классов EntityObject
и \Bitrix\Crm\Item
.
Подготовка данных для EventHistory
- это основная задача TrackedObject
. Для этого у TrackedObject
есть семейство публичных методов prepare*EventData
, которые отдают объект EventHistoryData
, заполненный данными для конкретного события. Данные формируются на основе переданного в TrackedObject
элемента и с учетом особенностей типа сущности (конфигурации, которая происходит в фабрике).
Зависимые объекты
makeThisObjectDependant
и другие.
К элементу CRM могут быть привязаны зависимые сущности (контакты, товарные позиции). В случае, когда меняется состав сущностей, которые привязаны к элементу CRM, или когда меняется какое-то значимое поле привязанной сущности, это тоже нужно заносить в историю элемента. Здесь это делается посредством механизма "зависимых объектов".
TrackedObject
можно сделать зависимым с помощью метода makeThisObjectDependant(string $ownerFieldName)
. После вызова этого метода объект будет подготавливать данные с учетом того, что он — зависимый. Это повлияет на сообщения и поля, отвечающие за привязку события к элементу.
Параметр string $ownerFieldName показывает, к какому полю родителя относится этот зависимый объект. Допустим, что контакты хранятся в поле 'CONTACTS'. Соответственно, при вызове makeThisObjectDependant
мы передадим 'CONTACTS' в качестве аргумента.
Чтобы привязать зависимый объект TrackedObject
к другому TrackedObject
, который будет выступать в качестве родительского, необходимо использовать метод addDependantTrackedObject(TrackedObject $dependant)
.
makeThisObjectDependant
. Иначе будет выброшено исключение.EntityObject
или \Bitrix\Crm\Item
. Работа с массивом ID или иными типами данных не поддерживается.Алгоритм подготовки данных об обновлении в методе prepareUpdateEventData
Так как подготовка данных об обновлении элемента — самый сложный кейс в работе TrackedObject
, не лишним будет пояснить, как это работает.
При вызове метода объект проходится по всем полям, изменения которых необходимо записать в историю. Они складываются из тех полей, которые заданы в наследнике, и полей, к которым привязаны зависимые объекты, добавленные через addDependantTrackedObject
.
- Собираем данные для конкретного поля.
- Если поле обычное и оно изменилось, подготавливаем данные об изменении.
- Если поле зависимое (т.е. к нему привязан зависимый
TrackedObject
), то сравниваем коллекции привязанных объектов до и после сохранения. Найденные отличия (добавленые/удаленные объекты, изменения в значимых полях) собираем.
- Если текущий объект является зависимым (сконфигурирован через
makeThisObjectDependant
), то дополнительно модифицируем данные.