Довольно часто бывает нужна функция, которая возвращает ID элемента (или раздела) инфоблока по его символьному коду.
В основном это бывает нужно для организации ЧПУ: у нас есть символьный код, но нету ID элемента (раздела) для того, чтобы мы могли с ним работать, используя API-функции или же просто вызвать компонент (все компоненты для работы с инфоблоками принимают как правило обязательный параметр - ID).
Вот простейшая реализация этой функции:
function getIdByCode($code, $iblock_id, $type)
{
if(CModule::IncludeModule("iblock"))
{
if($type == 'IBLOCK_ELEMENT')
{
$arFilter = array("IBLOCK_ID"=>$iblock_id, "CODE" => $code);
$res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize"=>1), array('ID'));
$element = $res->Fetch();
if($res->SelectedRowsCount() != 1) return '<p style="font-weight:bold;color:#ff0000">Элемент не найден</p>';
else return $element['ID'];
}
else if($type == 'IBLOCK_SECTION')
{
$res = CIBlockSection::GetList(array(), array('IBLOCK_ID' => $iblock_id, 'CODE' => $code));
$section = $res->Fetch();
if($res->SelectedRowsCount() != 1) return '<p style="font-weight:bold;color:#ff0000">Раздел не найден</p>';
else return $section['ID'];
}
else
{
echo '<p style="font-weight:bold;color:#ff0000">Укажите тип</p>';
return;
}
}
}
Функция принимает три параметра: символьный код элемента или раздела, ID инфоблока и тип (IBLOCK_SECTION или IBLOCK_ELEMENT). Функция очень простая, и довольно легко можно дописать её и под свои нужны (например, получать и символьный код самого инфоблока), или же реализовать как методы классов CIblockSection и CIblockElement.



Комментарии (2)
1. Обработка ошибки имхо не очень удачная. Вы возвращаете NULL и выдаёт сообщение на поток. Имхо, лучше бросать исключение или возвращать явно -1 к примеру.
Потому что у вас сейчас получается, что при отсутствии символьного кода возврашается строка, которая может быть подставлена в фильтр или ещё куда и ошибку будет труднее отловить.