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), то дополнительно модифицируем данные.