Как реализовать постраничную навигацию на php в две стороны то есть, в зависимости от текущей страницы выводить ссылки на 4 предыдущих и 4 следующих страницы. А если текущая страница не позволяет вывести 4 страницы предыдущих или следующих - то вывести недостающие с противоположного направления. В общем как в DLE. (Пример сайта http://dle-news.ru/page/8/ - навигация внизу.) Смотрел код - но там слишком мудрено как-то.
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] > 0 ? (int)$_GET[$this->page_var] : 1; } public function set_query($q) { $this->q = $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 > 0 ) $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 < 1 ) $start = 1; $end = $this->cur_page + $this->link_padding-1; if ( $end > $this->total_pages ) $end = $this->total_pages; if ( $start > 1 ) $page_link_list[] = $this->get_page_link( $start-1, $start - 2 > 0 ? '...' : '' ); for ($i=$start; $i <= $end; $i++) $page_link_list[] = $this->get_page_link( $i ); if ( $end + 1 < $this->total_pages ) $page_link_list[] = $this->get_page_link( $end +1, $end + 2 == $this->total_pages ? '' : '...' ); if ( $end + 1 <= $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 > 1 ? $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; } } ?>
Думаю этот будет по понятней... Результат: 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 < 0 ? $cpage = 0 : $cpage = intval($_GET['page']); //избавляемся от возможных отрицательных значений, ща утро и бошка не варит, вроде была стндрт. функция $onpage = 5; //Сколько выводит на страницу $form = $cpage * $onpage; //Вычисляем по формуле (Тек. страницу * на количество выводимых строк на страницу) получаем число для запроса к БД $result = mysql_query("SELECT * FROM pages ORDER BY id DESC LIMIT $form,$onpage"); //Запрашиваем результат в обратном порядке (начиная со старшего id while($row= mysql_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 > 4 && $cpage > 4 ? "<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 < 0 || $i > $total ? '' : "<a href='pages.php?page=$i'>$out</a> "; } echo $total > 4 && $cpage < $total - 4 && $cpage != $total ? " ...<a href='pages.php?page=$total'><small>".($total+1)."</small></a>" : ''; //Тут если ссылок больше 4 и текущая страница младше чем на 4 страницы от самой старшей - рисуем ссылку для самой последней страницы ?>
Для 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); }
LStr1ke, ага спасибо щас посмотрю. Под свои нужды подкручу. в text.txt - любой текст (просто для удобства) а в data.txt - названия страниц, заголовки. LStr1ke, все классно. Спасибо за помощь