Joomla 1.5: Пагинация.
Класс JPagination, представленный в Joomla! 1.5, позволяет легко, и просто добавлять постраничную навигацию - пагинацию для вывода компонентов Фронтэнда и Бэкэнда. Файл, содержащий класс, находится в /libraries/joomla/html/pagination.php.
Переменные класса JPagination
Конструктор класса принимает три обязательных параметра:
- $total - общее количество элементов в списке.
- $limitstart - смещение ( с какого элемента по счёту начинать вывод ).
- $limit - лимит ( количество элементов на странице ).
Под "элементами" в списке выше подразумевается, например, количество статей в категории
Статические методы класса JPagination
- getPagesCounter()
-
/** * Create and return the pagination pages counter string * * @access public * @return string Pagination pages counter string * @since 1.5 */ function getPagesCounter()
Возвратит строку, содержащую текущую страницу и общее количество страниц, типа:
Страница 2 из 6 - getResultsCounter()
-
/** * Create and return the pagination result set counter string * * @access public * @return string Pagination result set counter string * @since 1.5 */ function getResultsCounter()
Возвратит строку, содержащую результаты типа:
Результаты 1 - 5 из 7 - getPagesLinks()
-
/** * Create and return the pagination page list string, ie. Previous, Next, 1 2 3 ... x * * @access public * @return string Pagination page list string * @since 1.0 */ function getPagesLinks()
Возвращает HTML код для отображения ссылок постранички типа:
<< Первая Предыдущая 1 2 3 4 Следующая Последняя >> - getListFooter()
-
/** * Return the pagination footer * * @access public * @return string Pagination footer * @since 1.0 */ function getListFooter()
Возвращает сочетание нескольких логически связанных элементов страницы, в том числе: ограничитель количества выводимых элементов, в виде выпадающего списка, ссылки страницы и счетчик страницы. Внешний вид различается для Фронтенда и Бэкенда тем, для последнего применяется CSS шаблон форматирования Khepri.
Фронтенд пагинация:

Бэкенда пагинация:

- getLimitBox()
-
/** * Creates a dropdown box for selecting how many records to show per page * * @access public * @return string The html for the limit # input box * @since 1.0 */ function getLimitBox()
- orderUpIcon()
-
Возвратит элемент управления - иконку, для перемещения элемента вверх.
/** * Return the icon to move an item UP * * @access public * @param int $i Индекс строки в таблице, где выводится элемент. * @param boolean $condition - Условие ( должно быть true) для показа иконки. * @param string $task - Задача контроллера, которая отвечает за модификацию данных ( изменение номера позиции элемента ) * @param string $alt - строка alt картинки - иконки. * @return string строка html - код иконки для перемещения элемента вверх. * @since 1.0 */ function orderUpIcon($i, $condition = true, $task = 'orderup', $alt = 'Move Up', $enabled = true)
- orderDownIcon()
-
Возвратит элемент управления - иконку, для перемещения элемента вниз. Параметры такие же как и у метода выше, за исключением одного добавленного.
/** * Вернёт иконку для перемещения элемента вниз * * @param int $i Индекс строки в таблице, где выводится элемент. * @param int $n Количество элементов в списке ( таблице ) * @param boolean $condition - Условие ( должно быть true) для показа иконки. * @param string $task - Задача контроллера, которая отвечает за модификацию данных ( изменение номера позиции элемента ) * @param string $alt - строка alt картинки - иконки. * @param boolean $enabled - булев флаг, если он равен true (по - умолчанию) то элемент активен. * @return string строка html - код иконки для перемещения элемента вниз * @since 1.0 */ function orderDownIcon($i, $n, $condition = true, $task = 'orderdown', $alt = 'Move Down', $enabled = true)
Возвращает HTML код, который будет выводить ограничитель количества выводимых элементов, в виде выпадающего списка:
![]()
Сортировка?
Два следующих метода на мой взгляд не совсем относятся к постраничной навигации, но разработчики Joomla 1.5 решили поместить их именно в класс JPagination. Эти методы выводят маленькие иконки, изображающие стрелочки вверх и вниз, как правило это применяется в интерфейсе админа, там где имеет место некий порядок элементов ( например в элементах меню ). При нажатии на эти иконки следует передача get - переменной task, которая по идее должна содержать название метода контроллера, который в свою очередь должен реализовать логику изменения порядка элементов.

Примеры использования Jpagination
с JDatabase
$db =& JFactory::getDBO();
// Используется getUserStateFromRequest для работы с сеансовыми переменными и куками:
$lim = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 14, 'int');
$limitStart = JRequest::getVar('limitstart', 0, '', 'int');
// Если после SELECT написать SQL_CALC_FOUND_ROWS, то помимо своего стандартного поведения
// mysql ещё посчитает кол - во строк без учёта LIMIT, и сохранит это число в памяти до
// следующего обращения.
$db->setQuery('SELECT SQL_CALC_FOUND_ROWS x, y, z FROM jos_content WHERE x', $limitStart, $lim);
$rL=&$db->loadAssocList();
if (empty($rL)) {
$jAp->enqueueMessage($db->getErrorMsg(),'error'); return;
} else {
// Вот здесь, мы особо не напрягая базу данных получаем общее кол - во элементов:
$db->setQuery('SELECT FOUND_ROWS();');
jimport('joomla.html.pagination');
$pageNav = new JPagination( $db->loadResult(), $limitStart, $lim );
foreach($rL as $r) {
//... здесь ваш код...
}
//Отображение постраничной навигации
echo $pageNav->getListFooter( );
Implementation
Изменения Модели
Объявите свойства $ _total и $ _pagination в модели; они будут возвращены функциями getTotal () и getPagination (), соответственно.
/** * Общее число элементов * @var integer */ var $_total = null; /** * Объект постранички * @var object */ var $_pagination = null;
Добавьте или создайте функцию конструктор, которая установит значения для переменных $limitstart и $limit, поскольку они необходимы классу JPagination.
function __construct()
{
parent::__construct();
$mainframe = JFactory::getApplication();
// Получаем переменные запроса, относящиеся к постраничной навигации:
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
$limitstart = JRequest::getVar('limitstart', 0, '', 'int');
// В случае, если лимит был изменён - уточняем его:
$limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);
$this->setState('limit', $limit);
$this->setState('limitstart', $limitstart);
}
Пересмотрим функцию getData(), добавим параметры $limitstart и $limit в запрос, который произведёт метод _getList(). Это и заставит его вернуть только необходимое нам количество строк, а не все строки.
function getData()
{
// Если данные УЖЕ не были загружены - загружаем их:
if (empty($this->_data))
{
$query = $this->_buildQuery();
$this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit'));
}
return $this->_data;
}
Создайте функцию getTotal(). Эта функция использует метод _getListCount() класса JModel, чтобы вернуть общее количество строк в запросе.
function getTotal()
{
// Загружаем содержимое, если оно уже не было получено:
if (empty($this->_total))
{
$query = $this->_buildQuery();
$this->_total = $this->_getListCount($query);
}
return $this->_total;
}
Создайте функцию getPagination(). Функция создаст и возвратит новый объект JPagination, к которому сможет получить доступ класс "вида".
function getPagination()
{
// Загружаем содержимое, если оно уже не было получено:
if (empty($this->_pagination))
{
jimport('joomla.html.pagination');
$this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit') );
}
return $this->_pagination;
}
Изменения вида
...
// Получаем данные из молели:
$items =& $this->get('Data');
$pagination =& $this->get('Pagination');
// Помещаем данные в шаблон:
$this->assignRef('items', $items);
$this->assignRef('pagination', $pagination);
...
Изменения Шаблона
Осталось лишь добавить код, который выведет нашу постраничную навигацию:
...
<tfoot>
<tr>
<td colspan="9"><?php echo $this->pagination->getListFooter(); ?></td>
</tr>
</tfoot>
...
Ну вот и всё, что я хотел рассказать в данной заметке. Кстати за её основу взята .
Joomla 1.5: Пагинация.