Битрикс. Работа с инфоблоками на API

Несколько примеров, которые позволят выбрать и обработать содержимое инфоблока. Применяться они могут как в шаблонах, так и непосредственно на страницах.

Получение родительской секции по ID элемента

$itemElement = CIBlockElement::GetByID(12)->Fetch();
echo 'Название элемента: ' . $itemElement['NAME'] . '<br>';
$itemSection = CIBlockSection::GetByID($itemElement["IBLOCK_SECTION_ID"])->Fetch(
echo 'Название родительской секции: ' . $itemSection['NAME'];

Пример получения свойства элемента:

$arIBlockElement = GetIBlockElement(12);
$tovar_stav = $arIBlockElement['PROPERTIES']['MINIMUM_WEIGHT']['VALUE'];

Выборка элементов раздела с ID 101 инфоблока с ID 12:

$itemsElement = GetIBlockElementList(12, 101, Array("SORT"=>"DESC"));
while($arItem = $itemsElement->GetNext()) { 
    echo $arItem["NAME"]."<br>";
}

Изменение элемента инфоблока

Изменение названия и детального описания у элемента с ID 12.

$element = new CIBlockElement;
$res = $element->Update(12, array(
    "NAME" => "Хлеб с колбасой",
    "DETAIL_TEXT" => '<p>Текст <b>детального</b> описания</p>', 
    "DETAIL_TEXT_TYPE" => 'html', 
    "TIMESTAMP_X" => FALSE
));

Выборка разделов инфоблока

Получаем все разделы и подразделы инфоблока c ID 12:

$itemsSection = GetIBlockSectionList(12);
while($arItem = $itemsSection->GetNext()) { 
    echo $arItem["NAME"]."<br>"; 
}

Выбираем подразделы из раздела c ID 55 инфоблока с ID 11:

$itemsSection = GetIBlockSectionList(11, 55, Array("SORT"=>"DESC"));
while($arItem = $itemsSection->GetNext()) { 
    echo $arItem["NAME"]."<br>";
}

Выборка из инфоблока (ID=12) 20 активных разделов/подразделов:

$arFilter = array("ACTIVE" => "Y","GLOBAL_ACTIVE"=>"Y");
$arSort = array("SORT"=>"DESC");
$itemsSection = GetIBlockSectionList(12, false, $arSort, 20, $arFilter);
while($arItemSection = $itemsSection->GetNext()) {
    echo $arItemSection["NAME"]."<br>";
} 

Пример аналогичен предыдущему, за исключением добавления новых параметров. Они являются не обязательными, но Bitrix разработчики знать их должны.

  • 12 — идентификатор инфоблока.
  • false — указывает что выбираем все разделы/подразделы. Вместо этого параметра можно указать ID любого раздела, чтобы выбирать уже его подразделы.
  • $arSort — массив с параметрами сортировки результатов. Подробности смотрите в официальной документации.
  • 20 — ограничение по выборке, по-умолчанию — 0.
  • $arFilter — массив с условиями выборки. В нашем случае в него записано два условия:
    1. ACTIVE — раздел/подраздел должен быть активным;
    2. GLOBAL_ACTIVE — вся цепочка родительских разделов так же должна быть активна.

Перебор и обработка активных элементов

Код перебора всех разделов каталога с обработкой названия у активных карточек товаров. Обработка заключается в подмене «Машина» на «Авто». Комментарии в коде.

$countEditElements = 0;
$arrayIdElem = array();

// Вынимаем все активные секции инфоблока 12 (max = 6000)
$itemsSection = GetIBlockSectionList(12, false, array("SORT"=>"DESC"), 6000, array("ACTIVE" => "Y","GLOBAL_ACTIVE"=>"Y"));
while($arItemSection = $itemsSection->GetNext()) { 

  // Выбираем все элементы текущей секции
  $itemsElement = GetIBlockElementList(12, $arItemSection["ID"]);

  while($arItem = $itemsElement->GetNext()) { 
    
    // Если элемент уже был в другом разделе, то пропускаем
    if (in_array($arItem["ID"], $arrayIdElem)) { continue; }
    else $arrayIdElem[] = $arItem["ID"];

    $currentName = $arItem["NAME"];
    $newName = preg_replace('|^Машина (.+)$|i', 'Авто $1', $currentName);
    if ($currentName != $newName) {
      $element = new CIBlockElement;
      $res = $element->Update($arItem[ID], array("NAME" => $newName, 'TIMESTAMP_X' => FALSE));
      $countEditElements++;      
    }
  }
}

echo 'Было изменено элементов: ' . $countEditElements;

При необходимости изменения дополнительных свойств элементов, используйте следующую функцию:

$element = new CIBlockElement;

$arProperty = Array(
    "CATALOG_AVAILABLE" => 2,
);

$res = $element->SetPropertyValuesEx($arItem[ID], false , $arProperty);

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

Поля, которые носят префикс UF_ (user field). Для получения их значений предыдущие способы не подходят, так как результирующий набор их не может содержать.

Следует использовать методы CIBlockSection::GetList для разделов и CIBlockElement::GetList для элементов.

Пример получения пользовательского поля «UF_H1» раздела (ID 50), инфоблока с ID 10:

$arFilter = array(
    "IBLOCK_ID" => 10,
    "ID" => $arCurSection['ID'], 
    "ACTIVE" => "Y",
    "GLOBAL_ACTIVE"=>"Y", 
    "CODE" => 50
);

$arSort = array("SORT"=>"DESC");

$itemsSection = CIBlockSection::GetList(
    $arSort,
    $arFilter,
    false,
    $arSelect = array("UF_H1")
);

$UF_H1 = '';

while($arItemSection = $itemsSection->GetNext()) {
    $UF_H1 = $arItemSection["UF_H1"];
} 

Количество просмотров: 141


Понравилась статья?

Возврат к списку