|
|
|
<?php
|
|
|
|
|
|
|
|
// Проверка
|
|
|
|
if (! defined('BASE_DIR'))
|
|
|
|
exit('Directly access denied');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This source file is part of the AVE.cms. More information,
|
|
|
|
* documentation and tutorials can be found at http://www.ave-cms.ru
|
|
|
|
*
|
|
|
|
* @package AVE.cms
|
|
|
|
* @file system/core/helper/pagination.php
|
|
|
|
* @author @
|
|
|
|
* @copyright 2007-2017 (c) AVE.cms
|
|
|
|
* @link http://www.ave-cms.ru
|
|
|
|
* @version 4.0
|
|
|
|
* @since $date$
|
|
|
|
* @license license GPL v.2 http://www.ave-cms.ru/license.txt
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
class AVE_Paginations
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Постраничная навигация для запросов и модулей
|
|
|
|
*
|
|
|
|
* @param int $total_pages количество страниц в документе
|
|
|
|
* @param string $type тип постраничной навигации,
|
|
|
|
* допустимые значения: page, apage, artpage
|
|
|
|
* @param string $template_label шаблон метки навигации
|
|
|
|
* @param string $navi_box контейнер постраничной навигации %s
|
|
|
|
* @return string HTML-код постраничной навигации
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static function getPagination($total_pages, $type, $template_label, $pagination_id = 1, $pagination_box_ext = '')
|
|
|
|
{
|
|
|
|
$pagination = '';
|
|
|
|
|
|
|
|
if (! in_array($type, array('page', 'apage', 'artpage')))
|
|
|
|
$type = 'page';
|
|
|
|
|
|
|
|
$containers = array();
|
|
|
|
|
|
|
|
$curent_page = self::getCurrentPage($type);
|
|
|
|
|
|
|
|
$containers = self::getContainers($pagination_id);
|
|
|
|
|
|
|
|
if ($curent_page == 1) $pages = array ($curent_page, $curent_page + 1, $curent_page + 2, $curent_page + 3, $curent_page + 4);
|
|
|
|
elseif ($curent_page == 2) $pages = array ($curent_page-1, $curent_page, $curent_page+1, $curent_page+2, $curent_page+3);
|
|
|
|
elseif ($curent_page + 1 == $total_pages) $pages = array ($curent_page-3, $curent_page-2, $curent_page-1, $curent_page, $curent_page+1);
|
|
|
|
elseif ($curent_page == $total_pages) $pages = array ($curent_page-4, $curent_page-3, $curent_page-2, $curent_page-1, $curent_page);
|
|
|
|
else $pages = array ($curent_page-2, $curent_page-1, $curent_page, $curent_page+1, $curent_page+2);
|
|
|
|
|
|
|
|
$pages = array_unique($pages);
|
|
|
|
|
|
|
|
// $pagination_link_box Контенйнер для ссылок %s
|
|
|
|
// $pagination_separator_box Контенйнер для метки о наличии страниц кроме видимых %s
|
|
|
|
// $pagination_active_link_box Контенйнер для активного элемента %s
|
|
|
|
// $pagination_start_label Текст ссылки "Первая"
|
|
|
|
// $pagination_end_label Текст ссылки "Последняя"
|
|
|
|
// $pagination_separator_label Текст метки о наличии страниц кроме видимых
|
|
|
|
// $pagination_next_label Текст ссылки "Следующая"
|
|
|
|
// $pagination_prev_label Текст ссылки "Предыдущая"
|
|
|
|
// $pagination_link_template Шаблон ссылки
|
|
|
|
// $pagination_link_active_template Шаблон активной ссылки
|
|
|
|
// $pagination_navigation_box Общий контейнер
|
|
|
|
|
|
|
|
extract($containers);
|
|
|
|
|
|
|
|
// index.php?id=8&doc=catalog&apage={s}
|
|
|
|
|
|
|
|
// Первая
|
|
|
|
if ($total_pages > 5 && $curent_page > 3)
|
|
|
|
{
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, 1, $pagination_start_label);
|
|
|
|
|
|
|
|
$first = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $pagination_start_label, str_replace(array('&'. $type .'={s}', '&' . $type .'={s}', '/' . $type . '-{s}'), '', $first)));
|
|
|
|
|
|
|
|
// Если есть шаблон метки о наличии страниц, добавляем
|
|
|
|
if ($pagination_separator_label != '')
|
|
|
|
$pagination .= sprintf($pagination_separator_box, $pagination_separator_label);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Предыдущая
|
|
|
|
if ($curent_page > 1)
|
|
|
|
{
|
|
|
|
// Если равна 2
|
|
|
|
if ($curent_page - 1 == 1)
|
|
|
|
{
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $curent_page-1, $pagination_prev_label);
|
|
|
|
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_prev_label, str_replace(array('&' . $type . '={s}', '&' . $type . '={s}', '/' . $type . '-{s}'), '', $link)));
|
|
|
|
}
|
|
|
|
// Если больше 2х
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $curent_page - 1, $pagination_prev_label);
|
|
|
|
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_prev_label, str_replace('{s}', ($curent_page - 1), $link)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($pages as $page)
|
|
|
|
{
|
|
|
|
if ($page >= 1 && $page <= $total_pages)
|
|
|
|
{
|
|
|
|
// Текущий номер страницы (активная страница)
|
|
|
|
if ($curent_page == $page && $curent_page != 1)
|
|
|
|
{
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $curent_page, $curent_page);
|
|
|
|
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_active_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_active_link_box, str_replace('{s}', ($curent_page), $link));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Страница номер 1
|
|
|
|
if ($page == 1)
|
|
|
|
{
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $page, $page);
|
|
|
|
|
|
|
|
if ($curent_page != 1) {
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $page, str_replace(array('&' . $type . '={s}', '&' . $type . '={s}', '/' . $type . '-{s}'), '', $link)));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_active_template);
|
|
|
|
$pagination .= sprintf($pagination_active_link_box, str_replace(array('{s}', '{t}'), $page, str_replace(array('&' . $type . '={s}', '&' . $type . '={s}', '/' . $type . '-{s}'), '', $link)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Остальные неактивные номера страниц
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $page, $page);
|
|
|
|
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $page, $link));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Следующая
|
|
|
|
if ($curent_page < $total_pages)
|
|
|
|
{
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $curent_page + 1, $pagination_next_label);
|
|
|
|
|
|
|
|
$link = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_next_label, str_replace('{s}', ($curent_page + 1), $link)));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Последняя
|
|
|
|
if ($total_pages > 5 && ($curent_page < $total_pages - 2))
|
|
|
|
{
|
|
|
|
// Если есть шаблон метки о наличии страниц, добавляем
|
|
|
|
if ($pagination_separator_label != '')
|
|
|
|
$pagination .= sprintf($pagination_separator_box, $pagination_separator_label);
|
|
|
|
|
|
|
|
$search = array('[link]', '[page]', '[name]');
|
|
|
|
$replace = array($template_label, $total_pages, $pagination_end_label);
|
|
|
|
|
|
|
|
$last = str_replace($search, $replace, $pagination_link_template);
|
|
|
|
|
|
|
|
$pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_end_label, str_replace('{s}', $total_pages, $last)));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Общий контейнер
|
|
|
|
if ($pagination != '')
|
|
|
|
{
|
|
|
|
// Если пришел внешний контейнер для
|
|
|
|
if ($pagination_box_ext != '')
|
|
|
|
$pagination = sprintf($pagination_box_ext, $pagination);
|
|
|
|
else if ($pagination_box != '')
|
|
|
|
$pagination = sprintf($pagination_box, $pagination);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $pagination;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Текущая страница
|
|
|
|
*
|
|
|
|
* @param string $type тип постраничной навигации,
|
|
|
|
* допустимые значения: page, apage, artpage
|
|
|
|
* @return int номер текущей страницы
|
|
|
|
*/
|
|
|
|
public static function getCurrentPage($type = 'page')
|
|
|
|
{
|
|
|
|
if (! in_array($type, array('page', 'apage', 'artpage')))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
$page = (isset($_REQUEST[$type]) && is_numeric($_REQUEST[$type]))
|
|
|
|
? $_REQUEST[$type]
|
|
|
|
: 1;
|
|
|
|
|
|
|
|
return (int)$page;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Достаем всю информацию о данной пагинации
|
|
|
|
*
|
|
|
|
* @param int $id id постраничной навигации
|
|
|
|
* @return array информация
|
|
|
|
*/
|
|
|
|
public static function getContainers($id)
|
|
|
|
{
|
|
|
|
global $AVE_DB;
|
|
|
|
|
|
|
|
$containers = $AVE_DB->Query("
|
|
|
|
SELECT
|
|
|
|
# PAGINATION = $id
|
|
|
|
*
|
|
|
|
FROM
|
|
|
|
" . PREFIX . "_paginations
|
|
|
|
WHERE
|
|
|
|
id = '" . $id . "'
|
|
|
|
", -1, 'paginations', true, '.paginations')->FetchAssocArray();
|
|
|
|
|
|
|
|
return $containers;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Очистка кеша постраничной навигации
|
|
|
|
*
|
|
|
|
* @param void
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public static function clearCache()
|
|
|
|
{
|
|
|
|
global $AVE_DB;
|
|
|
|
|
|
|
|
$AVE_DB->clearCache('paginations');
|
|
|
|
}
|
|
|
|
}
|