Назад

Битрикс API — разные типы свойств

Главная
Блог
Битрикс API — разные типы свойств

В системе управления контентом Битрикс каждый элемент инфоблока может иметь набор свойств разных типов. Правильная работа с этими свойствами через API — важный навык для разработчика. В этой статье мы рассмотрим, как получать значения свойств с учётом их типа и особенностей хранения.

Основной метод получения свойств

Для получения свойств элемента используется метод CIBlockElement::GetProperty(). Базовый синтаксис:

$res = CIBlockElement::GetProperty(
    $iblockId,    // ID инфоблока
    $elementId,   // ID элемента
    $order,       // сортировка
    $sort,        // направление сортировки
    $filter       // дополнительные фильтры
);

Обработка разных типов свойств

1. Строковые свойства (S)

Самый простой тип — строковые свойства. Обрабатываем их первыми:

if ($ob['PROPERTY_TYPE'] == 'S' && $ob['VALUE']) {
    $propVal = htmlspecialcharsbx($ob['VALUE']);
}

2. HTML-свойства (HTML)

Для свойств с HTML-контентом нужна особая обработка:

if ($ob['USER_TYPE'] == 'HTML' && $ob['VALUE']['TEXT']) {
    $propVal = $ob['VALUE']['TEXT'];
    // Для безопасности можно добавить очистку HTML
    $propVal = Bitrix\Main\Text\HtmlFilter::encode($propVal);
}

3. Файловые свойства (F)

Работа с файлами требует использования API файлов:

if ($ob['PROPERTY_TYPE'] == 'F' && $ob['VALUE']) {
    if ($ob['MULTIPLE'] == 'Y') {
        $propVal = array();
        foreach ($ob['VALUE'] as $fileId) {
            $propVal[] = CFile::GetPath($fileId);
        }
    } else {
        $propVal = CFile::GetPath($ob['VALUE']);
    }
}

4. Свойства-списки (L)

Для свойств типа "список" используем значение из VALUE_ENUM:

if ($ob['PROPERTY_TYPE'] == 'L' && $ob['VALUE_ENUM']) {
    $propVal = $ob['VALUE_ENUM'];
}

5. Числовые свойства (N)

Числовые свойства требуют приведения типа:

if ($ob['PROPERTY_TYPE'] == 'N' && $ob['VALUE']) {
    $propVal = (float)$ob['VALUE'];
}

6. Свойства-даты (S:DateTime)

Для работы с датами используем ConvertDateTime:

if ($ob['PROPERTY_TYPE'] == 'S' && $ob['USER_TYPE'] == 'DateTime') {
    $propVal = $ob['VALUE'] ? ConvertDateTime($ob['VALUE'], FORMAT_DATETIME) : '';
}

7. Привязки к элементам (E) и разделам (G)

Для сложных свойств-привязок:

// Привязка к элементам
if ($ob['PROPERTY_TYPE'] == 'E' && $ob['VALUE']) {
    if ($ob['MULTIPLE'] == 'Y') {
        $propVal = array();
        foreach ($ob['VALUE'] as $elementId) {
            $res = CIBlockElement::GetByID($elementId);
            if ($element = $res->GetNext()) {
                $propVal[] = $element['NAME'];
            }
        }
    } else {
        $res = CIBlockElement::GetByID($ob['VALUE']);
        if ($element = $res->GetNext()) {
            $propVal = $element['NAME'];
        }
    }
}

// Привязка к разделам
if ($ob['PROPERTY_TYPE'] == 'G' && $ob['VALUE']) {
    // аналогичная обработка, но с CIBlockSection::GetByID
}

Полный пример функции

Вот универсальная функция для получения значений свойств:

function getElementProperties($iblockId, $elementId, $propertyCodes = array()) {
    $result = array();
    
    $filter = array();
    if (!empty($propertyCodes)) {
        $filter['CODE'] = $propertyCodes;
    }
    
    $res = CIBlockElement::GetProperty($iblockId, $elementId, "sort", "asc", $filter);
    while ($ob = $res->GetNext()) {
        $propVal = null;
        
        // Обработка по типам свойств (код из примеров выше)
        // ...
        
        if ($propVal !== null) {
            $result[$ob['CODE']] = $propVal;
        }
    }
    
    return $result;
}

Безопасность и производительность

  1. Проверка прав доступа:

if (!CIBlockElementRights::UserHasRightTo($iblockId, $elementId, "read")) {
    throw new Exception("Доступ запрещен");
}

  1. Кеширование:

$cache = Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(3600, "element_props_{$elementId}")) {
    $result = $cache->getVars();
} elseif ($cache->startDataCache()) {
    $result = getElementProperties($iblockId, $elementId);
    $cache->endDataCache($result);
}

Современный подход (D7 API)

Для новых проектов лучше использовать API D7:

use Bitrix\Iblock\Elements\ElementTable;

$element = ElementTable::getByPrimary($elementId, [
    'select' => ['ID', 'NAME', 'PROPERTIES'],
    'filter' => ['IBLOCK_ID' => $iblockId]
])->fetch();

Заключение

Правильная обработка свойств элементов — важная часть разработки на Битрикс. Используйте типобезопасные подходы, учитывайте особенности каждого типа свойства и не забывайте о безопасности и производительности. Представленные в статье примеры помогут вам создать надежную систему работы со свойствами элементов.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи