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.
arSelectFields или в arGroupBy, если указана группировка записей.
Смотрите также
Параметры вызова
| Параметр | Описание | С версии |
|---|---|---|
| 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);
}
?>
Пример 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'
)
);
Пример 13. Выборка полей элемента и всех свойств:
<?php
$arSelect = ["ID", "NAME", "IBLOCK_ID"];
$arFilter = ["IBLOCK_ID"=>(int)$iblockId, "ID"=> (int)$elementId];
$res = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);
$ob = $res->GetNextElement());
if ($ob)
{
$fields = $ob->GetFields(); // указанные в $arSelect поля
print_r($fields);
$properties = $ob->GetProperties();
print_r($properties);
}