RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

JPagination - постраничная навигация в компоненте

Класс JPagination в Joomla позволяет разработчикам надежно добавлять пагинацию в свои компоненты. Как в Front-End, так и в Back-End. Файл, описывающий этот класс находится по адресу

/libraries/joomla/html/pagination.php

// подключение класса

jimport('joomla.html.pagination');

 

Конструктор

В конструкторе класса используется три переменные:

  • $total — Общее количество элементов в списке,
  • $limitstart — переменная, которая задает начало отсчета для пагинации,
  • $limit — количество элементов, которое будет выводиться на каждой странице.

Методы класса

getPagesCounter() — Возвращает строку, которая отображает текущую страницу и общее количество страниц. Пример

pagescounter

getResultsCounter() — Возвращает строку, которая отображает текущие результаты. Пример

resultscounter

getPagesLinks() — Возвращает строку, которая отображает ссылки результата разбиения на страницы

pageslinks

getListFooter() — Возвращает комбинацию из нескольких элементов. В том числе — выпадающий список Limit, а так же тоже, что возвращают функции getPagesLinks() и getResultsCounter(). Внешний вид для Front-End и Back-End будет отличаться, т. к. подключаются соответствующие CSS стили для админки.

  • Front-end:

Listfooter-front

  • Back-end:

Pagination

getLimitBox() — Возвращает код HTML, который будет выводить выпадающий список Limit

limitbox

 

Простой пример c базой данных

Большинство разработчиков не используют SQL_CALC_FOUND_ROWS, который вернет количество всех подходящих под запрос записей, когда количество записей ограничивается LIMIT’ом. Обычая ошибка в таком случаем — это выполнить два почти одинаковых запроса. А в результате замедление работы

$db = & JFactory::getDBO();
$limit   = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 14, 'int'); //I guess getUserStateFromRequest is for session or different reasons
$limit_start  = JRequest::getVar('limitstart', 0, '', 'int');
$db->setQuery('SELECT SQL_CALC_FOUND_ROWS x, y, z FROM jos_content WHERE x', $limit_start, $limit);
$items = &$db->loadAssocList();
if (empty($items)) {

    $jAp->enqueueMessage($db->getErrorMsg(), 'error');

    return;

} else {
    //Here the beauty starts
    $db->setQuery('SELECT FOUND_ROWS();');  //не перезагружем запрос! а просто вернем данные их предыдущего запроса
    jimport('joomla.html.pagination');
    $pageNav = new JPagination( $db->loadResult(), $limit_start, $limit );
    foreach($items as $item) {
        //вывод элементов
    }
    echo $pageNav->getListFooter(); // отображаем навигацию

} 

Реализация в MVC-компоненте

Изменения в модели

Объявляем переменные $_total и $_pagination в модели; Они будут возвращены функциями getTotal() и getPagination(), соответственно.

  /**
   * Items total
   * @var integer
   */
  var $_total = null;
 
  /**
   * Pagination object
   * @var object
   */
  var $_pagination = null;

Добавляем в конструктор (или создаем его) две переменные — $limitstart и $limit. Они будут нужны для класса JPagination.

  function __construct()
  {
        parent::__construct();
 
        global $mainframe, $option;
 
        // Получаем переменные для постраничной навигации
        $limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
        $limitstart = JRequest::getVar('limitstart', 0, '', 'int');
 
        // In case limit has been changed, adjust it
        $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);
 
        $this->setState('limit', $limit);
        $this->setState('limitstart', $limitstart);
  }

Пересмотрим функцию getData() в компоненте. Добавим значения переменных $limitstart и $limit в метод _getList(). Это позволит выбирать нужные строки, а не все строки.

  function getData() 
  {
        // if data hasn't already been obtained, load it
        if (empty($this->_data)) {
            $query = $this->_buildQuery();
            $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); 
        }
        return $this->_data;
  }

Создадим новую функцию getTotal(). В этой функции будем использовать метод _getListCount() класса JModel. Эта функция будет возвращать общее количество строк в запросе. Значение, которое она будет возвращать будет использоваться в следующей функции getPagination().

  function getTotal()
  {
        // Load the content if it doesn't already exist
        if (empty($this->_total)) {
            $query = $this->_buildQuery();
            $this->_total = $this->_getListCount($query);    
        }
        return $this->_total;
  }

Создадим функцию getPagination(). Эта функция будет создавать и возвращать новый объект Pagination, который будет передаваться в Вид.

  function getPagination()
  {
        // Load the content if it doesn't already exist
        if (empty($this->_pagination)) {
            jimport('joomla.html.pagination');
            $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit') );
        }
        return $this->_pagination;
  }

Изменения в Виде

Допишите в представлении (view) функционал, который будет получать объект класса JPagination из модели и назначать переменную для работы с ним из шаблона

  ...
        // Получаем данные из модели
        $items =& $this->get('Data');      
        $pagination =& $this->get('Pagination');
 
        // Назначаем переменные для работы с данными из шаблона
        $this->assignRef('items', $items);     
        $this->assignRef('pagination', $pagination);
  ...

Изменения в Шаблоне

Добавьте область footer-а, где будет находиться навигация по страницам, к таблице, отображающей ваш список данных. Метод getListFooter() класса JPagination генерирует кнопки и их функционал «следующая/предыдущая» как на картинках:

  • Front-End

listfooter-front

  • Back-End

pagination

Измените свойство colspan=«9» тега <td> для соответствия количеству колонок в вашей таблице.

  ...
  <tfoot>
    <tr>
      <td colspan="9"><?php echo $this->pagination->getListFooter(); ?></td>
    </tr>
  </tfoot>
  ...

Смотрите также:
Комментарии (6) Добавить комментарий
  • Данил
    Данил
    09 Августа 2011, 21:26
     ↑  0  ↓     ответ

    Спасибо, это усваивать легче чем на английском =)

  • Михаил
    Михаил
    19 Октября 2011, 00:03
     ↑  +1  ↓     ответ

    Отличная статья, но добавлю что в шаблоне, область вывода данных нужно помещать в форму и указывать action и ОБЯЗАТЕЛЬНО указывать name=adminForm:

    <form action="index.php?option=com_yourcom&controller=yourcont&task=yourtask" method="post" name="adminForm"">

    ...

    <tfoot>

    <tr>

    <td colspan="9"><?php echo $this->pagination->getListFooter(); ?></td>

    </tr>

    </tfoot>

    ...

    </form>

  • nikko
    nikko
    16 Января 2012, 15:24
     ↑  -6  ↓     ответ

    Описал способ "очеловечить" пагинацию, может кому интересно

    e-kzn.ru/rasshireniya/kak-izmenit-paginatsiiu-v-joomla-1-5.html

  • алексей
    алексей
    22 Августа 2012, 16:57
     ↑  0  ↓     ответ

    Давно хотел изменить вид постраничной навигации. спасибо. попробую сделать

  • Seo-West.Com
    Seo-West.Com
    01 Ноября 2012, 16:54
     ↑  0  ↓     ответ

    Спасибо, оказывается не я один озадачен панигацией!

  • Darden
    Darden
    22 Февраля 2013, 05:02
     ↑  0  ↓     ответ

    Помогите с Пагинацией!

    На главной странице работает хорошо, а в категориях глюк — не листает, да и урл глючный пишет apps-club.ru/index.php/20/igry/results,25-24

    все перерыл — тупик.

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.