+38(073) 413-59-71  info@binliz.org.ua

Постраничная навигация Bitrix D7 для любой выборки

 25.02.2015
1C-Bitrix

Для создания постраничной навигации нам понадобится:

  1. Определить в каком параметре приходит страница т.е. PAGEN_1.....1000 
  2. класс CDBResult
  3. Количество отфильтрованых элементов

Ну что же для начала определимся с параметром:

use \Bitrix\Main;
use \Bitrix\Main\Entity; 
global $NavNum, $APPLICATION;
$Num = intval($NavNum)+1;

Это такое я сделал для того чтобы понять какой параметр PAGEN_XXX нам прийдет

Получив параметр можно определится с номером страницы:

$context = \Bitrix\Main\Application::getInstance()->getContext();
$request = $context->getRequest();
$method = $request->getRequestMethod();
$pageNumber = $request->getQuery('PAGEN_'.$Num);

Получили номер страницы пора составить правила:

$limit = array(
	'nPageSize' => 5, // Укажем количество выводимых элементов
	"bDescPageNumbering" => false, // Обратная навигация или прямая 
	'iNumPage' => $pageNumber?$pageNumber:1),
	'bShowAll' => false // тут как вам нравится если надо можно показывать ссылку все
);
$navigation = \CDBResult::GetNavParams($limit);

 С навигацией определились создали правила и объекты, далее нужна сама выборка

	$Query = new \Bitrix\Main\Entity\Query(\Binliz\Main\MyTable::getEntity());
	$Query->setSelect(array('ID','NAME'))
				->setFilter(array('USER_ID'=>1)) // ваш фильтр у меня тут по юзерID фильтр
				->setOrder(array('ID'=>$limit["bDescPageNumbering"]?'ASC':'DESC)'));
				->setLimit($limit['nPageSize']);
				->setOffset(($limit['iNumPage']-1) * $limit['nPageSize']);
	$result = $Query->exec();

 Выбрали данные из таблицы все замечателньо потом простым $result->fetch() или $result->fetch(обработчик) обработали их для вывода. 

Ну а сейчас самое интересное, для постранички нам нужно выбрать количество элементов в таблице для этого опять наш фильтр надо применить только определить временнное поле COUNT

$QueryCount = new \Bitrix\Main\Entity\Query(\Binliz\Main\MyTable::getEntity());
$QueryCount->registerRuntimeField('COUNT', array(
		'data_type'=>'integer',
		'expression' => array('COUNT(*)')
	))
	->setSelect(array('COUNT'))
	->setFilter(array('USER_ID'=>1));
      $result_count = $kinQueryCount->exec()->fetch();
      $result_count = $result_chain["COUNT"];
      unset($QueryCount);

 И создадим саму навигацию:

  		$result = new \CDBResult();
		$result->NavStart($navigation,false,true);
      $result->NavRecordCount = $result_count;
      $result->NavPageSize = $limit['nPageSize'];
      $result->bShowAll = $limit['bShowAll'];
      $result->NavPageCount = ceil($result->NavRecordCount/$result->NavPageSize);
      $result->NavPageNomer = $limit['iNumPage'];
		$NAV_STRING = $result->GetPageNavStringEx($navComponentObject,'Название постранички', '', $limit['bShowAll']);

 Вот как то так это у нас и получится, костыли конечно но все же дает результат.