Рейтинг@Mail.ru
 

Шаг 5

Ссылки

Всё, что мы сделали, конечно хорошо. Но использовать в боевых условиях этот скрипт вряд ли получится. Дело в том, что ссылки могут содержать еще и другие GET-параметры, а у нас там все занято. Кроме того, некоторые скрипты используют ЧПУ, а у нас обычный GET.
Нужно этот момент подработать.

Ну и за одно предусмотрим возможность изменять название GET переменной. Это пригодится, если потребуется вложенная пагинация. То есть мы сможем листать вложенные страницы.

Сделаем еще один метод, который будет генерировать корректные ссылки.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

/**
* Makes a hyperlink
* @param int $page
* @param string $link, $class
* @param bolean $active
* @access private
* @return string
*/      
  
private function createLink($page 1$link ''$class ''$active true)
  {              
      
// Формируем стартовые значения
        if(strpos($_SERVER['REQUEST_URI'], $this->LevelPage) === false)
            
$string $this->StartLink $page;
        else
        {             
      
// Определяем, используется ли ЧПУ и формируем параметры
            if(
$this->SetRewrite)
                
$string preg_replace('#'$this->LevelPage .'/\d+#'
                                            
$this->LevelPage .'/'$page
           
                                 $_SERVER['REQUEST_URI']);
            else
                
$string '?'preg_replace('#'$this->LevelPage .'=\d+#'
           
                                      $this->LevelPage .'='$page
           
                                      $_SERVER['QUERY_STRING']);      
       }
     

      
// Есть ли что то, отличное от номера ссылки
      
if(empty($link))
         
$link $page;
     
      
// Формируем ссылку 
      
if($active)
          return 
"<span class=\"IRB_paginator"$class ."\">\n"
               
"<a href=\""$string ."\" />"$link ."</a>\n</span>\n";
      else
          return 
"<span class=\"IRB_paginator"$class ."\"> "$link ." </span>\n"
  }


Тут нужно отметить, что если используется ЧПУ, то нужно будет изменить правила перенаправления. В нашем случае нужно добавить такое правило:
1
2
3
4
5

RewriteEngine    on 

RewriteRule ^page/([0-9]+)$ index.php?page=$1

и тогда можно делать ссылки плана http://site.ru/page/1

Теперь изменим метод формирования меню:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

/**
* Generates the navigation menu     
* @access private
* @param string $link
* @return string
*/    
    
function createMenu($rewrite false$level '')
    {   
        if(!empty(
$level))
            
$this->LevelPage $level;
            
        
$this->SetRewrite $rewrite;    
        
        
$this->StartLink $rewrite $this->LevelPage .'/' '?'$this->LevelPage .'=';
            
        
$count ceil($this->TableTotal $this->NumRows $this->NumColumns);
        
$menu "\n<!-- IRB_Paginator begin -->\n";
        
        
// Если страниц меньше 13, оставляем все по дефолту.
        
if($count 13)
        {          
            
$i 1;    
            
$cnt $count;            
        }
        else
        {

       
// Стрелочка на 10 влево
            
if($this->NumPage 10)
                
$menu .= $this->createLink(($this->NumPage 10), '-10&lt;''_top');

       
// Добавляем ссылки на две последние страницы         
            
if($count 12)
            {    
                if(
$this->NumPage == 7)
                    
$menu .= $this->createLink(11);
                elseif(
$this->NumPage == 8)        
                    
$menu .= $this->createLink(11
                          .  
$this->createLink(22);                                      
                elseif(
$this->NumPage 7)        
                    
$menu .= $this->createLink(11
                          .  
$this->createLink(22
                          .  
$this->createLink(0'...''_top'false);
            }    


            if(
$this->NumPage 6)
            {  
// Если текущая страница в диапазоне от 1 до 5, выводим первые 10 записей
                
$i 1;
                
$cnt 10;                
            }                
            elseif(
$this->NumPage >= $count 5)
            {  
// Если текущая страница на границе диапазона, или вышла за неё, показываем 10 последних
                
$i $count 10
                
$cnt $count
            }
            else
            {  
// В ином случае показываем 11 страниц, 5 слева от текущей, 5 справа.  
                
$i $this->NumPage 5;
                
$cnt $count;                
            }

            
// Обрезаем ссылки
            
if($this->NumPage 6
                
$cnt $i 9;           
            elseif(
$count $i 10)
                
$cnt $i 10;
            
        }        

      
// Формируем меню       
        
while($i <= $cnt)
        {
            if(
$i == $this->NumPage)
                
$menu .= $this->createLink($i$i'_active'false);
            else
                
$menu .= $this->createLink($i$i);
                   
             
$i++;           
        }  

      
// Добавляем ссылки на две последние страницы         
        
if($count 12)
        {    
            if(
$this->NumPage $count 6)
                
$menu .= $this->createLink(0'...''_top'false)
                      . 
$this->createLink(($count 1), ($count 1));
                   
            if(
$this->NumPage $count 5)        
                
$menu .= $this->createLink($count$count);
        }              
 
       
// Стрелочка на 10 вправо 
       
$end = ($this->NumPage  10 $count) ? $count $this->NumPage 10;
                     
       if(
$this->NumPage $count 5 && $count
- $this->NumPage >= 10)
           
$menu .= $this->createLink($end'&gt;+10''_top');
                                   
        return 
$menu ."\n\n<!-- IRB_Paginator end -->\n";    
    }


Собственно изменилось только то, что сами ссылки теперь формируются отдельным методом.

Еще нужно добавить одно свойство, то есть переменную, отвечающую за незвание GET-параметра
1
2
3
4
5
6
7
8

/**
* Includes mod_rewrite.
* @var string
*/ 
    
public $LevelPage      =  'page';

И еще одн, которое поможет переключить скритп на использование реврайта

1
2
3
4
5
6
7
8
9


  
/////////////////////////////////////////////////
  //         PROPERTIES AND  PRIVATE
  ////////////////////////////////////////////////

    
private $TableTotal     =  0;
    private 
$TableCount     =  0;    
    private 
$StartLink      =  '';



Теперь у нас образовалось три новшества.
1. Можно использовать mod_rewrite, а можно и простые GET параметры. Для включения реврайта первым аргументом в метод createMenu() нужно передать true
1
2
3
4
<?php

    $menu 
$paginator -> createMenu(true);


2. Можно задавать название GET-параметра (по умолчанию page). Это можно сделать при вызове метода формирования меню, передав его вторым аргументом:
1
2
3
4
<?php

    $menu 
$paginator -> createMenu(
false, 'sel');


3. И можно расскрасить нашу менюшку с помощью стилей:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php

// Количество строк на странице 
    
$num 10;
// Принимаем номер требуемой страницы      
    
$page = !empty($_GET['page']) ? (int)$_GET['page'] : 1;

// Подключаем класс
   // include './irb_paginator.php';
// Инициализируем объект
    
$paginator = new IRB_Paginator($page$num);
// Коннект к базе данных
    $paginator -> db_link 
$IRB_CONNECT;
// Запрос 
    
$res  $paginator -> countQuery("SELECT * FROM `table`");
// Формируем меню   
    
$menu $paginator -> createMenu();
    
// Формируем вывод      
    
$table "<table width=\"50%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n";

    if(
mysqli_num_rows($res) > 0)        
        while(
$row mysqli_fetch_assoc($res))
        {
            
$table .= "<tr>\n<td>\n\t"$row['text']. "\n</td>\n</tr>\n";
        }
     
    
$table .= "</table>\n";    
    
    echo 
$table;
?>

<style type="text/css">

.IRB_paginator {
padding: 2px;
font-weight:bold;
}

.IRB_paginator_active {
padding: 2px;
color:#FF0000;
font-weight:bold;
}

.IRB_paginator_top {
padding: 2px;
font-weight:bold;
color:#009900;
}

.IRB_paginator_block{
font-family:Verdana, Arial, Helvetica, sans-serif;
color: #000099;
}

.IRB_paginator_block a:link {
text-decoration:none;
color: #000099;
}

.IRB_paginator_block a:visited {
text-decoration:none;
color: #000099;
}

.IRB_paginator_block a:hover {
text-decoration:none;
color: #000099;
}

.IRB_paginator_block a:active {
text-decoration:none;
color: #000099;
}

.IRB_paginator_top a:link {
color:#009900;
}

.IRB_paginator_topa:visited {
text-decoration:none;
color: #009900;
}

.IRB_paginator_top a:hover {
text-decoration:none;
color: #009900;
}

.IRB_paginator_top a:active {
text-decoration:none;
color: #009900;
}

</style> 
<div class="IRB_paginator_block">
    
  <?php  echo $menu?>
  
</div>


Вот теперь всё красиво и грамотно.
Но всё ли? Есть еще один подводный камушек. О нем в следующем разделе.