Решение проблемы пагинации
Проблема: сделать пагинацию для отфильтрованных через D7 данных - Entity\DataManager::getList()
.
Решения два: двойной проход, и через SQL_CALC_FOUND_ROWS
Двойной проход
// Количество записей и страниц для пагинации $navParams['numResults'] = RequestTable::getList([ 'select' => [new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)')], 'filter' => $this->orderFilter ])->fetch()['CNT']; $navParams['count'] = ceil($navParams['numResults'] / $navParams['nPageSize']); // Результаты на страницу $dbOrder = RequestTable::getList([ 'select' => [ '*', 'NUMBER_1C', 'CUST_NUMBER', 'URLISO_PLATELCHIK', 'URLISO_GRUZOPOL', 'TECH_REQUEST', 'INVOICE', 'USER_LAST_NAME' => 'USER.LAST_NAME', 'USER_NAME' => 'USER.NAME', ], 'filter' => $this->orderFilter, 'order' => $this->orderSort, 'offset' => $navParams['nPageSize'] * ($navParams['iNumPage'] - 1), 'limit' => $navParams['nPageSize'] ]);
SQL_CALC_FOUND_ROWS
// Выбираем, фильтруем $q = \Vendor\Prodcat\Orm\ProductSectionTable::query() ->setSelect(array( 'ID' => 'PRODUCT.ID', 'NAME' => 'PRODUCT.NAME', 'ARTICLE' => 'PRODUCT.ARTICLE', 'IMAGE' => 'PRODUCT.IMAGE', 'ACTIVE' => 'PRODUCT.ACTIVE', 'SORT' => 'PRODUCT.SORT', 'PRICE' => 'PRODUCT.PRICE', 'SEF_NAME' => 'PRODUCT.SEF_NAME' )) ->setOrder(array( 'SORT' => 'ASC', 'NAME' => 'ASC' )) ->setLimit($arParams['PAGE_CNT']) ->setFilter($qFilter); // Добавляем через "хак" SQL_CALC_FOUND_ROWS $q = str_replace('SELECT ', 'SELECT SQL_CALC_FOUND_ROWS ', $q->getQuery()); $dbConn = \Bitrix\Main\Application::getConnection(); // Получаем данные $productList = $dbConn->query($q); // Получаем общее количество для пагинации $result = $dbConn->query('SELECT FOUND_ROWS() AS CNT')->fetch(); $arResult['TOTAL'] = intval($result['CNT']);