Несколько примеров, которые позволят выбрать и обработать содержимое инфоблока. Применяться они могут как в шаблонах, так и непосредственно на страницах.
Получение родительской секции по 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 — массив с условиями выборки. В нашем случае в него записано два условия:
- ACTIVE — раздел/подраздел должен быть активным;
- 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"];
}
?>
Количество просмотров: 485