GetList
Описание
CIBlockResult CIBlockElement::GetList( array arOrder = Array("SORT"=>"ASC"), array arFilter = Array(), mixed arGroupBy = false, mixed arNavStartParams = false, array arSelectFields = Array() );
Возвращает список элементов по фильтру arFilter. Метод статический.
Важно! Начиная с версии 18.6.200 модуля Информационные блоки, в методе доступны новые возможности работы с товарами, изменены ключи метода. Читайте подробности в уроке Товары и CIBlockElement::GetList. Соответственно, все параметры вида CATALOG_***
устарели.
Внимание: Начиная с версии 20.5.0 модуля Информационные блоки в методе более не обрабатываются ключи CHECK_BP_TASKS_PERMISSIONS и TASKSTATUS.
Смотрите также
Параметры вызова
Параметр | Описание | С версии |
---|---|---|
arOrder | Массив вида Array(by1=>order1[, by2=>order2 [, ..]]), где by - поле для сортировки, может принимать значения:
Примечание 1: если задать разным свойствам одинаковый символьный код, но в разном регистре, то при работе сортировки по одному из свойств (например, PROPERTY_rating) будет возникать ошибочная ситуация (элементы в списке задублируются, сортировки не будет).
Примечание 2: указанные поля сортировки автоматически добавляются в arGroupBy (если он задан) и arSelectFields.
| |
arFilter | Массив вида array("фильтруемое поле"=>"значения фильтра" [, ...]). "фильтруемое поле" может принимать значения:
Необязательное. По умолчанию записи не фильтруются. Примечание 1: (по настройке фильтра для свойства типа "Дата/Время"): свойство типа Дата/Время хранится как строковое с датой в формате YYYY-MM-DD HH:MI:SS. Соответственно сортировка по значению такого свойства будет работать корректно, а вот значение для фильтрации формируется примерно так: $cat_filter[">"."PROPERTY_available"] = date("Y-m-d");
Примечание 2: при использовании типа проверки фильтра "><" для целых чисел, заканчивающихся нулем, необходимо использовать тип поля число или разделительный знак "," для десятичных значений (например, 20000,00). Иначе работает не корректно. | |
** arGroupBy | Массив полей для группировки элемента. Если поля указаны, то выборка по ним группируется (при этом параметр arSelectFields будет проигнорирован), а в результат добавляется поле CNT - количество сгруппированных элементов. Если указать в качестве arGroupBy пустой массив, то метод вернет количество элементов CNT по фильтру. Группировать можно по полям элемента, а также по значениям его свойств. Для этого в качестве одного из полей группировки необходимо указать PROPERTY_<PROPERTY_CODE>, где PROPERTY_CODE - ID или символьный код свойства.
Необязательное. По умолчанию false - записи не группируются. | 3.2.1 |
** arNavStartParams | Параметры для постраничной навигации и ограничения количества выводимых элементов. Массив вида "Название параметра"=>"Значение", где название параметра:
Если передать в параметр arNavStartParams пустой массив, то ставится ограничение на 10 выводимых элементов. | 3.2.1 |
arSelectFields | Массив возвращаемых полей элемента.
Обратите внимание! В параметре используются поля, но не массивы. Таким образом, попытка выборки по IBLOCK_SECTION (Массив идентификаторов групп, к которым относится элемент) приведет к нарушению работы метода.
В списке полей элемента можно сразу выводить значения его свойств. Обязательно должно быть использованы поля IBLOCK_ID и ID, иначе не будет работать корректно. Кроме того, также в качестве одного из полей необходимо указать PROPERTY_<PROPERTY_CODE>, где PROPERTY_CODE - ID или символьный код (задается в верхнем регистре, даже если в определении свойств инфоблока он указан в нижнем регистре). В результате будет выведены значения свойств элемента в виде полей PROPERTY_<PROPERTY_CODE>_VALUE - значение; PROPERTY_<PROPERTY_CODE>_ID - код значения у элемента; PROPERTY_<PROPERTY_CODE>_ENUM_ID - код значения (для свойств типа список). При установленном модуле торгового каталога можно выводить и цены элемента. Для этого в качестве одного из полей необходимо указать *CATALOG_GROUP_<PRICE_CODE>, где PRICE_CODE - ID типа цены. Также есть возможность выбрать поля элементов по значениям свойства типа "Привязка к элементам". Для этого необходимо указать PROPERTY_<PROPERTY_CODE>.<FIELD>, где PROPERTY_CODE - ID или символьный код свойства привязки, а FIELD - поле указанного в привязке элемента. См. ниже "Поля связанных элементов для сортировки". Можно выбрать и значения свойств элементов по значениям свойства типа "Привязка к элементам". Для этого необходимо указать PROPERTY_<PROPERTY_CODE>.PROPERTY_<PROPERTY_CODE2>, где PROPERTY_CODE - ID или символьный код свойства привязки, а PROPERTY_CODE2 - свойство указанного в привязке элемента. По умолчанию выводить все поля. Значения параметра игнорируются, если используется параметр группировки arGroupBy. Примечание 1: если в массиве используются свойство, являющееся множественным, то для элементов, где используются несколько значений этого свойства, будет возвращено несколько записей вместо одной. Для решения этой проблемы инфоблоки нужно перевести в Режим хранения свойств в отдельных таблицах, в этом случае для свойства будет отдаваться массив значений. Либо можно не указывать свойства в параметрах выборки, а получать их значения на каждом шаге перебора выборки с помощью _CIBElement::GetProperties().
Примечание 2: Если в массиве указаны поля DETAIL_PAGE_URL или LIST_PAGE_URL, то поля необходимые для правильной подстановки шаблонов URL'ов будут выбраны автоматически. Но только если не была задана группировка. Примечание 3: если необходимо выбрать данные о рейтингах для выбранных элементов, то для этого в массиве необходимо указать следующие поля: RATING_TOTAL_VALUE, RATING_TOTAL_VOTES, RATING_TOTAL_POSITIVE_VOTES, RATING_TOTAL_NEGATIVE_VOTES, RATING_USER_VOTE_VALUE.
| 3.2.1 |
* - Параметры вида CATALOG_*** устарели в версии 18.6.200 модуля Информационные блоки. Подробнее: Товары и CIBlockElement::GetList | ||
** - В случае, если параметром arGroupBy передается пустой массив - данные параметра arNavStartParams - игнорируются. | ||
Частные случаи
Рассмотрим несколько частных случаев фильтрации:
- $arFilter = array("PROPERTY_CML2_SCAN_CODE") =>false - используется, чтобы выбрать все элементы с незаполненными свойствами;
- $arFilter = array("PROPERTY_CML2_SCAN_CODE") =>"" - используется, чтобы выбрать все элементы;
- $arFilter = array("PROPERTY_CML2_SCAN_CODE") =>qwe - при фильтрации элементов проверяется точное совпадение с заданными свойствами;
- $arFilter = array("?PROPERTY_CML2_SCAN_CODE") =>we" - при фильтрации элементов проверяется наличие заданной подстроки свойствах.
- $arFilter = array("!PROPERTY_CML2_SCAN_CODE") =>false - используется, чтобы выбрать только элементы с заполненными свойствами;
- $arFilter = array("!PROPERTY_CML2_SCAN_CODE") =>qwe - при фильтрации элементов проверяется точное совпадение с заданными свойствами;
- $arFilter = array("!?PROPERTY_CML2_SCAN_CODE") =>we - при фильтрации элементов проверяется отсутствие заданной подстроки свойствах.
Фильтр со сложной логикой
Параметр arFilter может содержать вложенные фильтры. Ключом массива вложенного фильтра должно быть число. Например:- $arFilter = array("NAME" => "A%", array(..<здесь пары "поле" => "фильтр">...), "IBLOCK_ID" => $IBLOCK_ID);
Так же условия фильтра могут объединяться не только по условию "И", но и "ИЛИ". Для этого в качестве фильтруемого поля надо указать "LOGIC". Может принимать два значения: "AND" и "OR". По умолчанию - "AND". Например выберем маленькие зрелые и большие не зрелые апельсины:
$arFilter = array( "IBLOCK_ID" => $IBLOCK_ID, "SECTION_CODE" => "orange", "INCLUDE_SUBSECTIONS" => "Y", array( "LOGIC" => "OR", array("50, "=PROPERTY_CONDITION" => "Y"), array(">=PROPERTY_RADIUS" => 50, "!=PROPERTY_CONDITION" => "Y"), ), );
В этом примере фильтр по свойствам апельсинов является подфильтром инфоблока фруктов.
Поля связанных элементов
- ID - числовой идентификатор элемента;
- TIMESTAMP_X - время последней модификации в полном формате сайта;
- MODIFIED_BY - идентификатор пользователя вносившего последние правки;
- DATE_CREATE - время создания элемента в полном формате сайта
- CREATED_BY - идентификатор пользователя создавшего элемент;
- IBLOCK_ID - числовой идентификатор инфоблока элемента;
- ACTIVE - активность (Y|N);
- SORT - значение сортировки;
- NAME - имя элемента;
- PREVIEW_PICTURE - идентификатор изображения;
- PREVIEW_TEXT - текст анонса;
- PREVIEW_TEXT_TYPE - тип текста анонса (html|text);
- DETAIL_PICTURE - идентификатор изображения;
- DETAIL_TEXT - детальное описание;
- DETAIL_TEXT_TYPE - тип детального описания (html|text);
- SHOW_COUNTER - счетчик показов;
- SHOW_COUNTER_START - время первого показа элемента в полном формате сайта;
- CODE - символьный код элемента;
- TAGS - теги;
- XML_ID - внешний идентификатор;
- IBLOCK_SECTION_ID - минимальный идентификатор раздела элемента (если задан);
- IBLOCK_TYPE_ID - идентификатор типа инфоблока;
- IBLOCK_CODE - символьный код инфоблока;
- IBLOCK_NAME - название инфоблока;
- IBLOCK_EXTERNAL_ID - внешний код инфоблока;
- DETAIL_PAGE_URL - путь к элементу;
- LIST_PAGE_URL - путь к списку элементов;
Возвращаемое значение
Возвращается объект CIBlockResult.
Примеры использования
Пример 1:
<? $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM"); $arFilter = Array("IBLOCK_ID"=>IntVal($yvalue), "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y"); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>50), $arSelect); while($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); print_r($arFields); } ?>
Пример можно модернизировать, добавив вывод свойств для каждого элемента. Удобно использовать, не прибегая к GetProperty. В случае использования Инфоблоков 2.0 необходимо в $arSelect добавить IBLOCK_ID.
<? $arSelect = Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM","PROPERTY_*");//IBLOCK_ID и ID обязательно должны быть указаны, см. описание arSelectFields выше $arFilter = Array("IBLOCK_ID"=>IntVal($yvalue), "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y"); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>50), $arSelect); while($ob = $res->GetNextElement()){ $arFields = $ob->GetFields(); print_r($arFields); $arProps = $ob->GetProperties(); print_r($arProps); } ?>
Пример 2:
<? // выборка активных элементов из информационного блока $yvalue, // у которых установлено значение свойства с символьным кодом SRC // и дата начала автивности старше 1 января 2003 года // выбранные элементы будут сгруппированы по дате активности $arFilter = Array( "IBLOCK_ID"=>IntVal($yvalue), ">DATE_ACTIVE_FROM"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,1,1,2003)), "ACTIVE"=>"Y", "!PROPERTY_SRC"=>false ); $res = CIBlockElement::GetList(Array("SORT"=>"ASC", "PROPERTY_PRIORITY"=>"ASC"), $arFilter, Array("DATE_ACTIVE_FROM")); while($ar_fields = $res->GetNext()) { echo $ar_fields["DATE_ACTIVE_FROM"].": ".$ar_fields["CNT"]."<br>"; } ?>
Пример 3:
//вывод архива из просроченных элементов (news.list) $arFilter = array( "IBLOCK_ID" => $arResult["ID"], "IBLOCK_LID" => SITE_ID, "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y", //сильно грузит систему, но проверяет права "DateFormatToPHP(CLang::GetDateFormat("SHORT")), );
Пример 4:
//выборка элементов инфоблока, чтобы в возвращаемом результате находилось 5 случайных элементов $rs = CIBlockElement::GetList ( Array("RAND" => "ASC"), Array("IBLOCK_ID" => $IBLOCK_ID), false, Array ("nTopCount" => 5) );
Пример 5:
//для фильтрации по нескольким значениям множественного свойства, нужно использовать подзапросы. CModule::IncludeModule('iblock'); $rs = CIBlockElement::GetList( array(), array( "IBLOCK_ID" => 21, array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7405))), array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7410))), array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7417))) ), false, false, array("ID") ); while($ar = $rs->GetNext()) { echo '<pre>'; print_r($ar); echo '</pre>'; }
Пример 6:
//следующий и предыдущий товар с учетом сортировки в подробном просмотре $arrSortAlown = array('price'=> 'catalog_PRICE_1' , 'name'=> 'NAME', 'rating' => 'PROPERTY_RATING' , 'artnumber'=> 'PROPERTY_ARTNUMBER'); $_sort = isset($arrSortAlown[$_GET['sort']]) ? $arrSortAlown[$_GET['sort']] : 'NAME'; $_order = isset($_GET['order']) && $_GET['order']=='desc' ? 'DESC' : 'ASC'; $sort_url = 'sort=' .( isset($_GET['sort'])? $_GET['sort'] : 'name') .'&order='. (isset($_GET['order'])? $_GET['order'] : 'asc'); $res = CIBlockElement::GetList( array("$_sort" => $_order), Array( "IBLOCK_ID"=>$arResult["IBLOCK_ID"], "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y" , "IBLOCK_SECTION_ID" => $arResult["IBLOCK_SECTION_ID"] ), false, array("nPageSize" => "1","nElementID" => $arResult["ID"]), array_merge(Array("ID", "NAME","DETAIL_PAGE_URL"), array_values($arrSortAlown)) ); $navElement = array(); while($ob = $res->GetNext()){ $navElement[] = $ob; } //вывод: <noindex> <div class="navElement" style="float:right; clear:both;"> <span class="l"> <small><a href="<?=$navElement[0]['DETAIL_PAGE_URL']?>?<?=$sort_url?>">Предыдущий товар</a></small> </span> <span class="r"> <small><a href="<?=$navElement[2]['DETAIL_PAGE_URL']?>?<?=$sort_url?>">Следующий товар</a></small> </span> </div> </noindex>
Пример 7:
//вывод ненаступивших и, следовательно, неактивных анонсов событий без правки компонента // в компоненте указываем имя фильтра, а сам фильтр добавляем перед компонентом: <? $arrFilter=Array(array( "LOGIC" => "OR", array("DATE_ACTIVE_TO"=>false), array(">DATE_ACTIVE_TO"=>ConvertTimeStamp(time(),"FULL")) )); ?>
Пример 8:
//В iblock v18.6.700 появилась возможность сортировать выборку в порядке ID, указанных в массиве // сортировать в таком порядке ID $ids = [115, 120, 117, 109, 128]; $rs = CIBlockElement::GetList( ['ID' => $ids], ['IBLOCK_ID' => '5', 'ID' => $ids], false, false, ['ID', 'IBLOCK_ID', 'NAME'] ); while ($ar = $rs->Fetch()) { echo $ar['ID'] . ' '; } // имеем вывод: // 115 120 117 109 128
Пример 9:
//В iblock v21.700.100 в arNavStartParams добавлен ключ nOffset (смещение) \Bitrix\Main\Loader::includeModule('iblock'); $res = CIBlockElement::GetList( ['ID' => 'ASC'], ['IBLOCK_ID' => 2], false, ['nTopCount' => 5, 'nOffset' => 1000], ['ID', 'IBLOCK_ID', 'NAME'] ); while ($row = $res->Fetch()) { echo '<pre>', mydump($row), '</pre>'; } // nTopCount - сколько // nOffset - с каким смещением
Пример 10. Вывести элементы с непустым значением множественного свойства типа список
${$FILTER_NAME}[]=array( "ID" => CIBlockElement::SubQuery("ID", array( "IBLOCK_ID" => $arParams['IBLOCK_ID'], "!=PROPERTY_".$arProp["CODE"] => false )) );
Пример 11. Организация поиска по каталогу с помощью поля SEARCHEBLE_CONTENT.
<? CModule::IncludeModule('iblock'); $IBLOCK_ID = intval($_REQUEST['IBLOCK_ID']); $QUERY = trim($_REQUEST['q']); if($QUERY) { $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM", "DETAIL_PAGE_URL", "PREVIEW_PICTURE"; $arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "SEARCHABLE_CONTENT"=>'%'.$_REQUEST['q'].'%'); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>50), $arSelect); while($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); print_r($arFields); } } ?>
Пример 12. Для фильтрации по Дате например с 12.09.2014 по 18.09.2014 включительно фильтр будет выглядеть следующим образом:
$date_from = '12.09.2014'; $date_to = '18.09.2014'; $db_el = CIBlockElement::GetList( array('ID' => 'DESC'), array( '>=DATE_CREATE' => $date_from, '<=DATE_CREATE' => $date_to . ' 23:59:59' ) );