'Y']); while ($arSite = $rsSites->Fetch()) { $arSites[] = $arSite; } foreach ($arComponentsNames as $componentName) { foreach ($arSites as $arSite) { CBitrixComponent::clearComponentCache($componentName, $arSite['ID']); } } } } } if (!function_exists('ClearAllSitesCacheDirs')) { function ClearAllSitesCacheDirs($arDirs) { if ($arDirs && is_array($arDirs)) { foreach ($arDirs as $dir) { $obCache = new CPHPCache(); $obCache->CleanDir('', $dir); } } } } if (!function_exists('GetIBlocks')) { function GetIBlocks() { $arRes = []; $dbRes = CIBlock::GetList([], ['ACTIVE' => 'Y']); while ($item = $dbRes->Fetch()) { $dbIBlockSites = CIBlock::GetSite($item['ID']); while ($arIBlockSite = $dbIBlockSites->Fetch()) { $arRes[$arIBlockSite['SITE_ID']][$item['IBLOCK_TYPE_ID']][$item['CODE']][] = $item['ID']; } } return $arRes; } } if (!function_exists('GetSites')) { function GetSites() { $arRes = []; $dbRes = CSite::GetList($by = 'sort', $order = 'desc', ['ACTIVE' => 'Y']); while ($item = $dbRes->Fetch()) { $arRes[$item['LID']] = $item; } return $arRes; } } if (!function_exists('GetCurVersion')) { function GetCurVersion($versionFile) { $ver = false; if (file_exists($versionFile)) { $arModuleVersion = []; include $versionFile; $ver = trim($arModuleVersion['VERSION']); } return $ver; } } if (!function_exists('CreateBakFile')) { function CreateBakFile($file, $curVersion = CURRENT_VERSION) { $file = trim($file); if (file_exists($file)) { $arPath = pathinfo($file); $backFile = $arPath['dirname'].'/_'.$arPath['basename'].'.back'.$curVersion; if (!file_exists($backFile)) { @copy($file, $backFile); } } } } if (!function_exists('RemoveFileFromModuleWizard')) { function RemoveFileFromModuleWizard($file) { @unlink($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.MODULE_NAME.'/install/wizards/'.PARTNER_NAME.'/'.MODULE_NAME_SHORT.$file); @unlink($_SERVER['DOCUMENT_ROOT'].'/bitrix/wizards/'.PARTNER_NAME.'/'.MODULE_NAME_SHORT.$file); } } if (!function_exists('RemoveFileFromTemplate')) { function RemoveFileFromTemplate($file, $bModule = true) { @unlink($_SERVER['DOCUMENT_ROOT'].TEMPLATE_PATH.$file); if ($bModule) { RemoveFileFromModuleWizard('/site/templates/'.TEMPLATE_NAME.$file); } } } if (!function_exists('SearchFilesInPublicRecursive')) { function SearchFilesInPublicRecursive($dir, $pattern, $flags = 0) { $arDirExclude = ['bitrix', 'upload']; $pattern = str_replace('//', '/', str_replace('//', '/', $dir.'/').$pattern); $files = glob($pattern, $flags); foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) { if (!in_array(basename($dir), $arDirExclude)) { $files = array_merge($files, SearchFilesInPublicRecursive($dir, basename($pattern), $flags)); } } return $files; } } if (!function_exists('RemoveOldBakFiles')) { function RemoveOldBakFiles() { $arDirs = $arFiles = []; foreach ( $arExclude = [ 'bitrix', 'local', 'upload', 'webp-copy', 'cgi', 'cgi-bin', ] as $dir) { $arDirExclude[] = $_SERVER['DOCUMENT_ROOT'].'/'.$dir; } // public if ($arSites = GetSites()) { foreach ($arSites as $siteID => $arSite) { $arSite['DIR'] = str_replace('//', '/', '/'.$arSite['DIR']); if (!strlen($arSite['DOC_ROOT'])) { $arSite['DOC_ROOT'] = $_SERVER['DOCUMENT_ROOT']; } $arSite['DOC_ROOT'] = str_replace('//', '/', $arSite['DOC_ROOT'].'/'); $siteDir = str_replace('//', '/', $arSite['DOC_ROOT'].$arSite['DIR']); if ($arPublicDirs = glob($siteDir.'*', GLOB_ONLYDIR | GLOB_NOSORT)) { foreach ($arPublicDirs as $dir) { foreach ($arExclude as $exclude) { if (strpos($dir, '/'.$exclude) !== false) { continue 2; } } $arDirs[] = str_replace('//', '/', $dir.'/'); } } } $i = 0; while ($arDirs && ++$i < 10000) { $dir = array_pop($arDirs); $arFiles = array_merge($arFiles, (array) glob($dir.'_*.back*', GLOB_NOSORT)); foreach ((array) glob($dir.'*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) { if ( strlen($dir) ) { foreach ($arExclude as $exclude) { if (strpos($dir, '/'.$exclude) !== false) { continue 2; } } $arDirs[] = str_replace('//', '/', $dir.'/'); } } } } $arDirs = []; // aspro components if (file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/components/')) { if ($arComponents = glob($_SERVER['DOCUMENT_ROOT'].'/bitrix/components/'.PARTNER_NAME.'*', 0)) { foreach ($arComponents as $componentPath) { $arDirs[] = str_replace('//', '/', $componentPath.'/'); } } } if (file_exists($_SERVER['DOCUMENT_ROOT'].'/local/components/')) { if ($arComponents = glob($_SERVER['DOCUMENT_ROOT'].'/local/components/'.PARTNER_NAME.'*', 0)) { foreach ($arComponents as $componentPath) { $arDirs[] = str_replace('//', '/', $componentPath.'/'); } } } // aspro and other templates if (file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/')) { if ($arTemplates = glob($_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/*', 0)) { foreach ($arTemplates as $templatePath) { $arDirs[] = str_replace('//', '/', $templatePath.'/'); } } } if (file_exists($_SERVER['DOCUMENT_ROOT'].'/local/templates/')) { if ($arTemplates = glob($_SERVER['DOCUMENT_ROOT'].'/local/templates/*', 0)) { foreach ($arTemplates as $templatePath) { $arDirs[] = str_replace('//', '/', $templatePath.'/'); } } } // aspro modules if (file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/')) { if ($arModules = glob($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.PARTNER_NAME.'*', 0)) { foreach ($arModules as $modulePath) { $arDirs[] = str_replace('//', '/', $modulePath.'/'); } } } if (file_exists($_SERVER['DOCUMENT_ROOT'].'/local/modules/')) { if ($arModules = glob($_SERVER['DOCUMENT_ROOT'].'/local/modules/'.PARTNER_NAME.'*', 0)) { foreach ($arModules as $modulePath) { $arDirs[] = str_replace('//', '/', $modulePath.'/'); } } } // aspro js if (file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/js/')) { if ($arJs = glob($_SERVER['DOCUMENT_ROOT'].'/bitrix/js/'.MODULE_NAME.'*', 0)) { foreach ($arJs as $jsPath) { $arDirs[] = str_replace('//', '/', $jsPath.'/'); } } } // aspro css if (file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/css/')) { if ($arCss = glob($_SERVER['DOCUMENT_ROOT'].'/bitrix/css/'.MODULE_NAME.'*', 0)) { foreach ($arCss as $cssPath) { $arDirs[] = str_replace('//', '/', $cssPath.'/'); } } } // aspro wizards if (file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/wizards/')) { if ($arWizards = glob($_SERVER['DOCUMENT_ROOT'].'/bitrix/wizards/'.PARTNER_NAME.'*', 0)) { foreach ($arWizards as $wizardPath) { $arDirs[] = str_replace('//', '/', $wizardPath.'/'); } } } if (file_exists($_SERVER['DOCUMENT_ROOT'].'/local/wizards/')) { if ($arWizards = glob($_SERVER['DOCUMENT_ROOT'].'/local/wizards/'.PARTNER_NAME.'*', 0)) { foreach ($arWizards as $wizardPath) { $arDirs[] = str_replace('//', '/', $wizardPath.'/'); } } } $i = 0; while ($arDirs && ++$i < 10000) { $popdir = array_pop($arDirs); $arFiles = array_merge($arFiles, (array) glob($popdir.'_*.back*', GLOB_NOSORT)); foreach ((array) glob($popdir.'{,.}*', GLOB_ONLYDIR | GLOB_NOSORT | GLOB_BRACE) as $dir) { if ( strlen($dir) && !in_array($dir, [$popdir.'.', $popdir.'..']) && !in_array($dir, $arDirExclude) && ( strpos($dir, PARTNER_NAME) !== false || strpos($dir, '/templates/') !== false ) ) { $arDirs[] = str_replace('//', '/', $dir.'/'); } } } if ($arFiles) { foreach ($arFiles as $file) { if (file_exists($file) && !is_dir($file)) { if (time() - filemtime($file) >= 1209600) { // 14 days @unlink($file); } } } } } } if (!function_exists('GetDBcharset')) { function GetDBcharset() { $sql = 'SHOW VARIABLES LIKE "character_set_database";'; if (method_exists('\Bitrix\Main\Application', 'getConnection')) { $db = Bitrix\Main\Application::getConnection(); $arResult = $db->query($sql)->fetch(); return $arResult['Value']; } elseif (defined('BX_USE_MYSQLI') && BX_USE_MYSQLI == true) { if ($result = @mysqli_query($sql)) { $arResult = mysql_fetch_row($result); return $arResult[1]; } } elseif ($result = @mysql_query($sql)) { $arResult = mysql_fetch_row($result); return $arResult[1]; } return false; } } if (!function_exists('GetMes')) { function GetMes($str) { if (method_exists('\Bitrix\Main\Text\Encoding', 'convertEncodingToCurrent')) { return \Bitrix\Main\Text\Encoding::convertEncodingToCurrent($str); } static $isUTF8; if ($isUTF8 === null) { if (method_exists('\Bitrix\Main\Application', 'isUtfMode')) { $isUTF8 = \Bitrix\Main\Application::isUtfMode(); } else { $isUTF8 = stripos(GetDBcharset(), 'utf8') !== false; } } return $isUTF8 ? iconv('CP1251', 'UTF-8', $str) : $str; } } if (!function_exists('UpdaterLog')) { function UpdaterLog($str) { static $fLOG; if ($bFirst = !$fLOG) { $fLOG = $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/'.MODULE_NAME.'/updaterlog.txt'; } if (is_array($str)) { $str = print_r($str, 1); } @file_put_contents($fLOG, ($bFirst ? PHP_EOL : '').date('d.m.Y H:i:s', time()).' '.$str.PHP_EOL, FILE_APPEND); } } if (!function_exists('InitComposite')) { function InitComposite($arSites) { if (class_exists('CHTMLPagesCache')) { if (method_exists('CHTMLPagesCache', 'GetOptions')) { if ($arHTMLCacheOptions = CHTMLPagesCache::GetOptions()) { if ($arHTMLCacheOptions['COMPOSITE'] !== 'Y') { $arDomains = []; if ($arSites) { foreach ($arSites as $arSite) { if (strlen($serverName = trim($arSite['SERVER_NAME'], " \t\n\r"))) { $arDomains[$serverName] = $serverName; } if (strlen($arSite['DOMAINS'])) { foreach (explode("\n", $arSite['DOMAINS']) as $domain) { if (strlen($domain = trim($domain, " \t\n\r"))) { $arDomains[$domain] = $domain; } } } } } if (!$arDomains) { $arDomains[$_SERVER['SERVER_NAME']] = $_SERVER['SERVER_NAME']; } if (!$arHTMLCacheOptions['GROUPS']) { $arHTMLCacheOptions['GROUPS'] = []; } $rsGroups = CGroup::GetList($by = 'id', $order = 'asc', []); while ($arGroup = $rsGroups->Fetch()) { if ($arGroup['ID'] > 2) { if (in_array($arGroup['STRING_ID'], ['RATING_VOTE_AUTHORITY', 'RATING_VOTE']) && !in_array($arGroup['ID'], $arHTMLCacheOptions['GROUPS'])) { $arHTMLCacheOptions['GROUPS'][] = $arGroup['ID']; } } } $arHTMLCacheOptions['COMPOSITE'] = 'Y'; $arHTMLCacheOptions['DOMAINS'] = array_merge((array) $arHTMLCacheOptions['DOMAINS'], (array) $arDomains); CHTMLPagesCache::SetEnabled(true); CHTMLPagesCache::SetOptions($arHTMLCacheOptions); bx_accelerator_reset(); } } } } } } if (!function_exists('GetCompositeOptions')) { function GetCompositeOptions() { if (class_exists('CHTMLPagesCache')) { if (method_exists('CHTMLPagesCache', 'GetOptions')) { return CHTMLPagesCache::GetOptions(); } } return []; } } if (!function_exists('IsCompositeEnabled')) { function IsCompositeEnabled() { if (class_exists('CHTMLPagesCache')) { if ($arHTMLCacheOptions = GetCompositeOptions()) { if (method_exists('CHTMLPagesCache', 'isOn')) { if (CHTMLPagesCache::isOn()) { if (isset($arHTMLCacheOptions['AUTO_COMPOSITE']) && $arHTMLCacheOptions['AUTO_COMPOSITE'] === 'Y') { return 'AUTO_COMPOSITE'; } else { return 'COMPOSITE'; } } } else { if ($arHTMLCacheOptions['COMPOSITE'] === 'Y') { return 'COMPOSITE'; } } } } return false; } } if (!function_exists('EnableComposite')) { function EnableComposite($auto = false, $arHTMLCacheOptions = []) { if (class_exists('CHTMLPagesCache')) { if (method_exists('CHTMLPagesCache', 'GetOptions')) { $arHTMLCacheOptions = is_array($arHTMLCacheOptions) ? $arHTMLCacheOptions : []; $arHTMLCacheOptions = array_merge(CHTMLPagesCache::GetOptions(), $arHTMLCacheOptions); $arHTMLCacheOptions['COMPOSITE'] = $arHTMLCacheOptions['COMPOSITE'] ?? 'Y'; $arHTMLCacheOptions['AUTO_UPDATE'] = $arHTMLCacheOptions['AUTO_UPDATE'] ?? 'Y'; // standart mode $arHTMLCacheOptions['AUTO_UPDATE_TTL'] = $arHTMLCacheOptions['AUTO_UPDATE_TTL'] ?? '0'; // no ttl delay $arHTMLCacheOptions['AUTO_COMPOSITE'] = ($auto ? 'Y' : 'N'); // auto composite mode CHTMLPagesCache::SetEnabled(true); CHTMLPagesCache::SetOptions($arHTMLCacheOptions); bx_accelerator_reset(); } } } } if (!function_exists('AddNewProps')) { function AddNewProps($arPropertiesIBlocks = [], $lang = 'ru') { if (!count($arPropertiesIBlocks)) { return; } foreach ($arPropertiesIBlocks as $IBlockID => $arProperties) { $arUserOptionsForm = CUserOptions::GetOption('form', 'form_element_'.$IBlockID, []); $strOptionTab = ''; foreach ($arProperties as $key => $property) { if ($property['PROPS_DELIMETER']) { $strOptionTab .= ',--editAspro_csection_'.$property['ID'].'--#--'.$property['LANG'][$lang].'--'; } else { $dbProperty = CIBlockProperty::GetList([], ['IBLOCK_ID' => $IBlockID, 'CODE' => $property['CODE']]); if (!$dbProperty->SelectedRowsCount()) { $arFields = [ 'NAME' => $property['LANG'][$lang], 'ACTIVE' => $property['ACTIVE'], 'SORT' => $property['SORT'], 'CODE' => $property['CODE'], 'PROPERTY_TYPE' => $property['PROPERTY_TYPE'], 'LIST_TYPE' => $property['LIST_TYPE'], 'MULTIPLE' => $property['MULTIPLE'], 'IBLOCK_ID' => $IBlockID, ]; if ($property['PROPERTY_TYPE'] === 'E' && $property['LINK_IBLOCK_ID']) { $arFields['LINK_IBLOCK_ID'] = $property['LINK_IBLOCK_ID']; } $ibp = new CIBlockProperty(); $propID = $ibp->Add($arFields); if ($propID) { $strOptionTab .= ',--PROPERTY_'.$propID.'--#--'.$property['LANG'][$lang].'--'; } } else { $propID = $dbProperty->Fetch()['ID']; } if ( $propID && $property['ENUMS'] ) { $arEnumValue = []; $ibpenum = new CIBlockPropertyEnum(); $propertyEnums = CIBlockPropertyEnum::GetList([], ['IBLOCK_ID' => $IBlockID, 'CODE' => $property['CODE']]); if ($propertyEnums->SelectedRowsCount()) { while ($enumFields = $propertyEnums->GetNext()) { $arEnumValue[] = $enumFields['VALUE']; } foreach ($property['ENUMS'][$lang] as $enumsValue) { if (!in_array($enumsValue, $arEnumValue)) { $ibpenum->Add([ 'PROPERTY_ID' => $propID, 'VALUE' => $enumsValue, ]); } } } else { foreach ($property['ENUMS'][$lang] as $enumsValue) { $ibpenum->Add([ 'PROPERTY_ID' => $propID, 'VALUE' => $enumsValue, ]); } } } } } if ($strOptionTab && isset($arUserOptionsForm['tabs'])) { $matches = []; $subject = '/(--Aspro--.*?);/s'; preg_match($subject, $arUserOptionsForm['tabs'], $matches); if ($matches[0]) { $patternNewProperty = $matches[1].$strOptionTab; $arUserOptionsForm['tabs'] = str_replace($matches[1], $patternNewProperty, $arUserOptionsForm['tabs']); } else { $matches = []; preg_match_all('/\bedit(\d)\b/', $arUserOptionsForm['tabs'], $matches, false); sort($matches[1]); $editNumber = array_pop($matches[1]); $addPropForm = 'edit'.($editNumber + 1).'--#--Aspro--'.$strOptionTab.';--'; $arUserOptionsForm['tabs'] .= $addPropForm; } $arUserOptionsForm = CUserOptions::SetOption('form', 'form_element_'.$IBlockID, $arUserOptionsForm); } } } } if (!function_exists('UpdateVendorSolutionClasses')) { function UpdateVendorSolutionClasses() { if ( defined('MODULE_NAME') && defined('MODULE_NAME_SHORT') && defined('PARTNER_NAME') ) { $arTemplates = $arMobileTemplates = $arCopy = []; foreach ( [ $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/', $_SERVER['DOCUMENT_ROOT'].'/local/templates/', ] as $path ) { if (is_dir($path)) { if ($arDirs = glob($path.'{.,}*', GLOB_ONLYDIR | GLOB_BRACE)) { $arExclude = [ $path.'.', $path.'..', ]; foreach ($arDirs as $dir) { if (!in_array($dir, $arExclude)) { $fileCheck = $dir.'/vendor/php/solution.php'; if (file_exists($fileCheck)) { $content = file_get_contents($fileCheck); if (strpos($content, MODULE_NAME) !== false) { if (strpos($content, 'ExtensionsMobile') === false) { $arTemplates[] = $fileCheck; } else { $arMobileTemplates[] = $fileCheck; } } } } } } } } if ($arTemplates) { if (defined('TEMPLATE_NAME')) { $fileSolution = __DIR__.'/install/wizards/'.PARTNER_NAME.'/'.MODULE_NAME_SHORT.'/site/templates/'.TEMPLATE_NAME.'/vendor/php/solution.php'; if (file_exists($fileSolution)) { $arCopy[$fileSolution] = $arTemplates; } } } if ($arMobileTemplates) { if (defined('TEMPLATE_MOBILE_NAME')) { $fileSolutionMobile = __DIR__.'/install/wizards/'.PARTNER_NAME.'/'.MODULE_NAME_SHORT.'/site/templates/'.TEMPLATE_MOBILE_NAME.'/vendor/php/solution.php'; if (file_exists($fileSolutionMobile)) { $arCopy[$fileSolutionMobile] = $arMobileTemplates; } } } foreach ($arCopy as $fileFrom => $arFileTo) { if (file_exists($fileFrom)) { foreach ($arFileTo as $fileTo) { if ($fileFrom != $fileTo) { if (file_exists($fileTo)) { CreateBakFile($fileTo); } @copy($fileFrom, $fileTo); UpdaterLog('Update '.$fileTo); } } } } } } }