Действия

Паджинация в Joomla 1.x

Материал из База знаний Joomla

Вступление

В Joomla 1.x есть встроенные механизмы разделения списков на страницы. Причем не важно что это за список - вы просто используете экземпляр класса mosPageNav и при помощи него выводите разделители страниц.


Как это сделать

Основная цель разеделения на страницы - избежать сильной нагрузки на MySQL сервер и при получении данных выбирать только то, что вам непосредственно нужно. А нужны нам, предположим, записи с 10 по 20, и большого смысла выбирать целую тысячу конечно же нет.

Технически это реализуется посредством конструкции LIMIT x,y языка SQL. Первое число - стартовая запись, второе - число записей которые надо отобрать.

В Joomla этими двумя числами являются переменные $limit и $limistart. Обычно они передаются среди страниц и для того что бы их получить из запроса надо воспользоваться функцией mosGetParam в самом начале вашего компонента:

$limit      = (int)mosGetParam( $_REQUEST, 'limit', 0 ) );
$limitstart = (int)mosGetParam( $_REQUEST, 'limitstart', 0 ) );

Следующее что вам нужно - это узнать общее количество строк. Это необходимо, что бы код класса мог правильно определить общее число страниц. Например, если вы выводите список пользователей, это можно сделать вот так:

$query = "SELECT COUNT(id) FROM #__users";
$database->setQuery( $query );
$total = $database->loadResult();

Так же мы знаем, что пользователю нельзя доверять, поэтому мы должны в случае не правильного ввода или при первом запросе компонента подкорректировать переменные $limit и $limistart.

$limit = $limit ? $limit : 10;
if ( $total <= $limit ) { 
    $limitstart = 0;
}

В данном примере мы будем выводить по 10 пользователей на страницу.

Для использования класса mosPageNav надо включить файл, содержащий его, а именно pageNavigation.php:

global $mosConfig_absolute_path;
require_once( $mosConfig_absolute_path . '/includes/pageNavigation.php' );
$pageNav = new mosPageNav( $total, $limitstart, $limit );

Теперь можно выбирать только необходимые нам данные:

$query = "SELECT * FROM #__users";
$database->setQuery( $query, $limitstart, $limit ); 
$users = $database->loadObjectList();
 
for( $i=0; $i<sizeof($users); $i++ )
{
 
    $user = $users[$i];
    echo "{$user->username} - {$user->email}<br />";
}

А после отображения списка нужным нам образом надо вывести сами разделители страниц, например так:

 
Отображать по <?php echo $pageNav->getLimitBox( $link ); ?>
 
<?php echo $pageNav->writePagesLinks( $link ); ?>
 
Выберите страницу: <?php echo $pageNav->writePagesCounter(); ?>