Получить элемент инфоблока по символьному коду с свойствами
Безопасное получение элемента инфоблока по символьному коду через CIBlockElement::GetList с выборкой свойств и кешированием результата.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Получение элемента инфоблока по символьному коду с выборкой свойств и кешированием. Используйте в компонентах и шаблонах для быстрого доступа к данным элемента без лишних запросов к БД.
use Bitrix\Main\Loader;
use Bitrix\Main\Application;
/**
* Получить элемент по символьному коду с свойствами
* @param int $iblockId ID инфоблока
* @param string $code Символьный код элемента
* @param array $selectFields Поля для выборки (по умолчанию: ID, NAME, CODE, PREVIEW_TEXT)
* @param array $propertyCodes Коды свойств для выборки
* @return array|false Массив данных элемента или false
*/
function getElementByCode($iblockId, $code, $selectFields = [], $propertyCodes = []) {
if (!Loader::includeModule('iblock')) {
return false;
}
$cache = Application::getInstance()->getCache();
$cacheId = 'element_code_' . $iblockId . '_' . md5($code);
$cacheDir = '/iblock/element_by_code/';
$cacheTtl = 3600; // 1 час
if ($cache->initCache($cacheTtl, $cacheId, $cacheDir)) {
$result = $cache->getVars();
} elseif ($cache->startDataCache()) {
$defaultSelect = ['ID', 'NAME', 'CODE', 'PREVIEW_TEXT', 'DETAIL_TEXT', 'ACTIVE'];
$select = !empty($selectFields) ? $selectFields : $defaultSelect;
// Добавляем свойства в выборку
if (!empty($propertyCodes)) {
$select[] = 'PROPERTY_' . implode(', PROPERTY_', $propertyCodes);
}
$res = CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => $iblockId,
'CODE' => $code,
'ACTIVE' => 'Y'
],
false,
['nTopCount' => 1],
$select
);
$element = $res->GetNextElement();
if (!$element) {
$cache->abortDataCache();
return false;
}
$result = $element->GetFields();
// Получаем свойства
if (!empty($propertyCodes)) {
$props = $element->GetProperties();
foreach ($propertyCodes as $propCode) {
if (isset($props[$propCode])) {
$result['PROPERTIES'][$propCode] = $props[$propCode];
}
}
}
$cache->endDataCache($result);
} else {
$result = false;
}
return $result;
}
Usage:
// В component.php или шаблоне
$element = getElementByCode(5, 'main-page-banner', ['ID', 'NAME', 'PREVIEW_PICTURE'], ['LINK', 'BUTTON_TEXT']);
if ($element) {
echo $element['NAME'];
echo $element['PROPERTIES']['LINK']['VALUE'];
}
Notes:
⚠️ Кеш очищается автоматически при изменении элемента через CIBlockElement::Update(). Для динамических данных используйте меньший TTL или отключите кеш. Символьный код должен быть уникальным в рамках инфоблока.