AVE.CMS v3.28
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.
 
 
 
 
 

253 lines
9.2 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&amp;doc=catalog&amp;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('&amp;'. $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('&amp;' . $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);
else
$link = str_replace($search, $replace, $pagination_link_active_template);
$pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $page, str_replace(array('&amp;' . $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');
}
}