Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Постраничная навигация
 
 автор: bigpit   (01.02.2012 в 20:22)   письмо автору
 
 

Подскажите пожалуйста как вывести все страницы а не только шесть? спасибо...

        /*Код постраничной навигации*/    
$result77 = mysql_query("SELECT str FROM options_index", $db);
$myrow77 = mysql_fetch_array($result77);
$num = $myrow77["str"];
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result00 = mysql_query("SELECT COUNT(*) FROM data WHERE secret=0");
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total =  intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
  if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start  

Error_Reporting(E_ALL & ~E_NOTICE);
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href=new.php?new='.$new.'&page=1>Первая</a> | <a href=new.php?new='.$index.'&page='. ($page - 1) .'>Предыдущая</a> | ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' | <a href=new.php?new='.$index.'&page='. ($page + 1) .'>Следушая</a> | <a href=new.php?new='.$index.'&page=' .$total. '>Последняя</a>';

// Находим две ближайшие станицы с обоих краев, если они есть

if($page - 5 > 0) $page5left = ' <a href=new.php?new='.$new.'&page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=new.php?new='.$new.'&page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=new.php?new='.$new.'&page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=new.php?new='.$new.'&page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=new.php?new='.$new.'&page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';


if($page + 5 <= $total) $page5right = ' | <a href=new.php?new='.$new.'&page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $total) $page4right = ' | <a href=new.php?new='.$new.'&page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $total) $page3right = ' | <a href=new.php?new='.$new.'&page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $total) $page2right = ' | <a href=new.php?new='.$new.'&page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href=new.php?new='.$new.'&page='. ($page + 1) .'>'. ($page + 1) .'</a>';

// Вывод меню если страниц больше одной

if ($total > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pstrnav\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;
echo "</div>";
}   

  Ответить  
 
 автор: ladan   (01.02.2012 в 22:05)   письмо автору
 
   для: bigpit   (01.02.2012 в 20:22)
 

если всё выводить, то постраничная навигация не нужна

  Ответить  
 
 автор: Valick   (01.02.2012 в 23:13)   письмо автору
 
   для: ladan   (01.02.2012 в 22:05)
 

я тоже сначала ответил так, но потом догадался что речь не о числе блоков на страницу, а о самих страницах которые внизу отображаются ссылками

  Ответить  
 
 автор: DDK   (02.02.2012 в 00:56)   письмо автору
 
   для: bigpit   (01.02.2012 в 20:22)
 

Делюсь готовым классом:

class.pagination.php:

<?
    
class pagination {
        
        var 
$coreclass;
        
        public 
$step 20;
        public 
$start 0;
        public 
$total_items;
        public 
$on_this_page;
        
        function 
__construct() {
            
        }

        public function 
init$total_items$step=20 )
        {
            
$this->total_items $total_items;
            
            
$showall = ( isset($_GET['page']) && $_GET['page'] == 'showall' && $this->total_items 1000 ) ? true false;
            
            
$this->step $step
            
            
$stages 3;
            
            
$this->current_page = ( isset($_GET['page']) && (int) $_GET['page'] > ) ? (int) $_GET['page'] : 1;
            
            if(
$this->current_page)
            {
                
$this->start = ($this->current_page 1) * $this->step
            } else {
                
$this->start 0;    
            }
            
            
$this->on_this_page = ( $this->start $this->step $this->total_items ) ? $this->total_items $this->start $this->step;
            
            
// Initial page num setup
            
if ($this->current_page == 0){$this->current_page 1;}
            
$prev $this->current_page 1;    
            
$next $this->current_page 1;                            
            
$lastpage ceil($this->total_items/$this->step);        
            
$LastPagem1 $lastpage 1;

            if( 
$showall $this->on_this_page $this->total_items;
            
            
            
$paginate '<div class="paginate"><span class="desc">Показано записей: ' $this->on_this_page ' из ' $this->total_items '</span>';
            
$targetpage $this->buildQueryString( array('page') );
            
            if(
$lastpage 1)
            {    
            
                
// Previous
                
if ($this->current_page 1){
                    
$paginate.= "<a href='$targetpage&page=$prev'>&larr; назад</a>";
                } 
                else
                {
                    
$paginate.= "<span class='disabled'>&larr; назад</span>";    
                }
                    
                
// Pages    
                
if ($lastpage + ($stages 2))    // Not enough pages to breaking it up
                
{    
                    for (
$counter 1$counter <= $lastpage$counter++)
                    {
                        if (
$counter == $this->current_page && !$showall){
                            
$paginate.= "<span class='current'>$counter</span>";
                        }else{
                            
$paginate.= "<a href='$targetpage&page=$counter'>$counter</a>";}                    
                    }
                }
                elseif(
$lastpage + ($stages 2))    // Enough pages to hide a few?
                
{
                    
// Beginning only hide later pages
                    
if($this->current_page + ($stages 2))        
                    {
                        for (
$counter 1$counter + ($stages 2); $counter++)
                        {
                            if (
$counter == $this->current_page && !$showall){
                                
$paginate.= "<span class='current'>$counter</span>";
                            }else{
                                
$paginate.= "<a href='$targetpage&page=$counter'>$counter</a>";}                    
                        }
                        
$paginate.= "...";
                        
$paginate.= "<a href='$targetpage&page=$LastPagem1'>$LastPagem1</a>";
                        
$paginate.= "<a href='$targetpage&page=$lastpage'>$lastpage</a>";        
                    }
                    
// Middle hide some front and some back
                    
elseif($lastpage - ($stages 2) > $this->current_page && $this->current_page > ($stages 2))
                    {
                        
$paginate.= "<a href='$targetpage&page=1'>1</a>";
                        
$paginate.= "<a href='$targetpage&page=2'>2</a>";
                        
$paginate.= "...";
                        for (
$counter $this->current_page $stages$counter <= $this->current_page $stages$counter++)
                        {
                            if (
$counter == $this->current_page && !$showall){
                                
$paginate.= "<span class='current'>$counter</span>";
                            }else{
                                
$paginate.= "<a href='$targetpage&page=$counter'>$counter</a>";}                    
                        }
                        
$paginate.= "...";
                        
$paginate.= "<a href='$targetpage&page=$LastPagem1'>$LastPagem1</a>";
                        
$paginate.= "<a href='$targetpage&page=$lastpage'>$lastpage</a>";        
                    }
                    
// End only hide early pages
                    
else
                    {
                        
$paginate.= "<a href='$targetpage&page=1'>1</a>";
                        
$paginate.= "<a href='$targetpage&page=2'>2</a>";
                        
$paginate.= "...";
                        for (
$counter $lastpage - (+ ($stages 2)); $counter <= $lastpage$counter++)
                        {
                            if (
$counter == $this->current_page && !$showall){
                                
$paginate.= "<span class='current'>$counter</span>";
                            }else{
                                
$paginate.= "<a href='$targetpage&page=$counter'>$counter</a>";}                    
                        }
                    }
                }
                
                if(  
$this->total_items 1000 )
                {
                    if( 
$showall )
                    {
                        
$paginate.= "<span class='current'>ВСЕ</span>";
                    }
                    else
                    {
                        
$paginate.= "<a href='$targetpage&page=showall'>ВСЕ</a>";
                    }
                }
                
                
// Next
                
if ($this->current_page $counter 1){ 
                    
$paginate.= "<a href='$targetpage&page=$next'>далее &rarr;</a>";
                }
                else 
                {
                    
$paginate.= "<span class='disabled'>далее &rarr;</span>";
                }
                    
                
            }
            
$paginate.= "</div>";
            
            if( 
$showall $this->step $this->total_items;
            
            return array(
                
'html' => $paginate
                
'on_this_page' => $this->on_this_page,
                
'total_items' => $this->total_items
            
);
        }
        
        private function 
buildQueryString$remove_params=array(), $add_params=array() )
        {
            
$qs $_GET;
            foreach( 
$remove_params as $rp ) unset($qs[$rp]); 
            
$qs array_merge($qs$add_params);
            
            foreach(
$qs as $key => $val$qsr[] = $key '=' urlencode($val);
            
$qsr = ( isset($qsr) && count($qsr) ) ? '?'.implode('&'$qsr) : '';

            return 
$_SERVER['SCRIPT_NAME'] . $qsr;
        }
    
    }

?>




Использование простое.

Пример:

<?
    
require( 'class.pagination.php');
    
$paginationClass = new pagination;
                
    
    
$total_items_count mysql_query("SELECT count(*) as num FROM table");
    
$total_items_count mysql_fetch_assoc($total_items_count);
    
$total_items_count $total_items_count['num'];
    
    
$pagination_html $paginationClass->init$total_items_count30 );
            
    
$q mysql_query("SELECT count(*) as num FROM table LIMIT " $paginationClass->start ", " $paginationClass->step ";");        
    
    ...
?>



Пример CSS:

/* Pagination */

.paginate {
    padding: 3px 0px;
    margin: 3px 0px;
    float: right;
}

.paginate .desc {
    color: gray;
    padding: 5px 5px;
}

.paginate a {
    background-color: #f5f5f5;
    padding:2px 5px 2px 5px;
    margin:2px;
    border:1px solid #999;
    text-decoration:none;
    color: #666;
}
.paginate a:hover, .paginate a:active {
    border: 1px solid #999;
    color: #000;
}
.paginate span.current {
    margin: 2px;
    padding: 2px 5px 2px 5px;
    border: 1px solid #999;
    font-weight: bold;
    background-color: #999;
    color: #FFF;
}
.paginate span.disabled {
    padding:2px 5px 2px 5px;
    margin:2px;
    border:1px solid #eee;
    color:#DDD;
}

  Ответить  
 
 автор: DDK   (02.02.2012 в 00:57)   письмо автору
 
   для: DDK   (02.02.2012 в 00:56)
 

Тут проверка отключает кнопку "ВСЕ", если общее количество записей больше 1000, проверку эту можно убрать при желании:


...
                if(  $this->total_items < 1000 ) 
                { 
                    if( $showall ) 
                    { 
                        $paginate.= "<span class='current'>ВСЕ</span>"; 
                    } 
                    else 
                    { 
                        $paginate.= "<a href='$targetpage&page=showall'>ВСЕ</a>"; 
                    } 
                }
...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования