Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс постраничной навигации. С использованием шаблона. 
:(
    Опции темы
Shogun
  Дата 22.11.2008, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Здравствуйте уважаемые коллеги.

Хочу представить вам на обозрение мною недавно написанный класс для постраничной навигации. 
Кому-то он покажется слишком массивном, кому-то примитивном, но я его написал для себя и вполне соответствует моим требованием.


Что можно:
1.Использование шаблонов для структуры навигации и ее элементах.
2.Отключение или включение вывода отдельных элементов навигации. (пр. : Вперед, Назад, Первая, Последняя)  
3.Определение количества линков слева или справа текущей страницы.


Нуу вообшем вот код:

Код

<?php

class pagination
    {
      var $url='';
      var $page;
      var $curent_page;
      var $preview_page;
      var $next_page;
      var $from;
      var $limit;
      var $left_limit;
      var $right_limit;
      var $total_rows;
      var $total_pages;
      
      var $display_first = true;
      var $display_last  = true;
      var $display_back  = true;
      var $display_next  = true;
     
      var $default_first = '';
      var $default_back  = '';
      var $default_left  = '';
      var $default_right = '';
      var $default_next  = '';
      var $default_last  = '';
     
      var $left_pages  = '';
      var $right_pages = '';
     
      var $first_name  = '[first]';
      var $last_name   = '[last]';
      var $back_name   = '[back_page]';
      var $next_name   = '[next_page]';
      var $left_name   = '[left_pages]';
      var $right_name  = '[right_pages]';
      var $curent_name = '[curent_page]';
      var $page_name   = '[page]';
      var $title_name  = '[page_title]';
     
      var $first_tmpl       = '';
      var $last_tmpl        = '';
      var $back_tmpl        = '';
      var $next_tmpl        = '';
      var $page_tmpl        = '';
      var $curent_page_tmpl = '';
      var $pagination_tmpl  = '';
    
      var $i=0;
      
      function pagination()
        {
          $this->limit       = 10;
          $this->left_limit  = 4;
          $this->right_limit = 4;
          $this->curent_page = 0;
          $this->from        = 0;
          
          $this->first_tmpl = '<a href="'.$this->page_name.'">Первая</a>';
          $this->last_tmpl  = '<a href="'.$this->page_name.'">Последнея</a>';
      
          $this->back_tmpl  = '<a href="'.$this->page_name.'">Назад</a>';
          $this->next_tmpl  = '<a href="'.$this->page_name.'">Вперед</a>';
      
          $this->page_tmpl  = '<a href="'.$this->page_name.'">'.$this->title_name.'</a>';
      
          $this->curent_page_tmpl = '<b>'.$this->page_name.'</b>';
      
          $this->pagination_tmpl = $this->first_name.'&nbsp;'.$this->back_name.'&nbsp;'.$this->left_name.'&nbsp;
                                '.$this->curent_name.'&nbsp;'.$this->right_name.'&nbsp;'.$this->next_name.'&nbsp;'.$this->last_name;
        }
      
      function set_curent_page($page)
        {
          $this->curent_page = $page;
          $this->from        = $this->curent_page * $this->limit;
        }
      
      function set_total_rows($count)
        {
          $this->total_rows  = $count;     
          $this->total_pages = ceil($this->total_rows/$this->limit);         
        }
      
      function create()
        {
          if ((($this->curent_page-$this->left_limit) > 0) and $this->display_first) 
            { 
              $this->first_tmpl      = str_replace($this->page_name,$this->url.'page=0',$this->first_tmpl);
              $this->pagination_tmpl = str_replace($this->first_name,$this->first_tmpl,$this->pagination_tmpl);
            }
          else { $this->pagination_tmpl = str_replace($this->first_name,$this->default_first,$this->pagination_tmpl); }
          
          if (($this->curent_page > 0) and $this->display_back)
            {
              $this->preview_page    = $this->curent_page - 1;     
              $this->back_tmpl       = str_replace($this->page_name,$this->url.'page='.$this->preview_page,$this->back_tmpl);
              $this->pagination_tmpl = str_replace($this->back_name,$this->back_tmpl,$this->pagination_tmpl);
            }
          else { $this->pagination_tmpl = str_replace($this->back_name,$this->default_back,$this->pagination_tmpl); }
          
          for($i=$this->left_limit; $i>=1; $i--)
            {
              if ($this->curent_page-$i >= 0)
                {
                  $this->page         = $this->curent_page-$i; 
                  $this->preview_page = $this->page+1;
                  
                  $templ = $this->page_tmpl;
                  
                  $templ = str_replace($this->page_name,$this->url.'page='.$this->page,$templ);
                  $templ = str_replace($this->title_name,$this->preview_page,$templ);
                  
                  $this->left_pages.=$templ;
                }
            }
          
          if ($this->left_pages <> '')
            { $this->pagination_tmpl = str_replace($this->left_name,$this->left_pages,$this->pagination_tmpl); }
          else { $this->pagination_tmpl = str_replace($this->left_name,$this->default_left,$this->pagination_tmpl); }
          
          $i = $this->curent_page + 1;    
          $this->curent_page_tmpl = str_replace($this->page_name,$i,$this->curent_page_tmpl);
          $this->pagination_tmpl  = str_replace($this->curent_name,$this->curent_page_tmpl,$this->pagination_tmpl);
          
          $this->next_page = ($this->curent_page+1)*$this->limit;
      
          for ($i=1; $i<=$this->right_limit; $i++)
            {
              if ($this->curent_page+$i < $this->total_pages)
                {
                  $this->page      = $this->curent_page+$i; 
                  $this->next_page = $this->curent_page+$i+1;
                  
                  $templ = $this->page_tmpl;
                  
                  $templ = str_replace($this->page_name,$this->url.'page='.$this->page,$templ);
                  $templ = str_replace($this->title_name,$this->next_page,$templ);
                  
                  $this->right_pages.=$templ;
                }
            }
        
          if ($this->right_pages <> '')
            { $this->pagination_tmpl = str_replace($this->right_name,$this->right_pages,$this->pagination_tmpl);     }
          else { $this->pagination_tmpl = str_replace($this->right_name,$this->default_right,$this->pagination_tmpl);     }
          
          if (($this->curent_page < $this->total_pages-1) and $this->display_next)
            {
              $this->next_page       = $this->curent_page + 1;
              $this->next_tmpl       = str_replace($this->page_name,$this->url.'page='.$this->next_page,$this->next_tmpl);
              $this->pagination_tmpl = str_replace($this->next_name,$this->next_tmpl,$this->pagination_tmpl);
            }
          else { $this->pagination_tmpl = str_replace($this->next_name,$this->default_next,$this->pagination_tmpl); }
            
          if ((($this->total_pages - (($this->curent_page+1)+$this->right_limit)) > 0) and $this->display_last)
            { 
              $this->page            = $this->total_pages - 1; 
              $this->last_tmpl       = str_replace($this->page_name,$this->url.'page='.$this->page,$this->last_tmpl);
              $this->pagination_tmpl = str_replace($this->last_name,$this->last_tmpl,$this->pagination_tmpl);
            }
          else { $this->pagination_tmpl = str_replace($this->last_name,$this->default_last,$this->pagination_tmpl); }
          
          return $this->pagination_tmpl;
        }
    }

?>




Вот простой пример:
Код

<?php
  $pagination = new pagination;
  
  $pagination->limit = 10;
  $pagination->left_limit = 5;
  $pagination->right_limit = 5;
  $pagination->display_first = false;
  $pagination->display_last = false;
  
  if (isset($_GET['page']) and is_numeric($_GET['page'])) { $pagination->set_curent_page($_GET['page']); }
  
  $db->query("select count(*) from users");
  
  $pagination->set_total_rows($db->result);
  
  $users = $db->query("select * from users limit ".$pagination->from.",".$pagination->limit);
  
  while ($user = $db->fetch_row($users))      
    { echo $user['username'].'<b>:</b>&nbsp;&nbsp;'.$user['email'].'<br>'; }

  $pagination->url = 'test.php?';
  
  echo $pagination->create();
?>



Очень хотелось бы узнать ваше мнения, особено профи. 


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
Shogun
Дата 25.11.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Мдее. Тут есть хоть ктота??  


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
skyboy
Дата 25.11.2008, 16:27 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Shogun @  25.11.2008,  15:19 Найти цитируемый пост)
Тут есть хоть ктота??   

"ктота" есть. в чем заключается вопрос? какого рода мнения ожидаются? начни использовать - и сам будешь видеть архитектурные недочеты и логические ошибки. анализировать 200-строчный кусок кода чтоб поставить оценку? полноте, рабочий день, как-никак. да, и не учителя мы.
PM MAIL   Вверх
Shogun
Дата 1.12.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Цитата(skyboy @ 25.11.2008,  16:27)
Цитата(Shogun @  25.11.2008,  15:19 Найти цитируемый пост)
Тут есть хоть ктота??   

"ктота" есть. в чем заключается вопрос? какого рода мнения ожидаются? начни использовать - и сам будешь видеть архитектурные недочеты и логические ошибки. анализировать 200-строчный кусок кода чтоб поставить оценку? полноте, рабочий день, как-никак. да, и не учителя мы.

Я уже им пользуюсь, и очень доволен. Но может есть какиета недочеты или можно еще чтото добавить, оптимизировать.
Мне казалось постраничный вывод очень даже интересная тема, да и класс типа этого не видел на вашем форуме. 


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
awers
Дата 1.12.2008, 22:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



кайф в том что "какиета" недочеты есть всегда. Да и нужен ли такой класс для решения задачи, решаемой в 3 строчки
PM MAIL WWW ICQ Skype   Вверх
Shogun
Дата 2.12.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Цитата(awers @ 1.12.2008,  22:11)
кайф в том что "какиета" недочеты есть всегда. Да и нужен ли такой класс для решения задачи, решаемой в 3 строчки

Ну и ты сможешь написать в 3 строки с такой же функциональность??   smile  smile 


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
Matrex
Дата 2.12.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 31.1.2006

Репутация: 1
Всего: 2



Я могу написать этот код в 50 строчек )))

Код

<?php
// код управления страницами
if ($page!=5){
$cp=Ceil($count/COUNTINPAGE);
if ($cp!=0){
echo'<table width="100%" class="tabledownload" border="0" cellpadding="0" cellspacing="0"><tr><td><br>';    
echo '<center>';
$st=1;if ($cp!=1){
$var=array('action','page','from','find','count','idplatform','idlicens','idsubcategory','user','password','iduser','idcategory','alf');
$value=array('',$page,$from,$find,$count,$idplatform,$idlicens,$idsubcategory,$user,$password,$iduser,$idcategory,$alf);    
$value[0]='first';echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&lt;&lt;</a>&nbsp;';
$value[0]='back' ;echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&lt;</a>&nbsp;&nbsp;';
    $value[0]='';
    $st=(Ceil($from/COUNTINPAGE)+1);
    $ty=$st-5;
    if ($ty<=0) $ty=1;
    $fr=$ty+10;
    if ($fr>$cp) {$fr=$cp;$ty=$cp-10;}
    if ($ty<=0) $ty=1;
    for ($r=$ty;$r<=$fr;$r++){
    $pg=COUNTINPAGE*($r-1);
    $value[2]=$pg;
    if ($st==$r)echo '<font class="textnormalblack">'.$r.'</font>&nbsp;'; else echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">'.$r.'</a>&nbsp;';
                }
$value[2]=$from;                
$value[0]='next';echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&gt;</a>&nbsp;';
$value[0]='last';echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&gt;&gt;</a><br>';
}
echo'<font class="textnormalblack">Страница '.$st.' из '.$cp.'</font></center><br>';
echo'</td></tr></table>';
}
}
?>



кто меньше? ))))
PM MAIL   Вверх
Shogun
Дата 2.12.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Цитата(Matrex @ 2.12.2008,  15:58)
Я могу написать этот код в 50 строчек )))

Код

<?php
// код управления страницами
if ($page!=5){
$cp=Ceil($count/COUNTINPAGE);
if ($cp!=0){
echo'<table width="100%" class="tabledownload" border="0" cellpadding="0" cellspacing="0"><tr><td><br>';    
echo '<center>';
$st=1;if ($cp!=1){
$var=array('action','page','from','find','count','idplatform','idlicens','idsubcategory','user','password','iduser','idcategory','alf');
$value=array('',$page,$from,$find,$count,$idplatform,$idlicens,$idsubcategory,$user,$password,$iduser,$idcategory,$alf);    
$value[0]='first';echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&lt;&lt;</a>&nbsp;';
$value[0]='back' ;echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&lt;</a>&nbsp;&nbsp;';
    $value[0]='';
    $st=(Ceil($from/COUNTINPAGE)+1);
    $ty=$st-5;
    if ($ty<=0) $ty=1;
    $fr=$ty+10;
    if ($fr>$cp) {$fr=$cp;$ty=$cp-10;}
    if ($ty<=0) $ty=1;
    for ($r=$ty;$r<=$fr;$r++){
    $pg=COUNTINPAGE*($r-1);
    $value[2]=$pg;
    if ($st==$r)echo '<font class="textnormalblack">'.$r.'</font>&nbsp;'; else echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">'.$r.'</a>&nbsp;';
                }
$value[2]=$from;                
$value[0]='next';echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&gt;</a>&nbsp;';
$value[0]='last';echo '<a class="linknormalgreen" onFocus="this.blur();" href="'.get_http_ask('index.php',$var,$value).'">&gt;&gt;</a><br>';
}
echo'<font class="textnormalblack">Страница '.$st.' из '.$cp.'</font></center><br>';
echo'</td></tr></table>';
}
}
?>



кто меньше? ))))

wow да ты крут smile    Ну и где тут функциональность моего класса??  smile  smile 


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
Matrex
Дата 3.12.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 31.1.2006

Репутация: 1
Всего: 2



Поставь пару ifов и будет тебе 

Цитата
2.Отключение или включение вывода отдельных элементов навигации. (пр. : Вперед, Назад, Первая, Последняя) 


--------------------------------------------

Цитата
1.Использование шаблонов для структуры навигации и ее элементах.
3.Определение количества линков слева или справа текущей страницы.


Цитата
class pagination


я вообще не понимаю зачем это нужно? 

Кстати весь этот функционал вполне реализуем в течении 15 мин на базе моего скрипта

Собственно говоря - каждому свое... 

А вообще сделано  smile  !!! Одобрям  smile  !!!

PM MAIL   Вверх
niaz
Дата 3.12.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.7.2006

Репутация: нет
Всего: нет



Shogun ты молодец!  smile  Респект тебе. Я тоже тут начал создавать класс для навигации ссылка, но ты успел первым. Я позже обязательно проверю твой код. И если что можно внести изменения в твой код?
PM MAIL ICQ   Вверх
Shogun
Дата 3.12.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Matrex - Спасибо. Будешь использовать поймешь преимущества. ;)


niaz - Спасибо. ;) Да конечно можно изменения делать, и если не будет трудно написать в этой теме. 


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
niaz
Дата 3.12.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.7.2006

Репутация: нет
Всего: нет



Shogun лучше было бы если бы ты свой класс прокомментировал бы! Меньше бы времени ушло бы на проверку. И новичкам в разработке легче бы было!
PM MAIL ICQ   Вверх
Sunvas
  Дата 4.12.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Класс для 4-го PHP??? Не стал бы таким пользоваться.. smile 

Вот тебе уже два недочета:
Цитата(Shogun @  22.11.2008,  03:11 Найти цитируемый пост)
'page='.$this->page

Таким образом, класс не поддерживает ЧПУ.

Цитата(Shogun @  22.11.2008,  03:11 Найти цитируемый пост)
if (isset($_GET['page']) and is_numeric($_GET['page']))

Неправильно использовать is_numeric для проверки корректности номера страницы. Потому что эта функция возвратит true и для строки -123 и 0xFF

 smile  smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Shogun
Дата 4.12.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Цитата(Sunvas @  4.12.2008,  12:22 Найти цитируемый пост)
Класс для 4-го PHP??? Не стал бы таким пользоваться..


Почему ты думаешь что для 4-го PHP ?? Я на 5-том его написал и использую без проблем.  smile 



Цитата(Sunvas @  4.12.2008,  12:22 Найти цитируемый пост)
Вот тебе уже два недочета:
Цитата(Shogun @  22.11.2008,  03:11 Найти цитируемый пост)
'page='.$this->page


Да я тоже думал об этом, зделаю.  smile 



Цитата(Sunvas @  4.12.2008,  12:22 Найти цитируемый пост)
Цитата(Shogun @  22.11.2008,  03:11 Найти цитируемый пост)
if (isset($_GET['page']) and is_numeric($_GET['page']))

Неправильно использовать is_numeric для проверки корректности номера страницы. Потому что эта функция возвратит true и для строки -123 и 0xFF


Это лишь пример, я показал класс, а как использовать его уже дело каждого. ;)



--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
Sunvas
Дата 4.12.2008, 16:59 (ссылка) |   (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Цитата(Shogun @  4.12.2008,  15:17 Найти цитируемый пост)
Почему ты думаешь что для 4-го PHP ?? Я на 5-том его написал и использую без проблем.  

Я не думаю, я уверен. Если ты написал его на 5м, значит ты абсолютно не имеешь понятия об ООП 5го PHP. Начнем с того, что ключевого слова var в 5м PHP нет! А то, что работает - это не удивительно, ведь скрипты, написанные для четверки без проблем работают на пятерке в режиме совместимости.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.