В системе управления контентом Битрикс каждый элемент инфоблока может иметь набор свойств разных типов. Правильная работа с этими свойствами через 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;
}Безопасность и производительность
-
Проверка прав доступа:
if (!CIBlockElementRights::UserHasRightTo($iblockId, $elementId, "read")) {
throw new Exception("Доступ запрещен");
}-
Кеширование:
$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();Заключение
Правильная обработка свойств элементов — важная часть разработки на Битрикс. Используйте типобезопасные подходы, учитывайте особенности каждого типа свойства и не забывайте о безопасности и производительности. Представленные в статье примеры помогут вам создать надежную систему работы со свойствами элементов.