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

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

Класс JPagination, представленный в Joomla! 1.5, позволяет легко, и просто добавлять постраничную навигацию — пагинацию для вывода компонентов Фронтэнда и Бэкэнда. Файл, содержащий класс, находится в /libraries/joomla/html/pagination.php.

Переменные класса JPagination

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

  • $total — общее количество элементов в списке.
  • $limitstart — смещение ( с какого элемента по счёту начинать вывод ).
  • $limit — лимит ( количество элементов на странице ).

Под "элементами" в списке выше подразумевается, например, количество статей в категории

Статические методы класса JPagination

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

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

Сортировка?

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

Joomla сортировка

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

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>

...

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

 

Возможно Вас заинтересуют эти материалы

Joomla 1.5: Отправка почты.

В этой заметке рассказано о том, как отправлять почту, используя механизмы предоставленные Joomla 1.5 (

Joomla 1.5: Система событий.

Joomla 1.5 имеет систему событий, основанную на реализации шаблона проектирования Observer. И эта система очень неплохо

Joomla 1.5: Использование Ajax

В данной заметке вы узнаете, о том как разработать простое Ajax взаимодействие с использованием MooTools