* Author: Ondrej Nespor * ------------------------------------------------------------- */ function smarty_function_pagination($params, &$smarty) { $container = empty($params['container']) ? '' : $params['container'] ; // Overall pagination container $displayinactiverulers = !isset($params['displayinactiverulers']) ? true : $params['displayinactiverulers']; $displayrulers = !isset($params['displayrulers']) ? true : $params['displayrulers']; $count = empty($params['count']) ? 20 : $params['count'] ; // Number of items per page $total = empty($params['total']) ? 0 : $params['total'] ; // Number of total items $url = empty($params['url']) ? '/' : $params['url'] ; // url to prepend to all anchors $linkparam = empty($params['linkparam']) ? 'page=%d' : $params['linkparam'] ; //string with page param for sprintf. // Alter the linkparam parameter - prepend "?" if there are no other GET parameters, ampersand entity otherwise $linkparam = (strpos($url, '?') === false ? '?' : '&') . $linkparam; $displaysinglepage = !isset($params['displaysinglepage']) ? false : $params['displaysinglepage']; // display pagination although there is only one page of items $pageCount = ceil($total/$count); // number of last page; if ($total == 0) return; // no items - nothing to page if ($pageCount == 1 && !$displaysinglepage) return; // if there is only one page don't display pagination if not explicitly required $page = (!isset($params['page']) || $params['page'] <= 0 || $params['page'] > $pageCount) ? 1 : $params['page'] ; // Page number $firstText = empty($params['firstText']) ? '«« ' : $params['firstText'] ; // "First" text $prevText = empty($params['prevText']) ? '«' : $params['prevText'] ; // "Previous" text $nextText = empty($params['nextText']) ? '»' : $params['nextText'] ; // "Next" text $lastText = empty($params['lastText']) ? '»»' : $params['lastText'] ; // "Last text $separator = empty($params['separator']) ? ' | ' . "\n" : $params['separator'] . "\n" ; // item separator $outputStyle = empty($params['output']) ? 'page' : (in_array($params['output'], array('page', 'item')) ? $params['output'] : $smarty->trigger_error("pagination: 'output' parameter must be 'page' or 'item'")); // Style of outputting items. Either 'page' (1, 2, 3) or 'item' (1-20, 21-40, 41-60) $ommit = (isset($params['ommit']) && $params['ommit'] != 'no') ? true : false; // Ommit Offsets are numbers, that limit omitting of pages using // difference between current page and returned page. // Below lowOmmitOffset, every page is displayed. // Between low and middle, every 5th page is displayed // Between middle and high, every 10th page is displayed // Above high, every 50th page is displayed // First and last page are displayed every time $lowOmmitOffset = empty($params['lowOmmitOffset']) ? 3 : (is_numeric($params['lowOmmitOffset']) ? $params['lowOmmitOffset'] : $smarty->trigger_error("pagination: 'lowOmmitOffset' parameter must be numeric")); $middleOmmitOffset = empty($params['middleOmmitOffset']) ? 7 : (is_numeric($params['middleOmmitOffset']) ? $params['middleOmmitOffset'] : $smarty->trigger_error("pagination: 'middleOmmitOffset' parameter must be numeric")); $highOmmitOffset = empty($params['highOmmitOffset']) ? 50 : (is_numeric($params['highOmmitOffset']) ? $params['highOmmitOffset'] : $smarty->trigger_error("pagination: 'hihgOmmitOffset' parameter must be numeric")); $return = ''; if ($displayrulers && ($displayinactiverulers || $page != 1)) { $return .= smarty_function_pagination_url($url, $firstText, 1, $page == 1); $return .= $separator; if ($page == 2) { $return .= smarty_function_pagination_url($url, $prevText, 1, $page == 1); } else { $return .= smarty_function_pagination_url($url . sprintf($linkparam, ($page - 1)), $prevText, 1, $page == 1); } $return .= $separator; } for ($i = 1; $i <= $pageCount; $i++) { switch ($outputStyle) { case 'item': if ($i == $pageCount) { $max = $total; } else { $max = (string)(($i) * $count); } $text = (string)(($i - 1) * $count + 1). '-' . $max; break; case 'page': // fallthrough default: $text = (string)$i; break; } if (($i > $page + $lowOmmitOffset || $i < $page - $lowOmmitOffset) && $i != 1 && $i != $pageCount && $ommit) { $offset = (abs($page - $i) < $middleOmmitOffset) ? 5 : ((abs($page - $i) > $highOmmitOffset) ? 50 : 10) ; if ($i % $offset == 0) { $return .= smarty_function_pagination_url($url . sprintf($linkparam, $i), $text, $i, $page == $i); } } else { if ($i == 1) { $return .= smarty_function_pagination_url($url, $text, $i, $page == $i); } else { $return .= smarty_function_pagination_url($url . sprintf($linkparam, $i), $text, $i, $page == $i); } } if ($i < $pageCount) { $return .= $separator; } } if ($displayrulers && ($displayinactiverulers || $page != $pageCount)) { $return .= $separator; $return .= smarty_function_pagination_url($url . sprintf($linkparam, $page + 1), $nextText, $pageCount, $pageCount == $page); $return .= $separator; $return .= smarty_function_pagination_url($url . sprintf($linkparam, $pageCount), $lastText, $pageCount, $pageCount == $page); } return sprintf($container, $return); } function smarty_function_pagination_url($url, $text, $page, $current = false, $title = '') { if ($current) { return $text; } else { return ' ' . $text . ' '; } }