Рассмотрим как получить ID свойства тип список, зная его значение.
Как получить ID элемента инфоблока зная его имя в Битриксе?
Для начала рассмотрим простой пример – нам необходимо узнать ID элемента (или раздела) зная его имя, символьный код или другой параметр:
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); if (CModule::IncludeModule("iblock")): $IBLOCK_ID = 1; $res = CIBlockElement::GetList ( Array("ID" => "ASC"), Array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y", "NAME" => $name), false, false, Array('ID', 'NAME', 'DETAIL_PAGE_URL') ); if ($arItem = $res->GetNext()) { print_r($arItem); } endif;
$arItem[‘ID’] – и будет ID нашего элемента инфоблока. Сделаем тоже самое для раздела, только теперь будем искать ID раздела по символьному коду:
$res = CIBlockSection::GetList ( Array("ID" => "ASC"), Array("IBLOCK_ID" => 14, "ACTIVE" => "Y", "CODE" => $code), false, Array('ID', 'NAME', 'SECTION_PAGE_URL', 'PICTURE') ); while ($arItem = $res->GetNext()) { print_r($arItem); }
$arItem[‘ID’] – теперь это ID секции.
Зачем я привёл вам эти примеры? Для того чтобы вы понимали, в свойствах всё хранится немного по другому.
Как узнать ID значения свойства, зная его имя в Битриксе?
Для этого нам понадобится метод CIBlockPropertyEnum::GetList. Структура данных у свойств выглядит следующим образом:
VALUE - по значению (по шаблону [%_]); ID - по коду значения варианта свойства; SORT - по индексу сортировки варианта свойства; DEF - по параметру "значение по умолчанию" (Y|N); XML_ID - по внешнему коду(по шаблону [%_]); EXTERNAL_ID - по внешнему коду; CODE - по символьному коду свойства (по шаблону [%_]); PROPERTY_ID - по числовому или символьному коду свойства; IBLOCK_ID - фильтр по коду информационного блока, которому принадлежит свойство;
Как будет выглядеть код, если нам нужно узнать имя свойства по его ID:
$property_enums = CIBlockPropertyEnum::GetList( Array("ID"=>"ASC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>34, "CODE"=>"PARTNER", "ID" => $_REQUEST['partner']) ); if ($enum_fields = $property_enums->GetNext()) { $partner = $enum_fields["VALUE"]; }
$enum_fields[“VALUE”] – это аналог имени в элементах и названиях разделов.
Обратная процедура просто меняет фильтр на:
Array("IBLOCK_ID"=>34, "CODE"=>"PARTNER", "VALUE" => $_REQUEST['partnerName'])
$enum_fields[“ID”] – и будет наше необходимое ID.
“IBLOCK_ID”=>34, “CODE”=>”PARTNER” – инфоблок и символьный код нашего свойства тип список соответственно.
Также не забывайте что зная ID есть более короткие записи таких методов:
CIBlockPropertyEnum::GetByID($propertyID); CIBlockElement::GetByID($elementID); CIBlockSection::GetByID($sectionID);
Их можно рекомендовать потому как они имеют более короткую запись:
$res = CIBlockElement::GetByID($_REQUEST['prize']); if ($ar_res = $res->GetNext()) { $prizeName = $ar_res['NAME']; }
Но данный метод возвращает много лишних полей, поэтому всегда помните про 2 вещи:
1. этот метод не рекомендую выполнять в цикле, сильно увеличится количество запросов к базе, лучше написать правильный GetList. Однажды, я искал в своем коде ошибку, страница грузилась более 5 секунд, и оказалось, что причина была в этом 🙂
2. По сути это очень похоже на гет лист, только вы не ограничиваете возвращаемые поля
Добрый день.
В Вашем примере:
$property_enums = CIBlockPropertyEnum::GetList(
Array(“ID”=>”ASC”, “SORT”=>”ASC”),
Array(“IBLOCK_ID”=>34, “CODE”=>”PARTNER”, “ID” => $_REQUEST[‘partner’])
);
if ($enum_fields = $property_enums->GetNext()) {
$partner = $enum_fields[“VALUE”];
}
Как сформировать список только из тех свойств, которые выделены?