Код (PHP): <?php /* * Пейджер * * @author 440hz <440hz@mail.ru> */ class IndigoPageBar extends IndigoAtom { function __construct($url,$num_rows,$page,$rows_on_page,$cols_on_bar=5) { $this->url = $url = './?page='; // урл вызова $this->num_rows = $num_rows = 5; // всего записей $this->page = $page = 1; // начальная страница $this->rows_on_page = $rows_on_page = 5; // записей на страницу $this->cols_on_bar = $cols_on_bar = 5; // циферок на пейджере } /* * Получить HTML * */ function GetHTML() { if(!isset($this->page)) $this->page = 1; $html = ""; // вычисляем страницу $this->pages = intval($this->num_rows / $this->rows_on_page); // страница-то одна // можем выдать пустую страку тогда пейджер не покажет ничего if($this->pages == 0) return '<a href="'.$this->url.'1" class=pagesel>1</a>'; // если записей на последние странице меньше чем надо // увеличим страницы if($this->pages * $this->rows_on_page < $this->num_rows) $this->pages++; // поправим размерность бара if($this->pages < $this->cols_on_bar * 2 + 1) $bar = intval($this->pages)-1; else $bar = $this->cols_on_bar; $this->page_left = $this->page - $bar; $this->page_right = $this->page + $bar; if($this->page_left < 1) { $this->page_left = 1; $this->page_right = $this->page_left + $bar * 2; } if($this->page_right > $this->pages) { $this->page_right = $this->pages; $this->page_left = $this->page_right - $bar * 2; if($this->page_left < 1) $this->page_left = 1; } if($this->page_left != 1) $html .= '<a href="'.$this->url.'1" class=pageurl>«</a>'; for( $i = $this->page_left; $i <= $this->page_right ; $i++) { if( $i == $this->page ) $html .= '<span class=pagesel>'.$i.'</span>'; else $html .= '<a href="'.$this->url.''.$i.'" class=pageurl>'.$i.'</a>'; } if($this->page_right != $this->pages) $html .= '<a href="'.$this->url.''.$this->pages.'" class=pageurl>»</a>'; return $html; } } ?>[/php] пример использования: [php]<? $newscount = <кол-во записей в таблице новостей> $page = (int) <получить $page из параметров или другим способом> $rows = 10; // на странице 10 новостей // для LIMIT в SQL // SELECT * FROM `news` ORDER BY `dt` LIMIT $start,$rows; $start = ($page-1) * $rows; if($start < 0 )$start = 0; $pager = new IndigoPageBar('/news/?page=',$newscount,$page,$rows); $html = $pager->GetHTML(); ... echo $html; ?> Код (Text): /* PAGER */ .pageurl { padding: 2px 5px 2px 5px; font-family: Tahoma; font-size: 9px; } a.pageurl { text-decoration: none; color: black; } a.pageurl:hover { background-color: #FFAAAA; color: white; } a.pageurl:visited { color: black; } .pagesel { text-decoration: none; padding: 2px 5px 2px 5px; background-color: #FFAAAA; color: white; font-family: Tahoma; font-size: 9px; } a.pagesel { text-decoration: none; padding: 2px 5px 2px 5px; background-color: #FFAAAA; color: white; font-family: Tahoma; font-size: 9px; } a.pagesel:hover { text-decoration: none; color: white; } a.pagesel:visited { text-decoration: none; color: white; }
не аргумент. чем это: Код (Text): $pager = new IndigoPageBar('/news/?page=',$newscount,$page,$rows); $html = $pager->GetHTML(); лучше этого: Код (Text): $html= indigoPageBar('/news/?page=',$newscount,$page,$rows); ?
старик, я не спорю на счет class vs func - э то бессмысленно. не нравится класс - перепиши на функцию.
проще с нуля переписать, чем исправлять такое чудо... ну вот почему было не написать вначале функции: Код (Text): $page_left= $this->page_left; и вообще, с какой целью ты выложил этот код? новички его не поймут, воспользоваться им не смогут... ps: ну да и неплохо было бы воспользоваться шаблоном для вывода...
440Hz, приведённый код яркий пример принципа ООП ради ООП Именно в данном случае, при данной функциональности, необходимости в создании отдельно класса объектов ни с какой точки зрения небыло. ПС. У меня правда тоже генератор навигации в виде класса, но у меня это хоть функционалом оправдано.
Вырезка из моего кода отвечающего за пейджер (без особого труда трансформируется в функцию): PHP: $limit = 30; // кол-во записей на страницу //выясняем общее кол-во элементов $Query = "SELECT COUNT(*) FROM data_keys WHERE parent_id=$key_id"; $arr = sql($Query); //это функция обработки запросов $total_records = $arr[0][0]; $sql_start=0; $navigator_string =""; if ($total_records>$limit) { if ($_GET['st']<>"") {$sql_start=$_GET['st']-1;} $request_str = $_SERVER["REQUEST_URI"]; $pattern = "/&st=\d{1,4}/i"; $tmp= ceil($total_records/$limit); $navigator_string ="<span style='font-size:12px'>страницы: "; for ($i=1;$i<=$tmp;$i++) { $replacement = "&st=".(($i-1)*$limit+1); $url = preg_replace($pattern, $replacement, $request_str); if (!strpos($url,"&st=")) {$url .= $replacement;} if ($sql_start==($i-1)*$limit) { $tmp_str = "<b>$i </b>"; } else { $tmp_str = "<a href='$url' style='font-size:12px'>$i </a>"; } $navigator_string .= $tmp_str; } $navigator_string .= "</span>"; } //собственно запрос $Query = "SELECT * FROM data_keys WHERE parent_id=$key_id ORDER BY orders LIMIT $sql_start,$limit"; $arr = sql($Query); if (count($arr)): echo $navigator_string; // странички // Вывод результатов echo $navigator_string; // странички endif; P.S. я новичек, т.ч. сильно не пинайте, любые рекомендации по оптимизации с удовольствием учту.
440Hz, к тому, что каким бы не был проект, никто не мешает использовать в нём процедурное программирование. Я не рассматриваю случаи, когда принципиально ставится задача ООП ради ООП, и начинают писать что-то типа class Integer{...} в попытке превратить ПХП в Java.
но и не препятствует. нравится тебе функции - пиши, но не мешай другим идти своим путем. p.s. давай не начинат ь new func() vs func() ибо кому как...
У меня не работает((((((((((((( Вот что пишет: Fatal error: Class indigopagebar: Cannot inherit from undefined class indigoatom in z:\home\wold-info.ru\www\ini.php on line 73 ?????? Хочу себе моднявый пейджер =))