function _getPropertiesEx($arParams) { $arFilter = array(); $arProperties = array(); $arPropListIds = array(); if (notEmpty($arParams["type"])) { $arFilter["PROPERTY_TYPE"] = $arParams["type"]; } if (notEmpty($arParams["iblock_id"])) { $arFilter["IBLOCK_ID"] = iblock($arParams["iblock_id"]); } $resProperties = \CIBlockProperty::GetList(array(), $arFilter); while ($arProperty = $resProperties->Fetch()) { $arProperties[$arProperty["CODE"]] = $arProperty; if ($arProperty["PROPERTY_TYPE"] == "L") { $arPropListIds[] = $arProperty["ID"]; } } // В фильтр CIBlockPropertyEnum::GetList() нельзя передать // PROPERTY_ID в виде массива ID, поэтому перебираем // каждое свойство в цикле foreach ($arPropListIds as $propListId) { $resPropValues = \CIBlockPropertyEnum::GetList(array('SORT' => 'ASC', 'VALUE' => 'ASC'), array('PROPERTY_ID' => $propListId)); while ($arPropValue = $resPropValues->Fetch()) { $arProperties[$arPropValue["PROPERTY_CODE"]]["VALUES"][$arPropValue["XML_ID"]] = $arPropValue["ID"]; } } return $arProperties; }
/** * Расширенная версия getList(), принимающая один массив параметров * * Возможные параметры $arOptions: * - *iblock_id* - ID или символьный код инфоблока * - *filter* - Параметры фильтра * - *sort* - Параметры сортировки * - *select* - Поля для выборки * - *get_sections* - *true*, если нужно выбрать секции, а не элементы * - *id_key* - *true*, если ключи результирующего массива * должны принять значения ID элемента:<br> * <code>array(ID1 => array(...), ID2 => array(...))</code><br> * Если параметр равен *false*, массив будет неассоциативным:<br> * <code>array(array(...), array(...))</code> * - *is_sub_query* - Если *true*, результат выборки будет оформлен для фильтрации в другом _getListEx() * - *nav* — Параметры для постраничной навигации, формируются, как в стандартном GetList() * https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php * * @example _getlistex.php Выбор всех компаний, у которых есть офис в Ярославле * @param array $arOptions Параметры выборки * @return array Массив с результатами выборки */ function _getListEx($arOptions) { $iblockId = iblock($arOptions['iblock_id']); if ($iblockId === false) { return false; } $arFilter = $arOptions['filter'] ?: array(); $arSort = $arOptions['sort'] ?: array(); $arSelect = $arOptions['select'] ?: array(); $sec = $arOptions['get_sections'] ?: false; $idKey = $arOptions['id_key'] ?: false; $isSubQuery = $arOptions['is_sub_query'] ?: false; $arNavParams = $arOptions['nav'] ?: false; $arFilter = array_merge(array('IBLOCK_ID' => $iblockId), $arFilter); if ($sec === false) { $resElements = CIBlockElement::GetList($arSort, $arFilter, false, $arNavParams, $arSelect); } else { $resElements = CIBlockSection::GetList($arSort, $arFilter, false, $arSelect, $arNavParams); } if (empty($arSelect)) { while ($obElement = $resElements->GetNextElement()) { $arElement = $obElement->GetFields(); $arElement['PROPERTIES'] = $obElement->GetProperties(); if ($idKey === true) { $arElements[$arElement['ID']] = $arElement; } else { $arElements[] = $arElement; } } } else { while ($arElement = $resElements->Fetch()) { if ($isSubQuery) { $arElements[] = array_shift($arElement); } else { if (isset($arElement['ID']) && $idKey === true) { $arElements[$arElement['ID']] = $arElement; } else { $arElements[] = $arElement; } } } } if (empty($arElements)) { return false; } return $arElements; }