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()
Возвратит строку, содержащую текущую страницу и общее количество страниц, типа:
- getResultsCounter()
-
/** * Create and return the pagination result set counter string * * @access public * @return string Pagination result set counter string * @since 1.5 */ function getResultsCounter()
Возвратит строку, содержащую результаты типа:
- 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> ...
Ну вот и всё, что я хотел рассказать в данной заметке. Кстати за её основу взята .