Joomla 1.5: Пагинация.

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.

Фронтенд пагинация:

Joomla пагинация

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

Joomla пагинация бэкенд

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()

Возвращает HTML код, который будет выводить ограничитель количества выводимых элементов, в виде выпадающего списка:

Joomla пагинация лимит

Сортировка?

Два следующих метода на мой взгляд не совсем относятся к постраничной навигации, но разработчики Joomla 1.5 решили поместить их именно в класс JPagination. Эти методы выводят маленькие иконки, изображающие стрелочки вверх и вниз, как правило это применяется в интерфейсе админа, там где имеет место некий порядок элементов ( например в элементах меню ). При нажатии на эти иконки следует передача get - переменной task, которая по идее должна содержать название метода контроллера, который в свою очередь должен реализовать логику изменения порядка элементов.

Joomla сортировка

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)

Примеры использования Jpagination

с JDatabase

Вот хороший пример, который использует мощь mysql, Очень хорошо подходит для реализации постраничной навигации. Большинство разработчиков не использует SQL_CALC_FOUND_ROWS, а зря...
$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;
}

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

Пересмотрите реализацию вида, чтобы получить объект JPagination, создаваемый в Модели и передать его для использования в шаблоне.
  ...
  // Получаем данные из молели:
 	$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>
  ...

Ну вот и всё, что я хотел рассказать в данной заметке. Кстати за её основу взята .

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 59 гостей онлайн