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' ) );
gr1ffon
|
||||
Если Вы обратите внимание во время использования данного функционала, то заметите, что если в параметр arNavStartParams отправить массив, содержащий элемент iNumPage, равный значению больше, чем есть на самом деле страниц, то будет выведена 1-я страница. Так как этот баг живет уже очень много лет, то она уже стала фичей. Но если Вам данная фича не нужна, её можно исправить следующим костылём, который, я так понимаю, был добавлен в прошлом году:
Пример:
| ||||
Хамиджон Имомов
|
||
Для выборки до 6 определенных элементов вместе с путями PREVIEW_PICTURE
| ||
Павел Адаманов
|
||
Для фильтрации по свойству инфоблока типа "Дата/Время". Например, выбрать все активные элементы в с PROPERTY_DATE = '24.15.2015 12:10:00' , фильтр будет выглядеть следующим образом:
| ||
Федор Майоров
|
||
Для ключа CATALOG_STORE_AMOUNT_<идентификатор_склада> значением является требуемое значение товара, например:
| ||
Алексей Попович
|
||||
выборка по свойству типа "Дата/время" по точному совпадению:
| ||||
Алексей Попович
|
||
Для подсчета количества элементов, полученных в результате выборке GetList, существует специальная
Комментарий от разработчика: некорректно работает для Oracle и MSSQL | ||
Алексей Попович
|
Если у элемента установлена привязка к нескольким разделам, то функция возвращает только один из этих разделов. Для того, чтобы получить все разделы, к которым привязан элемент, нужно в цикле перебора элементов вызывать функцию
|
Эльдар Рахимбердин
|
||||
Отрицание в фильтре SECTION_ID не будет работать, если элементы привязаны к нескольким разделам.
Пример: Элемент привязан к разделам 1, 2, 3. Выбрать элементы с фильтром
Выбрать элементы с фильтром
| ||||
Алексей Попович
|
||||||
пример LOGIC:
Задача: Вывести все элементы инфоблока, у которых совпадают пары производитель + артикул.
Вторая строка говорит о том, что дальше пойдет условие "ИЛИ" Далее в массиве перебираем все пары значений Производитель + Артикул. Обратите особое внимание, что каждый блок для "ИЛИ" - это массив, А т.к. внутри "ИЛИ" размещается еще и условие "И", то содержимое условия "И" - также вложенный массив. К стати, строку #5 можно опустить -. это значение по умолчанию. В результате получаем примерно такую структуру: .... ИЛИ{ {И{бренд,артикул}} {И{бренд,артикул}} } | ||||||
Александр Водолазский
|
||||
В версии БУС 12.5 возникла проблема: нужно выбрать элементы, исходя из значения XML_ID у свойства типа список.
Стандартный параметр для фильтра не работает, т.е. например:
Из старого поста В результате поиска было установлено, что отфильтровать можно следующим способом:
| ||||
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.