mirror of
https://github.com/avecms/AVE.cms.git
synced 2025-01-22 07:20:07 +00:00
256 lines
9.4 KiB
PHP
Executable File
256 lines
9.4 KiB
PHP
Executable File
<?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');
|
||
}
|
||
} |