постраничная навигация

Discussion in 'PHP' started by попугай, 7 Dec 2009.

  1. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,515
    Likes Received:
    400
    Reputations:
    196
    Как реализовать постраничную навигацию на php в две стороны

    то есть, в зависимости от текущей страницы выводить ссылки на 4 предыдущих и 4 следующих страницы. А если текущая страница не позволяет вывести 4 страницы предыдущих или следующих - то вывести недостающие с противоположного направления.

    В общем как в DLE. (Пример сайта http://dle-news.ru/page/8/ - навигация внизу.)

    Смотрел код - но там слишком мудрено как-то.
     
  2. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    http://www.tigir.com/paging.htm
    Вот навоял для ДЛЕ, выводит по 2 новости на страницу, точнее выводит только колонку short_story ибо у меня база ДЛЕ была пустая.

    PHP:
    <?php
    require('paging.inc.php');
    $_DB = new mysqli('localhost','root','','dle');
    $_PAGING = new Paging($_DB);
    $_PAGING->set_page_size(2);

    $r $_PAGING->get_page'SELECT * FROM dle_post' ); 
    while(
    $row $r->fetch_assoc())
    {
    echo 
    $row['short_story'].'<br>';
    }

    echo 
    $_PAGING->get_result_text().' объявлений<br>';
    echo 
    'Страницы: '.$_PAGING->get_prev_page_link().' '.$_PAGING->get_next_page_link().'<br /><br />';
    echo 
    $_PAGING->get_page_links();
    ?>
    Вот сам класс:
    PHP:
    <?php
    class Paging {

    private 
    $page_size 10;
    private 
    $link_padding 10;
    private 
    $page_link_separator ' ';
    private 
    $next_page_text 'следующая →';
    private 
    $prev_page_text '← предыдущая';
    private 
    $result_text_pattern 'Показано с %s по %s из %s';
    private 
    $page_var 'p';

    private 
    $db;
    private 
    $q;
    private 
    $total_rows;
    private 
    $total_pages;
    private 
    $cur_page;

    public function 
    __construct($db$q=''$page_var='p')
    {
        
    $this->db $db;
        if (
    $q$this->set_query($q);
        
    $this->page_var $page_var;
        
    $this->cur_page = isset($_GET[$this->page_var]) && (int)$_GET[$this->page_var] > ? (int)$_GET[$this->page_var] : 1;
    }

    public function 
    set_query($q)
    {
        
    $this->$q;
    }

    public function 
    set_page_size($page_size)
    {
        
    $this->page_size abs((int)$page_size);
    }

    public function 
    set_link_padding($padding)
    {
        
    $this->link_padding abs((int)$padding);
    }

    public function 
    get_page($q='')
    {
        if (
    $q$this->set_query($q);

        
    $r $this->db->query$this->query_paging($this->q) );
        
    $this->total_rows array_pop($this->db->query('SELECT FOUND_ROWS()')->fetch_row());

        if (
    $this->page_size !== 0$this->total_pages ceil($this->total_rows/$this->page_size);
        
        if (
    $this->cur_page $this->total_pages)
        {
            
    $this->cur_page $this->total_pages;
            if ( 
    $this->total_pages $r $this->db->query$this->query_paging($this->q) );
        }
        
        return 
    $r;
    }

    public function 
    get_result_text()
    {
        
    $start = (($this->cur_page-1) * $this->page_size)+1;
        
    $end = (($start-1+$this->page_size) >= $this->total_rows)? $this->total_rows:($start-1+$this->page_size);

        return 
    sprintf($this->result_text_pattern$start$end$this->total_rows);
    }

    public function 
    get_page_links()
    {
        if ( !isset(
    $this->total_pages) ) return '';

        
    $page_link_list = array();

        
    $start $this->cur_page $this->link_padding;
        if ( 
    $start $start 1;
        
    $end $this->cur_page $this->link_padding-1;
        if ( 
    $end $this->total_pages $end $this->total_pages;

        if ( 
    $start )  $page_link_list[] = $this->get_page_link$start-1$start '...' '' );
        for (
    $i=$start$i <= $end$i++)  $page_link_list[] = $this->get_page_link$i );
        if ( 
    $end $this->total_pages $page_link_list[] = $this->get_page_link$end +1$end == $this->total_pages '' '...' );
        if ( 
    $end <= $this->total_pages $page_link_list[] = $this->get_page_link$this->total_pages );

        return 
    implode($this->page_link_separator$page_link_list);
    }

    public function 
    get_next_page_link()
    {
        return isset(
    $this->total_pages) && $this->cur_page $this->total_pages $this->get_page_link$this->cur_page 1$this->next_page_text ) : '';
    }

    public function 
    get_prev_page_link()
    {
        return isset(
    $this->total_pages) && $this->cur_page $this->get_page_link$this->cur_page 1$this->prev_page_text ) : '';
    }

    private function 
    get_page_link($page$text='')
    {
        if (!
    $text)    $text $page;

        if (
    $page != $this->cur_page)
        {
            
    $reg '/((&|^)'.$this->page_var.'=)[^&#]*/';
            
    $url '?'.( preg_match$reg$_SERVER['QUERY_STRING'] ) ? preg_replace($reg'${1}'.$page$_SERVER['QUERY_STRING']) : ( $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'].'&' '' ).$this->page_var.'='.$page);
            return 
    '<a href="'.$url.'">'.$text.'</a>';
        }
        return 
    '<span>'.$text.'</span>';
    }

    private function 
    query_paging()
    {
        
    $q $this->q;

        if (
    $this->page_size != 0)
        {
            
    //calculate the starting row
            
    $start = ($this->cur_page-1) * $this->page_size;
            
    //insert SQL_CALC_FOUND_ROWS and add the LIMIT
            
    $q preg_replace('/^SELECT\s+/i''SELECT SQL_CALC_FOUND_ROWS '$this->q)." LIMIT {$start},{$this->page_size}";
        }

        return 
    $q;
    }
    }
    ?>
     
    _________________________
  3. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    800
    Likes Received:
    145
    Reputations:
    73
    Думаю этот будет по понятней...
    Результат:
    [​IMG]
    PHP:
    <?php
    //-------- подключаемся к Бд --------
    $dblocation "localhost"
    $dbname "lessons"
    $dbuser "root"
    $dbpasswd "toor"

    mysql_connect($dblocation,$dbuser,$dbpasswd); 
    mysql_select_db($dbname);
    //---------- Выводим данные БД ------------
    echo "<center>"//Делаем вывод по центру
    $cpage intval($_GET['page']); //Переводим параметр в числовой
    $cpage $cpage $cpage intval($_GET['page']); //избавляемся от возможных отрицательных значений, ща утро и бошка не варит, вроде была стндрт. функция
    $onpage 5//Сколько выводит на страницу
    $form $cpage $onpage//Вычисляем по формуле (Тек. страницу * на количество выводимых строк на страницу) получаем число для запроса к БД

    $result mysql_query("SELECT * FROM pages ORDER BY id DESC LIMIT $form,$onpage"); //Запрашиваем результат в обратном порядке (начиная со старшего id
    while($rowmysql_fetch_row($result)) 
        {
        echo 
    "[".$row[0]."] ".$row[1]."<br>"
        }
    //------------- Выводим ярлыки навигации -----------------------------------------
    $cnt mysql_query("SELECT count(id) FROM pages"); //определяем количество записей в таблице для составления ссылок
    $res mysql_fetch_row($cnt);
    $total floor($res[0]/$onpage); //Также вычисляем сколько у нас будет ссылок

    echo $total && $cpage "<a href='pages.php?page=0'><small>1</small></a>... " ''//Тут если ссылок больше 4 и текущая страница старше 4 рисуем ссылку для самой первой страницы
    for($i=$cpage-4;$i<$cpage+5;$i++) { //Тут как ты просил по 4 с каждой стороны от текуще страницы
    $out $i 1;
    if(
    $out == $cpage+1$out "[<big>$out</big>]";
    echo 
    $i || $i $total '' "<a href='pages.php?page=$i'>$out</a> ";
    }
    echo 
    $total && $cpage $total && $cpage != $total " ...<a href='pages.php?page=$total'><small>".($total+1)."</small></a>" ''//Тут если ссылок больше 4 и текущая страница младше чем на 4 страницы от самой старшей - рисуем ссылку для самой последней страницы
    ?>  
     
    1 person likes this.
  4. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,515
    Likes Received:
    400
    Reputations:
    196
    Для b3
    Спасибо. Не совсем то.

    Я хочу для своего скрипта сделать навигацию как в DLE.

    PHP:
    set_time_limit(0);
    $text file_get_contents('text.txt');
    $data file('data.txt');

    $urls = array();

    for(
    $i=0$i<count($data); $i++){
    $urls[$i] = ($i 0) ? '<a href="' $i '.html">' $data[$i] . '</a>' '<a href="index.html">' $data[$i] . '</a>';
    }

            for(
    $i=0$i<count($data); $i++){
                
    $prev = ($i 0) ? $urls[$i 1] : 'Предыдущая страница';
                
    $next = ($i < (count($data) - 1)) ? $urls[$i 1] : 'Далее';

                
    //$pages    как сделать ссылки на  4 предыдущих и 4 следующих страницы..... как в DLE ?
                
                    
    $out '<title>' $data[$i] . '</title>';
                    
    $out .= '<p>' $text '</p><br>';
                    
    $out .= $prev ' | | ' $pages ' | | ' $next// $pages - ссылки наигации 
                    
    ($i 0) ? file_put_contents('folder/' $i '.html'$out) : file_put_contents('folder/index.html'$out);
                    unset(
    $out);
            }
     
  5. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    800
    Likes Received:
    145
    Reputations:
    73
    Что хранится в text.txt и data.txt?
     
  6. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,515
    Likes Received:
    400
    Reputations:
    196
    LStr1ke, ага спасибо щас посмотрю. Под свои нужды подкручу.

    в text.txt - любой текст (просто для удобства)
    а в data.txt - названия страниц, заголовки.


    LStr1ke, все классно. Спасибо за помощь :) :)
     
    #6 попугай, 7 Dec 2009
    Last edited: 7 Dec 2009