Когда то, очень давно, когда динозавры были большими, а телевизоров ещё не было

... в общем делал я это как то так:
HTMLКод:
<div id="page-navigation">
<?php $objPaginator = new Paginator; $objBase = new $Base; ?>
<span class="pages">Страница <?php echo $objBase->leaf; ?> из <?php echo $objPaginator::countPages( $objBase->newsInStart, 'publish' ); ?></span>
<?php $objPaginator::printLinks($objBase->leaf, $objBase->newsInStart, 'publish'); ?>
</div>
Класс BaseКод:
class Base {
// ...
// текущая страница на сайте
public $leaf;
// Новости
public $postNews = array();
// Количество новостей на главной
public $newsInStart;
// с какой строки начинаем выборку из БД
private $currStrDB = 0;
// ...
// Конструктор класса
public function __construct() {
// Берём с БД настройку отвечающую за кол-во статей на главной странице
$this->newsInStart = ( int )Options::getOptionValue( 'news_in_start' );
// ...
}
public function init( ) {
if( $this->leaf = isset( $_GET['leaf'] ) ? $_GET['leaf'] : 1){
if( is_numeric( $this->leaf ) ){
if( ( int )$this->leaf < 1 )
$this->leaf = 1;
elseif( ( ( int )$this->leaf ) > ( Posts::countPosts( 'publish' ) ) ){
$this->leaf = 1;
header( "Status: 404 Not Found" );
}
}
else{
$this->leaf = 1;
header( "Status: 404 Not Found" );
}
$this->currStrDB = ceil( $this->newsInStart * ( $this->leaf-1 ) );
$this->postNews = Posts::getPostAll( 'publish', $this->currStrDB, $this->newsInStart );
}
// ...
Класс PostsКод:
class Posts {
// ...
public static function getPostAll( $published = '', $from, $limit ) {
if( $published == 'publish' || $published == 'pending' ) {
if( $limit != 0 )
$sql = "SELECT * FROM `ant_posts` WHERE `post_status` = ? ORDER BY `post_date` DESC LIMIT " . $from . ", " .$limit;
else
$sql = "SELECT * FROM `ant_posts` WHERE `post_status` = ? ORDER BY `post_date` DESC";
return DatabaseHandler::GetAll( $sql, array( $published ) );
}
else {
$sql = "SELECT * FROM `ant_posts` ORDER BY `post_date` DESC";
return DatabaseHandler::GetAll( $sql );
}
}
// ...
public static function countPosts( $status = null ) {
$result = null;
try {
$sql = "SELECT COUNT(*) FROM `ant_posts`";
if( $status )
$sql .= " WHERE `post_status` = ?";
$result = DatabaseHandler::GetOne( $sql, array( $status ) );
}
catch ( Exception $e ) {
trigger_error( $e->getMessage(), E_USER_ERROR );
}
return $result;
}
Класс Paginator Код:
class Paginator {
// общее кол-во ссылок
const MAX_LINKS = 10;
// ...
public static function countPages( $ppp, $status = null ) {
$result = null;
try {
$result = ceil( Posts::countPosts( $status ) / $ppp );
}
catch ( Exception $e ) {
trigger_error( $e->getMessage(), E_USER_ERROR );
}
return $result;
}
public static function printLinks( $current_page, $ppp, $status = null ) {
$result = null;
// общее кол-во ссылок
$all_pages = self::countPages( $ppp, $status );
// с какой цифры начать построение ссылок на страницы
$start = 1;
// сколько раз проводить итерацию цикла по обходу страниц
$final = ( $all_pages < self::MAX_LINKS ) ? $all_pages : self::MAX_LINKS;
try {
// если общее кол-во страниц > 1
if( $all_pages > 1 ) {
if( $all_pages > 10 ) {
if( $current_page > self::MAX_LINKS ) {
$start = ( $current_page - self::MAX_LINKS ) + 1;
$result .= '<a class="nextpostslink" href="/?leaf=' . ( $start - 1 ) . '">«</a>';
}
else
$start = 1;
}
for( $i = $start; $i < ( $final + $start ); $i++ ) {
// если это текущая страница
if( $current_page == $i )
$result .= '<span class="current">' . $i . '</span>';
// если это не текущая страница
else {
$result .= '<a class="page" href="/?leaf=' . $i . '">' . $i . '</a>';
}
}
// ссылка далее
if( $all_pages > ( $i -1 ) )
$result .= '<a class="nextpostslink" href="/?leaf=' . $i . '">»</a>';
}
// если общее кол-во страниц = 1
else
$result .= '<span class="current">' . $all_pages . '</span>';
}
catch ( Exception $e ) {
trigger_error( $e->getMessage(), E_USER_ERROR );
}
return $result;
}
}
Получалось что то вроде того, что на скриншоте. См. атачмент