За последние 24 часа нас посетили 22426 программистов и 1056 роботов. Сейчас ищут 648 программистов ...

Постраничный вывод результатов (он же пейджер)

Тема в разделе "PHP для новичков", создана пользователем 440Hz, 16 авг 2007.

  1. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Код (PHP):
    1. <?php
    2.  
    3. /*
    4. * Пейджер
    5. *
    6. * @author 440hz <440hz@mail.ru>
    7. */
    8.  
    9. class IndigoPageBar extends IndigoAtom {
    10.  
    11.     function __construct($url,$num_rows,$page,$rows_on_page,$cols_on_bar=5) {
    12.  
    13.         $this->url            = $url            =    './?page=';    // урл вызова
    14.         $this->num_rows        = $num_rows        =    5;        // всего записей
    15.         $this->page            = $page            =    1;        // начальная страница
    16.         $this->rows_on_page    = $rows_on_page    =    5;        // записей на страницу
    17.         $this->cols_on_bar    = $cols_on_bar    =    5;        // циферок на пейджере
    18.  
    19.     }
    20.  
    21.  
    22.     /*
    23.     * Получить HTML
    24.     *
    25.     */
    26.     function GetHTML() {
    27.  
    28.         if(!isset($this->page)) $this->page = 1;
    29.  
    30.  
    31.         $html = "";
    32.  
    33.         // вычисляем страницу
    34.         $this->pages = intval($this->num_rows / $this->rows_on_page);
    35.  
    36.         // страница-то одна
    37.         // можем выдать пустую страку тогда пейджер не покажет ничего
    38.         if($this->pages == 0) 
    39.             return '<a href="'.$this->url.'1" class=pagesel>1</a>';
    40.  
    41.         // если записей на последние странице меньше чем надо
    42.         // увеличим страницы
    43.         if($this->pages * $this->rows_on_page < $this->num_rows) $this->pages++;
    44.  
    45.         // поправим размерность бара
    46.         if($this->pages < $this->cols_on_bar * 2 + 1)
    47.             $bar = intval($this->pages)-1;
    48.         else
    49.             $bar = $this->cols_on_bar;
    50.  
    51.         $this->page_left    = $this->page - $bar;
    52.         $this->page_right    = $this->page + $bar;
    53.  
    54.         if($this->page_left < 1) {
    55.             
    56.             $this->page_left = 1;
    57.             $this->page_right = $this->page_left + $bar * 2;
    58.         
    59.         }
    60.  
    61.         if($this->page_right > $this->pages) {
    62.             
    63.             $this->page_right = $this->pages;
    64.             $this->page_left = $this->page_right - $bar * 2;
    65.         
    66.             if($this->page_left < 1) 
    67.                 $this->page_left = 1;
    68.         }
    69.         
    70.         if($this->page_left != 1)
    71.             $html .= '<a href="'.$this->url.'1" class=pageurl>«</a>';
    72.         
    73.         for( $i = $this->page_left; $i <= $this->page_right ; $i++) {
    74.  
    75.             if( $i == $this->page )
    76.                 $html .= '<span class=pagesel>'.$i.'</span>';
    77.             else
    78.                 $html .= '<a href="'.$this->url.''.$i.'" class=pageurl>'.$i.'</a>';
    79.         }
    80.  
    81.         if($this->page_right != $this->pages)
    82.             $html .= '<a href="'.$this->url.''.$this->pages.'" class=pageurl>»</a>';
    83.  
    84.         return $html;
    85.     }
    86.  
    87.  
    88. }
    89.   
    90. ?>[/php]
    91.  
    92. пример использования:
    93.  
    94.  
    95. [php]<?
    96.  
    97. $newscount = <кол-во записей в таблице новостей>
    98. $page      = (int) <получить $page из параметров или другим способом>
    99. $rows      = 10; // на странице 10 новостей
    100.  
    101. // для LIMIT в SQL
    102. // SELECT * FROM `news` ORDER BY `dt` LIMIT $start,$rows;
    103.  
    104. $start = ($page-1) * $rows;
    105. if($start < 0 )$start = 0;
    106.  
    107. $pager = new IndigoPageBar('/news/?page=',$newscount,$page,$rows);
    108. $html  = $pager->GetHTML();
    109.  
    110. ...
    111.  
    112. echo $html;
    113.  
    114. ?>
    Код (Text):
    1. /* PAGER */
    2.  
    3.  
    4. .pageurl {
    5.     padding: 2px 5px 2px 5px;
    6.     font-family: Tahoma;
    7.     font-size: 9px;
    8. }
    9.  
    10. a.pageurl {
    11.     text-decoration: none;
    12.     color: black;
    13. }
    14.  
    15. a.pageurl:hover {
    16.     background-color: #FFAAAA;
    17.     color: white;
    18. }
    19.  
    20. a.pageurl:visited {
    21.     color: black;
    22. }
    23.  
    24. .pagesel {
    25.     text-decoration: none;
    26.     padding: 2px 5px 2px 5px;
    27.     background-color: #FFAAAA;
    28.     color: white;
    29.     font-family: Tahoma;
    30.     font-size: 9px;
    31. }
    32.  
    33. a.pagesel {
    34.     text-decoration: none;
    35.     padding: 2px 5px 2px 5px;
    36.     background-color: #FFAAAA;
    37.     color: white;
    38.     font-family: Tahoma;
    39.     font-size: 9px;
    40. }
    41.  
    42. a.pagesel:hover {
    43.     text-decoration: none;
    44.     color: white;
    45. }
    46.  
    47. a.pagesel:visited {
    48.     text-decoration: none;
    49.     color: white;
    50. }
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    и зачем было городить класс, ради одной функции?
     
    IAAWY нравится это.
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    потому как это часть большой системы
     
  4. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    не аргумент.

    чем это:
    Код (Text):
    1. $pager = new IndigoPageBar('/news/?page=',$newscount,$page,$rows);
    2. $html  = $pager->GetHTML();
    лучше этого:
    Код (Text):
    1. $html= indigoPageBar('/news/?page=',$newscount,$page,$rows);
    ?
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    старик, я не спорю на счет class vs func - э то бессмысленно. не нравится класс - перепиши на функцию.
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    проще с нуля переписать, чем исправлять такое чудо...
    ну вот почему было не написать вначале функции:
    Код (Text):
    1. $page_left= $this->page_left;
    и вообще, с какой целью ты выложил этот код? новички его не поймут, воспользоваться им не смогут...

    ps: ну да и неплохо было бы воспользоваться шаблоном для вывода...
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    вопросов мног. ответов ноль. надо же с чего-нить начинать.
    вот выложи свой пейджер?
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а толку от ответа, который только лишь увеличивает число вопросов?
     
  9. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    новички поймут. Я считаю себя новичком, но я все понял. И воспользуюсь им когда нужно будет. ;)
     
  10. Anonymous

    Anonymous Guest

    Хорошо приведенный код помогает спиз...позаимствовать из него хороший функционал. )
     
  11. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Горбунов Олег
    Функционал здесь, конечно, безграничный ;)
     
    twim32 нравится это.
  12. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    а функционал листалки какой считаем полезным? ))
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    полезно думать иногда...
     
  14. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ладно, не сумел объяснить мыслю и фик с ней.
     
  15. Anonymous

    Anonymous Guest

    ыы
     
  16. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    440Hz, приведённый код яркий пример принципа ООП ради ООП :)

    Именно в данном случае, при данной функциональности, необходимости в создании отдельно класса объектов ни с какой точки зрения небыло.

    ПС. У меня правда тоже генератор навигации в виде класса, но у меня это хоть функционалом оправдано.
     
  17. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    ONK

     
  18. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    DarkElf, поверь мне. это пустые слова :)
     
  19. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Вырезка из моего кода отвечающего за пейджер (без особого труда трансформируется в функцию):
    PHP:
    1. $limit = 30; // кол-во записей на страницу
    2.  
    3. //выясняем общее кол-во элементов
    4. $Query = "SELECT COUNT(*) FROM data_keys WHERE parent_id=$key_id";
    5. $arr = sql($Query); //это функция обработки запросов
    6. $total_records = $arr[0][0];
    7.  
    8. $sql_start=0;
    9. $navigator_string ="";
    10.  
    11. if ($total_records>$limit) {   
    12.     if ($_GET['st']<>"") {$sql_start=$_GET['st']-1;}
    13.     $request_str = $_SERVER["REQUEST_URI"];
    14.     $pattern = "/&st=\d{1,4}/i";
    15.     $tmp= ceil($total_records/$limit);
    16.     $navigator_string ="<span style='font-size:12px'>страницы: ";
    17.     for ($i=1;$i<=$tmp;$i++) {
    18.         $replacement = "&st=".(($i-1)*$limit+1);
    19.         $url = preg_replace($pattern, $replacement, $request_str);
    20.         if (!strpos($url,"&st=")) {$url .= $replacement;}
    21.         if ($sql_start==($i-1)*$limit) {           
    22.         $tmp_str = "<b>$i </b>";
    23.         } else {           
    24.         $tmp_str = "<a href='$url' style='font-size:12px'>$i </a>";    
    25.         }
    26.         $navigator_string .= $tmp_str;
    27.     }
    28.     $navigator_string .= "</span>";
    29. }
    30.  
    31.  
    32. //собственно запрос
    33. $Query = "SELECT * FROM data_keys WHERE parent_id=$key_id ORDER BY orders LIMIT $sql_start,$limit";
    34. $arr = sql($Query);
    35.  
    36. if (count($arr)):
    37. echo $navigator_string; // странички
    38.  
    39. // Вывод результатов
    40.  
    41. echo $navigator_string; // странички
    42. endif;
    43.  
    P.S. я новичек, т.ч. сильно не пинайте, любые рекомендации по оптимизации с удовольствием учту.
     
  20. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
  21. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Благодарю.
    Поправил! :)
     
  22. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    это ты к чему такое сказал?
     
  23. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    440Hz, к тому, что каким бы не был проект, никто не мешает использовать в нём процедурное программирование.
    Я не рассматриваю случаи, когда принципиально ставится задача ООП ради ООП, и начинают писать что-то типа class Integer{...} в попытке превратить ПХП в Java.
     
  24. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    но и не препятствует. нравится тебе функции - пиши, но не мешай другим идти своим путем.

    p.s. давай не начинат ь new func() vs func() ибо кому как...
     
  25. Arik

    Arik Активный пользователь

    С нами с:
    14 сен 2007
    Сообщения:
    66
    Симпатии:
    0
    У меня не работает(((((((((((((
    Вот что пишет:
    Fatal error: Class indigopagebar: Cannot inherit from undefined class indigoatom in z:\home\wold-info.ru\www\ini.php on line 73
    ??????
    Хочу себе моднявый пейджер =))