Как получить ID раздела в 1С-Битрикс
Во время разработки на 1С-Битрикс довольно часто возникает необходимость получить ID раздела инфоблока. Сделать это можно несколькими способами: по символьному коду, через элемент инфоблока, из параметров компонента или с помощью D7 API.
В этой статье рассмотрим самые распространенные варианты с готовыми примерами кода.
Получить ID раздела по символьному коду
Это один из самых популярных способов. Он подойдет, если известен символьный код (CODE) раздела.
<?
if (CModule::IncludeModule("iblock"))
{
$iblockId = 10;
$sectionCode = "section_code";
$arFilter = [
"IBLOCK_ID" => $iblockId,
"=CODE" => $sectionCode
];
$rsSection = CIBlockSection::GetList(
[],
$arFilter,
false,
["ID"]
);
if ($arSection = $rsSection->GetNext())
{
echo $arSection["ID"];
}
else
{
echo "Раздел не найден";
}
}
?>
Такой вариант удобен, если вы знаете символьный код раздела и хотите получить его идентификатор для дальнейшей работы.
Получить ID раздела из элемента инфоблока
Если известен ID элемента, получить раздел еще проще. Практически каждый элемент хранит идентификатор своего основного раздела.
<?
if (CModule::IncludeModule("iblock"))
{
$elementId = 123;
$arSelect = [
"ID",
"IBLOCK_SECTION_ID"
];
$arFilter = [
"ID" => $elementId
];
$res = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);
if ($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
echo $arFields["IBLOCK_SECTION_ID"];
}
}
?>
Получить ID раздела на странице раздела
Если используется стандартный компонент catalog.section или news, то дополнительный запрос к базе данных обычно вообще не нужен.
В большинстве случаев ID текущего раздела уже находится в массиве $arResult.
<?
echo $arResult["ID"];
?>
Это самый быстрый способ, так как не выполняет дополнительных SQL-запросов.
Получить ID раздела на детальной странице элемента
На детальной странице товара или новости чаще всего требуется узнать раздел, к которому относится текущий элемент.
Стандартный компонент уже предоставляет эту информацию.
<?
echo $arResult["IBLOCK_SECTION_ID"];
?>
Во многих случаях этого вполне достаточно и выполнять повторный запрос через API нет никакого смысла.
Получить ID раздела через D7 API
В новых проектах вместо старого API все чаще используется D7. Получить раздел можно следующим образом.
<?
use Bitrix\Iblock\SectionTable;
$section = SectionTable::getList([
"filter" => [
"=IBLOCK_ID" => 10,
"=CODE" => "section_code"
],
"select" => [
"ID"
]
])->fetch();
if ($section)
{
echo $section["ID"];
}
?>
D7 API считается более современным подходом и рекомендуется для новых проектов.
Какой способ выбрать?
Если кратко, то рекомендую использовать следующие варианты:
-
Известен символьный код раздела
ИспользуйтеCIBlockSection::GetList(). Это самый простой и универсальный вариант. -
Вы находитесь на странице раздела
Обычно ID уже доступен в$arResult["ID"], поэтому дополнительный запрос к базе данных не требуется. -
Вы находитесь на детальной странице элемента
В большинстве компонентов ID раздела уже хранится в$arResult["IBLOCK_SECTION_ID"]. -
Известен ID элемента инфоблока
Получите полеIBLOCK_SECTION_IDчерезCIBlockElement::GetList(). -
Разрабатываете новый проект
Лучше использовать D7 API и классBitrix\Iblock\SectionTable.
Заключение
Во многих случаях разработчики делают лишний запрос к базе данных, хотя нужный ID уже находится в массиве $arResult. Поэтому перед использованием API рекомендую сначала проверить, какие данные уже передает используемый компонент. Это позволит немного снизить количество SQL-запросов и сделать код чище.
Комментарии
Будем рады вашему мнению и вопросам по статье.