<?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'); } }