Пример реализации выборки из нескольких инфоблоков с постраничной навигацией и сортировкой.
Задача:
1) Выбрать список элементов из нескольких инфоблоков в таблицу;
2) Иметь возможность сортировки элементов;
3) Должна работать постраничная навигация
Итак этот пример можно использовать при небольшом кол-ве выбираемых элементов, думаю максимум до 100, естественно с кэшированием.
Первым делом нужно выбрать все данные в ассоциативный массив, например вот такой:
[ITEAM] => Array
(
[0] => Array
(
[CITY_NAME] => value
[CITY_DETAIL_URL] => value
[OBJECT_NAME] => value
[OBJECT_ID] => 2487
[DATE_CREATE] => 02.07.2006
[STATUS] => Y
[PAID_STATUS] => Y
[DATEIL_OBJECT_URL] => value
)
[1] => Array
(
[CITY_NAME] => value
[CITY_DETAIL_URL] => value
[OBJECT_NAME] => value
[OBJECT_ID] => 2489
[DATE_CREATE] => 02.07.2006
[STATUS] => Y
[PAID_STATUS] => N
[DATEIL_OBJECT_URL] => value
)
После чего нам нужно его разбить на посртраничку, используем API
$rs_ObjectList = new CDBResult;
$rs_ObjectList->InitFromArray($arResult['ITEAM']);
$rs_ObjectList->NavStart(10, false);
$arResult["NAV_STRING"] = $rs_ObjectList->GetPageNavString("", 'komka.cabinet');
$arResult["PAGE_START"] = $rs_ObjectList->SelectedRowsCount() - ($rs_ObjectList->NavPageNomer - 1) * $rs_ObjectList->NavPageSize;
while($ar_Field = $rs_ObjectList->Fetch())
{
$arResult['_ITEAM'][] = $ar_Field;
}
Перед этим кодом нужно отсортировать массив $arResult[‘ITEAM’], для это пишем класс, его я выложу в конце поста, а вот пример применения
usort($arResult['ITEAM'], array("CCabinet_SortObject", "cmp_".$arParams['SORT_BY']."_".$arParams['SORT_ORDER']));
А вот и сам класс
class CCabinet_SortObject {
function __cmp_ValueOf($a, $b, $name, $order) {
if(is_set($a[$name]) && is_set($b[$name])) {
if($order == 'ASC')
return ($a[$name]<$b[$name])?true:false; elseif($order == 'DESC') return ($b[$name]>$a[$name])?false:true;
}
}
function cmp_STATUS_ASC($a, $b) {
return CCabinet_SortObject::__cmp_ValueOf($a, $b, "STATUS", "ASC");
}
function cmp_STATUS_DESC($a, $b) {
return CCabinet_SortObject::__cmp_ValueOf($a, $b, "STATUS", "DESC");
}
function cmp_NAME_ASC($a, $b) {
return CCabinet_SortObject::__cmp_ValueOf($a, $b, "OBJECT_NAME", "ASC");
}
function cmp_NAME_DESC($a, $b) {
return CCabinet_SortObject::__cmp_ValueOf($a, $b, "OBJECT_NAME", "DESC");
}
function cmp_CITY_ASC($a, $b) {
return CCabinet_SortObject::__cmp_ValueOf($a, $b, "CITY_NAME", "ASC");
}
function cmp_CITY_DESC($a, $b) {
return CCabinet_SortObject::__cmp_ValueOf($a, $b, "CITY_NAME", "DESC");
}
function cmp_DATE_DESC($a, $b) {
if ($a["DATE_CREATE"] == $b["DATE_CREATE"]) {
return 0;
}
return ($a["DATE_CREATE"] > $b["DATE_CREATE"]) ? -1 : 1;
}
function cmp_DATE_ASC($a, $b) {
if ($a["DATE_CREATE"] == $b["DATE_CREATE"]) {
return 0;
}
return ($a["DATE_CREATE"] < $b["DATE_CREATE"]) ? -1 : 1;
}
}