Работа с элементами инфоблоков в Битрикс D7
Подключаем модуль iblock:
\Bitrix\Main\Loader::includeModule('iblock');
Для доступа к возможностям нового ядра у инфоблока нужно задать Символьный код API. По документации это строка от 1 до 50 символов, начинающаяся с буквы и состоящая из латинских букв и цифр.
В настройках ИБ указываем "Символьный код API"
Для работы с элементами используется класс \Bitrix\Iblock\Elements\ElementXXXXXTable, где XXXXX - Символьный код API. Для инфоблока на примере выше это будет класс
\Bitrix\Iblock\Elements\ElementCatalogTable
Получить название класса для инфоблока можно следующим методом:
var_dump(\Bitrix\Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass());
// string(43) "\Bitrix\Iblock\Elements\ElementCatalogTable"
Работа с элементом как с массивом
Аналог CIBlockElement::GetByID:
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, [
'select' => ['ID', 'NAME', 'DETAIL_TEXT', 'DETAIL_PICTURE', 'ARTNUMBER_' => 'ARTNUMBER'],
])->fetch();
var_dump($element);
// Используем алиасы для нормального отображения 'ARTNUMBER_' => 'ARTNUMBER'
Аналогом CIBlockElement::GetList будет getList из D7:
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
'select' => ['ID', 'NAME', 'ARTNUMBER_' => 'ARTNUMBER'],
'filter' => ['=ACTIVE' => 'Y'],
])->fetchAll();
foreach ($elements as $element) {
}
Работа с элементом как с объектом
Есть возможность работать с элементами инфоблока как с объектами. Для этого используем методы fetchObject для получения объекта (один элемент) и fetchCollection для получения коллекции объектов.
Пример для одного элемента:
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, array(
'select' => array('ID', 'NAME', 'DETAIL_PICTURE')
))->fetchObject();
var_dump($element->get("ID"));
var_dump($element->get("NAME"));
var_dump($element->get("DETAIL_PICTURE"));
Пример для нескольких элементов:
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
'select' => ['ID', 'NAME', 'DETAIL_PICTURE'],
'filter' => [
'ID' => $elementId,
],
])->fetchCollection();
foreach ($elements as $element) {
var_dump($element->getName());
}
Разделы элементов
Элементы могут быть привязаны к нескольким разделам, но GetList-ом можно было получить только один основной раздел инфоблока.
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
'select' => ['ID', 'IBLOCK_SECTION'],
'filter' => [
'ID' => $elementId,
],
])->fetchObject();
var_dump ($element->getIblockSection()->getName());
Для получения всех разделов элемента используем поле SECTIONS, так у нас появляется возможность получения коллекции разделов. Получить значения коллекции можно с помощью метода getAll():
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
'select' => ['ID', 'SECTIONS'],
'filter' => [
'ID' => $elementId,
],
])->fetchObject();
foreach ($element->getSections()->getAll() as $section) {
var_dump($section->getId());
var_dump($section->getCode());
var_dump($section->getName());
}
Свойства элементов
У свойств есть VALUE и DESCRIPTION, которые можно получить методами getValue и getDescription соответственно. Для некоторых типов добавляются дополнительные поля для доступа к дополнительной информации (ITEM - значение свойства типа список, ELEMENT - привязанный элемент, SECTION - привязанный раздел, FILE - файл).
$elementsRes = \Bitrix\Iblock\Elements\ElementConfigurationsTable::getList([
'filter' => [
'ID' => $elementId,
],
'select' => [
'ID',
'IBLOCK_ID',
'NAME',
'IBLOCK_SECTION_ID',
'CREATED_BY',
'IBLOCK',
'DATE_CREATE',
'TYPE.ITEM', // свойство тип Список
'CUSTOMER.ELEMENT',// привязка к элементу
'PLATFORM.ELEMENT',// множественное свойство (привязка)
'ADVANTAGES.FILE', // множественное свойство тип Файл
'USER_INFO', // данные пользователя
],
'count_total' => true,
'runtime' => [
'USER_INFO' => [
'data_type' => \Bitrix\Main\UserTable::class,
'reference' => [
'=this.CREATED_BY' => 'ref.ID',
],
],
],
]);
$count = $elementsRes->getCount();//получаем количество записей
$elements = $elementsRes->fetchCollection();
$elArr = [];
foreach ($elements as $element) {
$el = [
'ID' => $element->get('ID'),
'NAME' => $element->get('NAME'),
'DATE_CREATE' => $element->get('DATE_CREATE'),
'CODE' => $element->get('CODE'),
'IBLOCK_ID' => $element->get('IBLOCK_ID'),
'PREVIEW_PICTURE' => $element->get('PREVIEW_PICTURE'),
'IBLOCK_SECTION_ID' => $element->get('IBLOCK_SECTION_ID'),
];
// DETAIL_PAGE_URL
$el['DETAIL_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
$element->get('IBLOCK')->get('DETAIL_PAGE_URL'),
$el,
false,
'E'
);
// свойство TYPE (список)
if ($type = $element->get('TYPE')) {
if ($typeVal = $type->getItem()) {
$el['PROPERTIES']['TYPE'][$typeVal->getId()] = [
'VALUE' => $typeVal->getValue(),
'XML_ID' => $typeVal->getXmlId(),
];
}
}
// свойство CUSTOMER (привязка к элементу)
if ($cus = $element->get('CUSTOMER')) {
if ($cusEl = $cus->getElement()) {
$el['PROPERTIES']['CUSTOMER'] = $cusEl->get('NAME');
}
}
// свойство PLATFORM (множественная привязка)
if ($platformsOb = $element->get('PLATFORM')) {
foreach ($platformsOb->getAll() as $value) {
if ($plEl = $value->getElement()) {
$el['PROPERTIES']['PLATFORM'][] = $plEl->get('NAME');
}
}
}
// свойство ADVANTAGES (множественные файлы)
if ($advOb = $element->get('ADVANTAGES')) {
foreach ($advOb->getAll() as $value) {
$el['PROPERTIES']['ADVANTAGES'][] = [
'DESCRIPTION' => $value->getFile()->getDescription(),
'PATH' => '/upload/'
. $value->getFile()->getSubdir()
. '/'
. $value->getFile()->getFileName(),
];
}
}
// USER_INFO (пользователь)
if ($crBy = $element->get('USER_INFO')) {
if (($usName = $crBy->get('NAME'))
&& ($usLastName = $crBy->get('LAST_NAME'))) {
$el['PROPERTIES']['USER_INFO'] = $usLastName . ' ' . $usName;
}
}
$elArr[] = $el;
}
Кеширование
Кеширование результатов выборок ORM D7:
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
'select' => ['ID', 'NAME'],
'filter' => [
'ID' => $elementId,
],
"cache" => ["ttl" => 3600],
])->fetchObject();