Wiki Bitrix

Решение проблемы пагинации

Проблема: сделать пагинацию для отфильтрованных через 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']);