Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/burlakastudio.realcommenter/lib/ |
Upload File : |
<?php /** * ����� "��������� ����������� D7" ��� ������� * �������� ���� �����: www.realcommenter.com * �������� ���� �����������: burlaka.studio * ����� � ����������: ������� ������� (AlexeyGfi) -> alexeygfi@gmail.com */ namespace Burlakastudio\Realcommenter; use Bitrix\Highloadblock\HighloadBlockLangTable; use Bitrix\Highloadblock\HighloadBlockTable; use Bitrix\Main\EventManager; use Bitrix\Main\Loader; use Bitrix\Main\Localization\Loc; use CUserTypeEntity; use Exception; require_once 'CheckerDb.php'; class CHECKER extends REALCOMMENTER_HL_GENERAL_PROVIDER { /** * ���������� ������������, * �� ������� �������� ��� �� ����� (���� ���� ������ - ����� ��� ID �� ������������� �����). * ...���� �� ������ � ������ * * ���������� �������������� ��������, ��������, ������ */ public static function checkState() { try { Broom::checkLeftFiles(); self::hlblockCheck(); } catch (Exception $e) { ErrorNotificator::sendError($e->getMessage()); return; } } protected static function hlblockCheck() { Loader::includeModule('highloadblock'); Loc::loadLanguageFile(__FILE__); $hlList = CheckerDb::getHlOptions(); /** * � ��� ��� ���, ������ ������ �� ID ������� ������������� * ...� ����� �� ID UF_-�����. * * � ��� ����������� ���� ����� ��, �� ���� ������. * ����� ��� �� ��������� � ������� �������� / ������� */ $dependencies = []; /** * ����� ���� �� ���: ������ ��� ������������, ����� � ������ - �������������� ��� * ������ ��� � ���������� ����� ����������� ������������, ������ ��� �������� ����������� ����� ��������� */ foreach ($hlList as $hlInfo) { $hlId = self::hlblockGetId($hlInfo['NAME']); if (!$hlId) { $hlId = self::hlblockAdd($hlInfo); } /** * �������������� ��������, * ������� ����� ������� � HL-����� �������� � ��� �������� ���. * ...� ������� ����� �� ID. * * ������ � � ����������� �������� ������������ ID-��� �������� ����� */ $dependencies[$hlInfo['NAME']] = [ 'ID' => $hlId ]; } foreach ($dependencies as $hlName => $dependencyInfo) { // �������������� �������� self::ufCheck($hlName, $dependencies); } } /** * @param string|array $hlName * * @param string $hlName * @return int * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ protected static function hlblockGetId(&$hlName = '') { if (!$hlName) { return 0; } if (is_array($hlName)) { $filter = $hlName; } elseif (is_numeric($hlName)) { $filter = ['ID' => $hlName]; } else { $filter = ['NAME' => $hlName]; } $hlInfo = HighloadBlockTable::getList( [ 'select' => ['*'], 'filter' => $filter, ] )->fetch(); return $hlInfo['ID']; } /** * @param array $hlInfo * * @return array|bool|int|null * @throws Exception */ protected static function hlblockAdd(&$hlInfo = []) { if (empty($hlInfo)) { return false; } $hlLang = null; if (!empty($hlInfo['LANG'])) { $hlLang = $hlInfo['LANG']; unset($hlInfo['LANG']); } $hl_result = HighloadBlockTable::add($hlInfo); $hlId = null; if (!$hl_result->isSuccess()) { throw new \RuntimeException(implode(', ', $hl_result->getErrorMessages())); } else { $hlId = $hl_result->getId(); self::hlblockLangEnityAdd($hlId, $hlLang); } return $hlId; } /** * @param $hlId * @param array $hlLang * * @return bool|int */ protected static function hlblockLangEnityAdd(&$hlId, &$hlLang = []) { $cnt = 0; if (!class_exists('Bitrix\Highloadblock\HighloadBlockLangTable')) { return $cnt; } foreach ($hlLang as $lid => $item) { if (!empty($item['NAME'])) { HighloadBlockLangTable::add([ 'ID' => $hlId, 'LID' => $lid, 'NAME' => $item['NAME'], ]); $cnt++; } } return !!$cnt; } protected static function ufCheck(&$hlName = null, &$dependencies = []) { if (!$hlName) { return; } $hlId = $dependencies[$hlName]['ID'] ?: self::hlblockGetId($hlName); if (!$hlId) { return; } foreach (CheckerDb::getHlUserfieldsOptions($hlName) as $ufOptions) { // ������� � ������ $targetHl = $ufOptions['SETTINGS']['HLBLOCK_ID'] ?? false; if (isset($ufOptions['SETTINGS']['HLFIELD_ID'])) { $targetField = is_string($ufOptions['SETTINGS']['HLFIELD_ID']) ? $ufOptions['SETTINGS']['HLFIELD_ID'] : $targetHl . '.ID'; } else { $targetField = false; } $ufInfo = self::ufGet($hlId, $ufOptions['FIELD_NAME']); if (empty($ufInfo)) { /** * ����� ��������� ����������� ����, * ��� �������� �������� �������� � ������� ������� ��� ������� ��� */ if ($targetHl && $dependencies[$targetHl]) { $ufOptions['SETTINGS']['HLBLOCK_ID'] = $dependencies[$targetHl]['ID']; } // ������� � ��� � ������ if ($targetField) { list($hlTargetName, $hlTargetField) = explode('.', $targetField); if ( $hlTargetName && $dependencies[$hlTargetName] && $hlTargetField && $dependencies[$hlTargetName]['FLDS'][$hlTargetField] ) { $ufOptions['SETTINGS']['HLFIELD_ID'] = $dependencies[$hlTargetName]['FLDS'][$hlTargetField]; } } try { $ufId = self::ufAdd($hlId, $ufOptions); } catch (Exception $e) { ErrorNotificator::sendError($e->getMessage()); } } else { // To dependency tree below $ufId = $ufInfo['ID']; $changesNeeded = []; // ������� � ������ if ( $targetHl && $dependencies[$targetHl] && (int)$ufInfo['SETTINGS']['HLBLOCK_ID'] !== (int)$dependencies[$targetHl]['ID'] ) { $changesNeeded['SETTINGS']['HLBLOCK_ID'] = $dependencies[$targetHl]['ID']; } // ������� � ��� � ������ /** * � � ��������� ����� ������� ��� - ��� �����, * ��� ��� �������� ��� � ���������� � ID * * ...�� ��� �������� ��� ����� ������ �������� */ if ($targetField) { list($hlTargetName, $hlTargetField) = explode('.', $targetField); /** * � ��� ������� � ID ��� ������� ��������� � ��� ���. * ...� � ��� ID ������� �� �������� (������ ��� ID �� ����� �������������� ���������) * * ����� ������������� �������� * if ($dependencies[$hlTargetName]['FLDS'][$hlTargetField]) * ...�������� ����, �������� ������ ��� �� ��������� * � ��� ������ ����� ��������� */ if ( $hlTargetName && $dependencies[$hlTargetName] && $hlTargetField /*&& $dependencies[$hlTargetName]['FLDS'][$hlTargetField]*/ ) { if ( (int)$ufInfo['SETTINGS']['HLFIELD_ID'] !== (int)$dependencies[$hlTargetName]['FLDS'][$hlTargetField] ) { $changesNeeded['SETTINGS']['HLFIELD_ID'] = (int)$dependencies[$hlTargetName]['FLDS'][$hlTargetField]; } } } if (!empty($changesNeeded)) { try { self::ufUpdate($ufId, $changesNeeded); } catch (Exception $e) { ErrorNotificator::sendError($e->getMessage()); } } } if ($ufId) { $dependencies[$hlName]['FLDS'][$ufOptions['FIELD_NAME']] = $ufId; } } } /** * @param int $hlId * @param string $ufName * * @return array|bool */ protected static function ufGet(&$hlId = 0, &$ufName = '') { if (!$hlId || !$ufName) { return false; } $filter = [ 'ENTITY_ID' => 'HLBLOCK_' . $hlId, 'FIELD_NAME' => $ufName ]; $ufRes = CUserTypeEntity::GetList([], $filter); if ($ufArr = $ufRes->Fetch()) { return $ufArr; } return false; } /** * @param int $hlId * @param array $ufInfo * * @return int * @throws Exception */ protected static function ufAdd(&$hlId = 0, &$ufInfo = []) { $default = CheckerDb::getDefaults(); $fields = array_replace_recursive($default, $ufInfo); $fields['ENTITY_ID'] = 'HLBLOCK_' . $hlId; $fields['FIELD_NAME'] = $ufInfo['FIELD_NAME']; // In ORM it will be serialized array, but here is string if ($fields['USER_TYPE_ID'] === 'array') { $fields['USER_TYPE_ID'] = 'string'; } $enumAfterAdd = false; if (isset($fields['ENUM_VALUES'])) { $enumAfterAdd = $fields['ENUM_VALUES']; unset($fields['ENUM_VALUES']); } $obUserField = new CUserTypeEntity; $userFieldId = $obUserField->Add($fields); $enumsCreated = true; if ($userFieldId && $fields['USER_TYPE_ID'] === 'enumeration') { $enumsCreated = self::setUserTypeEntityEnumValues($userFieldId, $enumAfterAdd); } if ($userFieldId && $enumsCreated) { return $userFieldId; } $errorMsg = 'UF field creation error'; global $APPLICATION; if ($APPLICATION->GetException()) { $errorMsg = $APPLICATION->GetException()->GetString(); } throw new \RuntimeException($errorMsg); } /** * ������� ������ ������� �� ��������������� ��� * @param $fieldId * @param $newenums * @return bool */ public static function setUserTypeEntityEnumValues($fieldId, $newenums) { $newenums = is_array($newenums) ? $newenums : []; $oldenums = self::getEnumValues($fieldId); $index = 0; $updates = []; foreach ($oldenums as $oldenum) { $newenum = self::searchEnum($oldenum, $newenums); if ($newenum) { $updates[$oldenum['ID']] = $newenum; } else { $oldenum['DEL'] = 'Y'; $updates[$oldenum['ID']] = $oldenum; } } foreach ($newenums as $newenum) { $oldenum = self::searchEnum($newenum, $oldenums); if ($oldenum) { $updates[$oldenum['ID']] = $newenum; } else { $updates['n' . $index++] = $newenum; } } $obEnum = new \CUserFieldEnum(); return $obEnum->SetEnumValues($fieldId, $updates); } /** * @param $fieldId * @return array */ protected static function getEnumValues($fieldId) { $obEnum = new \CUserFieldEnum; $dbres = $obEnum->GetList([], ['USER_FIELD_ID' => $fieldId]); $res = []; while ($item = $dbres->Fetch()) { $res[] = $item; } return $res; } /** * @param $enum * @param array $haystack * @return bool|mixed */ protected static function searchEnum($enum, $haystack = []) { foreach ($haystack as $item) { if (!empty($item['XML_ID']) && $item['XML_ID'] === $enum['XML_ID']) { return $item; } } return false; } protected static function ufUpdate($ufId = 0, &$fields = []) { if (!$ufId || empty($fields)) { return false; } $obUserField = new CUserTypeEntity; if ($obUserField->Update($ufId, $fields)) { return true; } $errorMsg = 'UF field update error'; global $APPLICATION; if ($APPLICATION->GetException()) { $errorMsg = $APPLICATION->GetException()->GetString(); } throw new \RuntimeException($errorMsg); } public static function checkHlEvents() { /** * ����� ������������� (������� ��������� �� �������): * - �������������� ������� � ����� * RealcommenterSanctionsOnAfterUpdate * == ������� �� ������ (���� ��) * * - �������������� ���� * - �������������� ������������ * == ������� �� ������ */ $eventManager = EventManager::getInstance(); /** * ����� � �������� �������� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnBeforeCommentAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\COMMENTS_RATING", 'check_comment_rate' ); /** * �������� ����������� � ����� ����������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\NOTIFICATOR", 'OnAfterCommentAdd' ); /** * ������ ��������� ������������ ����� ��������� ������ */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\COUNTER", 'OnRecalculateReferenceEvent' ); /** * ������ ����� tape_* �������� �� html-���� ������ */ $eventManager->registerEventHandler( 'main', 'OnEndBufferContent', // ! �� �� onEpilog ! TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\TOOLS", 'tape_variables_from_html_parser' ); /** * �������� ���������� � ���, ��� �������� �����-�� ���� */ $eventManager->registerEventHandler( 'main', 'main.file.input.upload', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\NOTIFICATOR", 'uploaded_file' ); /** * ������ ��������� ������������ ����� �������� ���������� ����� �� ����� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentChangeActivity', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\COUNTER", 'OnRecalculateReferenceEvent' ); /** * ����������� ������ � ���, ��� � ��������� ��� ���������� ���-�� �������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentChangeActivity', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\NOTIFICATOR", 'OnAfterCommentChangeActivity' ); /** * ������ ��������� ������������ ����� ��������� ����� �� ����� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentUpdate', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\COUNTER", 'OnRecalculateReferenceEvent' ); /** * ������ ��������� ������������ ����� ������� ����� �� ����� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentDelete', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\COUNTER", 'OnRecalculateReferenceEvent' ); /** * ������ ��� ��� ���������� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnCommentEvented' ); /** * ������ ��� ��� ��������� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentUpdate', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnCommentEvented' ); /** * ������ ��� ��� ��������� ���������� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentChangeActivity', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnCommentEvented' ); /** * ������ ��� ��� �������� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterCommentDelete', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnCommentEvented' ); /** * ������ ��� ���� ��� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterUrlUpdate', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnUrlEvented' ); /** * ������ ��� ���������� ��� ���������� */ $eventManager->registerEventHandler( 'main', 'OnAfterUserAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnUserEvented' ); /** * ������ ��� ���������� ��� �������������� */ $eventManager->registerEventHandler( 'main', 'OnAfterUserUpdate', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnUserEvented' ); /** * ������ ��� ���������� ��� �������� */ $eventManager->registerEventHandler( 'main', 'OnUserDelete', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnUserEvented' ); /** * ������ ��� ����������: ����������, �� ����� ����������� �� ��� ��������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterVoteAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnVoteByUserEvented' ); /** * ������ ��� ������������ ��� ����������� ���������� */ $eventManager->registerEventHandler( TOOLS::getModuleName(), 'OnAfterVoteAdd', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\CACHE", 'realcommenter_OnCommentEvented' ); /** * ������ ��� ������ � ������� (��������� cache � datamanager) */ $eventManager->registerEventHandler( '', '\RealcommenterSanctions::OnAfterUpdate', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\Sanctions", 'OnAfterUpdate' ); /** * ������ ��� ������������ ��� �������������� ���������� */ $eventManager->registerEventHandler( '', '\RealcommenterComment::OnUpdate', TOOLS::getModuleName(), "\Burlakastudio\Realcommenter\COMMENTS", 'OnAfterUpdate' ); } /** * �� ������� (� ����� ���������� ������), * ������ �� ������� ��� � ���� ������ ���������� * * @return bool * @throws Exception */ public static function checkTalkGroupMinimalDeploy() { $talkGroups = TalkGroups::getList( [ 'filter' => ['!UF_NAME' => false], 'limit' => 1 ] ); if (!empty($talkGroups)) { return true; } $talkRow = TalkGroups::getFreeRow(); if (empty($talkRow) || !$talkRow['ID']) { throw new \RuntimeException('TALK GROUP DEPLOY ERROR'); } $talkRow['UF_NAME'] = Loc::getMessage('ITAPE_TALK_GROUP_DEPLOY_NAME'); $talkRow['UF_ACTIVE'] = true; $talkRow['UF_PAUSE'] = false; $updateResult = TalkGroups::update($talkRow['ID'], $talkRow); if ($updateResult && !$updateResult->isSuccess()) { throw new \RuntimeException(implode(', ', $updateResult->getErrorMessages())); } return true; } protected static function ufGetId(&$hlId = 0, &$ufName = '') { $ufArr = self::ufGet($hlId, $ufName); if (!empty($ufArr)) { return $ufArr['ID']; } return false; } }