/
bitrix-dev
/
Starter-kit
Обзор
Документация
Войти
/
bitrix-dev
/
Starter-kit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
main
local/php_interface/classes/mwi/Helper/Iblock.php
230 строк
6 KB
Alexey Karizhenskiy
Первая сборка (из ранее используемого)
19 янв 2026, 21:00
19 янв 2026, 21:00
d843e36
Код
Авторство
О чём код?
<?php /** * 07.11.2024 * @author AlexeyS <karizhenskiy@bk.ru> */ namespace MWI\Helper; use Bitrix\Main\Data\Cache; use Bitrix\Main\DB\Exception; use Bitrix\Main\Loader; use Bitrix\Main\LoaderException; use Bitrix\Main\SystemException; use CIBlock; use CIBlockElement; class Iblock { const CACHE_TIME = 86400; const DEFAULT_LANGUAGE = 'ru'; /** @var array */ protected static $iblockData; /** * @return array * @throws Exception */ protected static function getIblockData($clean = false) { $cache = Cache::createInstance(); if ($clean) { static::$iblockData = null; $cache->cleanDir(); } if (null !== static::$iblockData) { return static::$iblockData; } if (!Loader::includeModule('iblock')) { throw new LoaderException('Ошибка загрузки модуля iblock'); } $data = []; if ($cache->initCache(self::CACHE_TIME, __METHOD__ . SITE_ID)) { $data = $cache->getVars(); } else if ($cache->startDataCache()) { try { $rsIblocks = CIBlock::GetList([], ['CHECK_PERMISSIONS' => 'N']); while ($iblock = $rsIblocks->Fetch()) { $data[$iblock['CODE']][$iblock['IBLOCK_TYPE_ID']] = $iblock; } $cache->endDataCache($data); } catch (Exception $e) { $cache->abortDataCache(); throw $e; } } return static::$iblockData = $data; } /** * @param string $code * @param string|null $type * * @return array|null */ public static function getIblock($code, $type = null, $exception = true) { $data = static::getIblockData(); $iblock = static::fetchIblock($data, $code, $type); if (!$iblock) { $data = static::getIblockData(true); $iblock = static::fetchIblock($data, $code, $type); if (!$iblock) { throw new SystemException(sprintf('Инфоблок %s (%s) не найден', $code, $type ?: '%s')); } } return $iblock; } public static function fetchIblock($data, $code, $type = null) { $iblock = null; if (isset($data[$code])) { if (null !== $type) { $iblock = isset($data[$code][$type]) ? $data[$code][$type] : null; } else { $iblock = current($data[$code]); } } return $iblock; } /** * Возвращает ID инфоблока по его коду * * @param string $code * @param string|null $type * * @return int|null */ public static function getIblockId($code, $type = null) { $iblock = static::getIblock($code, $type); return $iblock ? $iblock['ID'] : null; } /** * @param array|bool|CDBResult|CIBlockResult $items * @param bool $includeAllProps Включить в выборку все поля и свойства (в этом случае можно не указывать выбираемые поля) * * @return array */ public static function fetchAll($items) { $data = []; while ($item = $items->GetNext()) { $data[] = $item; } return $data; } /** * Включить в выборку все поля и свойства (в этом случае можно не указывать выбираемые поля) * * @param array|bool|CDBResult|CIBlockResult $items * * @return array */ public static function populateAll($items) { $data = []; /** @var \_CIBElement $item */ while ($item = $items->GetNextElement()) { $data[] = $item->GetFields() + ['PROPERTIES' => $item->GetProperties()]; } return $data; } /** * @param array $sections * @param int $parentId * @param bool $normalized * * @return array */ public static function buildSectionsTree($sections, $parentId = 0, $normalized = false) { if ($normalized === false) { $sectionsMap = []; foreach ($sections as $section) { $sectionsMap[$section['IBLOCK_SECTION_ID'] ?: 0][] = $section; } } else { $sectionsMap = $sections; } if (!isset($sectionsMap[$parentId])) { return []; } $result = []; foreach ($sectionsMap[$parentId] as $section) { if ($children = static::buildSectionsTree($sectionsMap, $section['ID'], true)) { $section['SECTIONS'] = $children; } $result[] = $section; } return $result; } public static function getLocaleIblockId($code, $type = null) { foreach (self::getLanguageVariants($code, $type) as $variant) { if ($iblock = self::getIblock($variant['code'], $variant['type'], false)) { return $iblock['ID']; } } throw new SystemException(sprintf('Инфоблок %s (%s) не найден', $code, $type ?: '%s')); } protected static function getLanguageVariants($code, $type = null) { $original = ['code' => $code, 'type' => $type]; if (!defined('LANGUAGE_ID')) { return [$original]; } $result = []; $languageCode = $code . (LANGUAGE_ID != self::DEFAULT_LANGUAGE ? '_' . LANGUAGE_ID : ''); if ($languageCode != $code) { $result[] = ['code' => $languageCode, 'type' => $type]; } if ($type) { $languageType = $type . (LANGUAGE_ID != self::DEFAULT_LANGUAGE ? '_' . LANGUAGE_ID : ''); if ($languageType != $type) { $result[] = ['code' => $code, 'type' => $languageType]; } } $result[] = $original; return $result; } }