ave-cms/class/class.paginations.php
2018-05-16 23:14:07 +03:00

249 lines
9.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
$link = str_replace($search, $replace, $pagination_link_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');
}
}