mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
9.4 KiB
256 lines
9.4 KiB
<?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'); |
|
} |
|
} |