예제 #1
0
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;
}
예제 #2
0
/**
 * Расширенная версия 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;
}