1С-Битрикс. Логируем изменения сущности элемента торгового каталога
В лог будем писать все изменения сущности торгового каталога CCatalogProduct.
Код логера
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog', 'OnBeforeProductUpdate', ['\OlegproLogCatalogHandler', 'OnBeforeProductUpdate'] ); \Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog', 'OnProductUpdate', ['\OlegproLogCatalogHandler', 'OnProductUpdate'] ); class OlegproLogCatalogHandler { private static $beforeProduct = null; public static function OnBeforeProductUpdate($ID, $arFields) { if ( is_array($arFields) && array_key_exists('QUANTITY', $arFields) && \Bitrix\Main\Loader::includeModule('catalog') && ($product = \CCatalogProduct::GetByID($ID)) && is_array($product) ) { self::$beforeProduct = $product; self::$beforeProduct['ID'] = $ID; } } public static function OnProductUpdate($ID, $arFields) { if ( is_array(self::$beforeProduct) && self::$beforeProduct['ID'] == $ID && is_array($arFields) && array_key_exists('QUANTITY', $arFields) && $arFields['QUANTITY'] != self::$beforeProduct['QUANTITY'] ) { global $USER; if ((is_object($USER) && $USER instanceof \CUser)) { $USER = new \CUser(); } $msg = [ '$ID' => $ID, '$arFields old' => self::$beforeProduct, '$arFields' => $arFields, '$_SERVER' => $_SERVER, '$_GET' => $_GET, '$_POST' => $_POST, 'debug_backtrace' => \Bitrix\Main\Diag\Helper::getBackTrace(), ]; $var = 'OnProductUpdate'; \Bitrix\Main\Diag\Debug::writeToFile( sprintf( "%s. User: %s [%d]\n%s", date('d-m-Y H:i:s'), $USER->GetLogin(), $USER->GetID(), (is_array($msg) ? print_r($msg, true) : $msg) ), $var, sprintf( '.logs/%s-catalog-handler.txt', \Bitrix\Main\Application::getInstance()->getContext()->getServer()->getHttpHost() ) ); } if (self::$beforeProduct !== null) { self::$beforeProduct = null; } } }
Папка /.logs/ должна существовать и доступна для записи пользователю, под который запущен php.
Например я им отлавливал странную активацию товара в каталоге. Клиент утверждал, что количество у товара точно было 0 и он его не добавлял. Но при этом пользователи умудрялись его купить.