ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

постраничная навигация
  #1  
Старый 07.12.2009, 02:28
попугай
Познавший АНТИЧАТ
Регистрация: 15.01.2008
Сообщений: 1,166
Провел на форуме:
2459557

Репутация: 606


По умолчанию постраничная навигация

Как реализовать постраничную навигацию на php в две стороны

то есть, в зависимости от текущей страницы выводить ссылки на 4 предыдущих и 4 следующих страницы. А если текущая страница не позволяет вывести 4 страницы предыдущих или следующих - то вывести недостающие с противоположного направления.

В общем как в DLE. (Пример сайта http://dle-news.ru/page/8/ - навигация внизу.)

Смотрел код - но там слишком мудрено как-то.
 
Ответить с цитированием

  #2  
Старый 07.12.2009, 07:10
b3
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме:
1698585

Репутация: 818


Отправить сообщение для b3 с помощью ICQ
По умолчанию

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] > ? (int)$_GET[$this->page_var] : 1;
}

public function 
set_query($q)
{
    
$this->$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 $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 $start 1;
    
$end $this->cur_page $this->link_padding-1;
    if ( 
$end $this->total_pages $end $this->total_pages;

    if ( 
$start )  $page_link_list[] = $this->get_page_link$start-1$start '...' '' );
    for (
$i=$start$i <= $end$i++)  $page_link_list[] = $this->get_page_link$i );
    if ( 
$end $this->total_pages $page_link_list[] = $this->get_page_link$end +1$end == $this->total_pages '' '...' );
    if ( 
$end <= $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 $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;
}
}
?>
 
Ответить с цитированием

  #3  
Старый 07.12.2009, 09:48
LStr1ke
Постоянный
Регистрация: 29.07.2009
Сообщений: 400
Провел на форуме:
1455812

Репутация: 150
По умолчанию

Думаю этот будет по понятней...
Результат:

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 $cpage $cpage intval($_GET['page']); //избавляемся от возможных отрицательных значений, ща утро и бошка не варит, вроде была стндрт. функция
$onpage 5//Сколько выводит на страницу
$form $cpage $onpage//Вычисляем по формуле (Тек. страницу * на количество выводимых строк на страницу) получаем число для запроса к БД

$result mysql_query("SELECT * FROM pages ORDER BY id DESC LIMIT $form,$onpage"); //Запрашиваем результат в обратном порядке (начиная со старшего id
while($rowmysql_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 && $cpage "<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 || $i $total '' "<a href='pages.php?page=$i'>$out</a> ";
}
echo 
$total && $cpage $total && $cpage != $total " ...<a href='pages.php?page=$total'><small>".($total+1)."</small></a>" ''//Тут если ссылок больше 4 и текущая страница младше чем на 4 страницы от самой старшей - рисуем ссылку для самой последней страницы
?>
 
Ответить с цитированием

  #4  
Старый 07.12.2009, 09:54
попугай
Познавший АНТИЧАТ
Регистрация: 15.01.2008
Сообщений: 1,166
Провел на форуме:
2459557

Репутация: 606


По умолчанию

Для 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);
        } 
 
Ответить с цитированием

  #5  
Старый 07.12.2009, 09:58
LStr1ke
Постоянный
Регистрация: 29.07.2009
Сообщений: 400
Провел на форуме:
1455812

Репутация: 150
По умолчанию

Что хранится в text.txt и data.txt?
 
Ответить с цитированием

  #6  
Старый 07.12.2009, 10:03
попугай
Познавший АНТИЧАТ
Регистрация: 15.01.2008
Сообщений: 1,166
Провел на форуме:
2459557

Репутация: 606


По умолчанию

LStr1ke, ага спасибо щас посмотрю. Под свои нужды подкручу.

в text.txt - любой текст (просто для удобства)
а в data.txt - названия страниц, заголовки.


LStr1ke, все классно. Спасибо за помощь

Последний раз редактировалось попугай; 07.12.2009 в 10:19..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшие статьи [html, Css, Js, Php] Isis PHP, PERL, MySQL, JavaScript 75 04.05.2010 12:17
Постраничная навигация jquary kdk PHP, PERL, MySQL, JavaScript 3 02.12.2009 00:24



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ