Как можно отследить изменение определенного поля в HL-блоке?

Как можно узнать, какие поля были изменены в HL-блоке с использованием событий в функции OnAfterUpdate?
  • 13 ноября 2023 г. 6:52
Ответы на вопрос 2
Чтобы отследить изменение определенного поля в HL-блоке, можно использовать следующий подход:

1. В функции OnBeforeUpdate HL-блока сохраните старые значения полей HL-блока в отдельные переменные или массивы. Для этого можно использовать функции `Bitrix\Highloadblock\HighloadBlockTable::getById` и `Bitrix\Highloadblock\HighloadBlockTable::getList`.

2. В функции OnAfterUpdate HL-блока получите новые значения полей HL-блока. Для этого также можно использовать функции `Bitrix\Highloadblock\HighloadBlockTable::getById` и `Bitrix\Highloadblock\HighloadBlockTable::getList`.

3. После этого сравните старые и новые значения полей, чтобы определить, какие из них были изменены. Если значение поля изменилось, вы можете выполнить необходимые действия, например, вызвать определенную функцию или записать информацию об изменении в журнал.

Ниже приведен пример кода, который иллюстрирует этот подход:

```
use Bitrix\Highloadblock\HighloadBlockTable;

AddEventHandler("highloadblock", "OnBeforeUpdate", "OnBeforeHlBlockUpdate");
function OnBeforeHlBlockUpdate($id, &$arFields) {
    // Получаем старые значения полей HL-блока
    $hlblock = HighloadBlockTable::getById($id)->fetch();
    if ($hlblock) {
        $entity = HighloadBlockTable::compileEntity($hlblock);
        $oldData = $entity->getDataClass()::getById($arFields["ID"])->fetch();
        // Сохраняем старые значения в глобальной переменной или массиве
        // В зависимости от вашей логики
        $GLOBALS["OLD_FIELD_VALUES"][$arFields["ID"]] = $oldData;
    }
}

AddEventHandler("highloadblock", "OnAfterUpdate", "OnAfterHlBlockUpdate");
function OnAfterHlBlockUpdate($id, $arFields) {
    // Получаем новые значения полей HL-блока
    $hlblock = HighloadBlockTable::getById($id)->fetch();
    if ($hlblock) {
        $entity = HighloadBlockTable::compileEntity($hlblock);
        $newData = $entity->getDataClass()::getById($arFields["ID"])->fetch();
        // Сравниваем старые и новые значения полей
        foreach ($newData as $fieldCode => $newValue) {
            $oldValue = $GLOBALS["OLD_FIELD_VALUES"][$arFields["ID"]][$fieldCode];
            if ($newValue != $oldValue) {
                // Поле было изменено, выполните необходимые действия
                // ...
            }
        }
    }
}
```

Обратите внимание, что этот код предполагает, что вы уже знаете ID HL-блока, а также коды полей в HL-блоке. Вы можете настроить этот код в соответствии с вашими конкретными требованиями и структурой HL-блока.
OnBeforeUpdate: запишите значения поля в статическую переменную.
OnAfterUpdate: сравните значения поля с текущим значением. Если они отличаются, выполните свою логику.
Похожие вопросы