Работа с элементами инфоблоков в Bitrix на D7

  • Роман Цуканов
    Разработчик
  • Дата публикации
    14.02.2024
  • Категория
    1С-Битрикс
Задача:Использовать методы ядра D7 Bitirix при работе с элементами инфоблоков

Итак. В 20й версии битрикс появилась возможность использовать методы нового ядра. Данная статья объединяет в себе наиболее распространенные и востребованные конструкции кода. необходимые при разработке и поддержке сайта на битрикс.

Для начала стоит сказать, что у инфоблока, с которым предстоит работать, обязательно должно быть заполнено поле Символьный код API, так как для работы с элементами инфоблока будет использоваться класс вида \Bitrix\Iblock\Elements\Element[Символьный код API]Table. А также перед написанием запросов необходимо подключить модуль iblock:

\Bitrix\Main\Loader::includeModule('iblock');

Переходим к частным случаям.

Получение элемента с пользовательским свойством COLOR по его ID, аналог CIBlockElement::GetByID

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, [
    'select' => ['ID', 'NAME', 'DETAIL_TEXT', 'DETAIL_PICTURE', 'COLOR_' => 'COLOR'],
])->fetch();
$elementName = $element['NAME'];
$colorValue = $element['COLOR_VALUE'];

Получение объекта элемента с пользовательским свойством COLOR по его ID

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, array(
    'select' => array('ID', 'NAME', 'DETAIL_PICTURE', 'COLOR')
))->fetchObject();

$elementId = $element->getId();
$elementName = $element->getName();
$elementDetailPictureId = $element->getDetailPicture();
$elementPropertyColorValue = $element->getColor()->getValue();

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

Код свойства TEST_TEST_2. Название метода getTestTest_2().
Код свойства TEST_TEST2. Название метода getTestTest2().
Код свойства TEST_2_TEST. Название метода getTest_2Test().
Код свойства TEST2_TEST. Название метода getTest2Test().
Код свойства TEST2TEST. Название метода getTest2test().

Получение элемента с пользовательским свойством по параметрам фильтра, аналог CIBlockElement::GetList

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'COLOR_' => 'COLOR'],
    'filter' => ['=ACTIVE' => 'Y', 'IBLOCK_SECTION_ID' => 2],
    'group'   => ['MODIFIED_BY'],
    'order'   => array('SORT' => 'DESC', 'DATE_ACTIVE_FROM' => 'ASC'),
    'limit'   => 10,
    'offset'  => 5
])->fetchAll();
foreach ($elements as $element) {
    
}

Получение объекта элемента (коллекции) по параметрам фильтра

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PICTURE'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();

foreach ($elements as $element) {
    $elementName = $element->getName();
}

Получение DETAIL_PAGE_URL элемента

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PAGE_URL' => 'IBLOCK.DETAIL_PAGE_URL'],
    'filter' => ['=ACTIVE' => 'Y', 'IBLOCK_SECTION_ID' => 2],
])->fetchAll();
foreach ($elements as $key => $element) {
    $arResult['ITEMS'][$key]['DETAIL_PAGE_URL'] = CIBlock::ReplaceDetailUrl($element['DETAIL_PAGE_URL'], $element, false, 'E');
}

Обратите внимание, что метод  CIBlock::ReplaceDetailUrl вторым параметром требует поля элемента/раздела, которые используются для формирования ссылки. Поэтому не забудьте добавить нужные вам поля в select. Или выбирайте все поля и DETAIL_PAGE_URL вот так:

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['*', 'DETAIL_PAGE_URL' => 'IBLOCK.DETAIL_PAGE_URL'],
    'filter' => ['=ACTIVE' => 'Y', 'IBLOCK_SECTION_ID ' => 2],
])->fetchAll();

Получение раздела элемента

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'IBLOCK_SECTION'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

$sectionName = $element->getIblockSection()->getName());

Получение разделов элемента

На тот случай, если элемент привязан к нескольким разделам.

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'SECTIONS'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

$sectionsIds = array();
foreach ($element->getSections()->getAll() as $section) {
    $sectionsIds[] = $section->getId();
}

Получение множественного свойства COLOR типа справочник

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PICTURE', 'COLOR'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();

$colors = array();
foreach ($elements as $element) {
    foreach ($element->getColor()->getAll() as $value) {
        $colors[] = $value->getValue();
    }
}

Получение множественного свойства MORE_PHOTO типа файл

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'MORE_PHOTO.FILE'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();

$fileUrl = $fileUrl2 = array();
foreach ($elements as $element) {
    foreach ($element->getMorePhoto()->getAll() as $value) {
        $fileUrl[] = CFile::GetPath($value->getFile()->getID());
        // OR
        $fileUrl2[] = '/upload/' . $value->getFile()->getSubdir().'/'.$value->getFile()->getFileName();
    }
}

Получение значение свойства NEWPRODUCT типа список

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    // 'select' => ['ID', 'NEWPRODUCT'], - для получения просто id выбранного значения
    'select' => ['ID', 'NEWPRODUCT.ITEM'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();
$propertyNewProductValueId = $element->getNewproduct()->getItem()->getId();
$propertyNewProductValueXmlId = $element->getNewproduct()->getItem()->getXmlId();
$propertyNewProductValue = $element->getNewproduct()->getItem()->getValue();

Получение значений множественного свойства привязки к элементу либо разделу

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    // 'select' => ['ID', 'RECOMMEND.SECTION'], - привязка к разделу
    'select' => ['ID', 'NAME', 'SIMILAR.ELEMENT'], // привязка к элементу
    'filter' => [
        'ID' => $leadId,
    ],
])->fetchObject();

// $similarElementId = $element->getSimilar()->getElement()->getId(); - если свойство не множественное


foreach ($element->getSimilar()->getAll() as $linkElement) {
    $similarElementId = $linkElement->getElement()->getId();
    $similarElementName = $linkElement->getElement()->getName();
}

// Для привязки в разделам:
// foreach ($element->getRecommend()->getAll() as $linkSection) {
//     $recommendSectionId = $linkSection->getSection()->getId();
//     $recommendSectionName = $linkSection->getSection()->getName();
// }

Кеширование результатов выборки

Новое ядро D7 позволяет кешировать данные полученные в результате запросов.

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        'ID' => $elementId,
    ],
    "cache" => ["ttl" => 3600],
])->fetchObject();

 

Еще нет коммментариев. Будь первым!

Оформить заказ в Devstages