Автор Тема: Постраничный вывод. Алгоритм составления ссылок на страницы.  (Прочитано 9629 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
собсно, сабж.
хотелось бы обсудить различные алгоритмы составления навигационных ссылок при постраничном выводе...
Я говорю про

1, 2, 3, 4, 5, 6, 7...

Какие вам известны алгоритмы составления такого навигационного механизма и какие вы считаете лучшими?

К примеру, я использую следующий алгоритм:

// $cpages - кол-во страниц
// $curr_page - номер текущей страницы

for ($i 1$i <= $cpages$i++)
   
$pages[$i] = ($i == $curr_page) ? \'<b>\'.$i.\'</b>\' : \'<a href=\'.$_SERVER[\'PHP_SELF\'].\'?page=\'.$i.\'>\'.$i.\'</a>\';

echo \'Страницы: \'.join(\', \', $pages);
« Последнее редактирование: 16 Апреля 2003, 23:25:38 от D1g174LM4n14c »
Мы такие!

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
p.s. Код в прошлом посте - просто неоптимизированный пример. Не пугайтесь, коллеги :)
Мы такие!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Вот решил свой код запостить. Выводит навигацию в стиле:
<< < 12 13 14 15 16 > >>
Сразу отвечу тем, кто спросит "Нафига столько писать для такой простой задачи?" - для универсальности :D.
(хотя кое-что лишнее здесь есть)

<?
function 
get_pages($current$pages) {
    
$ret = array();
    
/** Settings **/

    
$_prev "<b><</b>";
    
$_next "<b>></b>";
    
$_last "<b>>></b>";
    
$_first "<b><<</b>";

    
// number of digits in navigation
    
$amount 5;

    
/** Code **/
    
if ($amount $pages
        
$amount $pages;

    if (
$current != 1) {
        
$ret[\'first\'] = array("link"=>$_SERVER[\'PHP_SELF\']."?"._qs($current, 1), "text"=>$_first, "page"=>1);
        $ret[\'prev\'] = array("link"=>$_SERVER[\'PHP_SELF\']."?"._qs($current, ($current-1)), "text"=>$_prev, "page"=>($current-1));
        $ret[\'is_prev\'] = true;
    } else $ret[\'is_prev\'] = false;

    if ($current != $pages) {
        $ret[\'last\'] = array("link"=>$_SERVER[\'PHP_SELF\']."?"._qs($current, $pages), "text"=>$_last, "page"=>$pages);
        $ret[\'next\'] = array("link"=>$_SERVER[\'PHP_SELF\']."?"._qs($current, ($current+1)), "text"=>$_next, "page"=>($current+1));
        $ret[\'is_next\'] = true;
    } else $ret[\'is_next\'] = false;

    /** main navigation **/

    // get page from which we\'ll begun our navigation ($begin)
    $half = intval($amount / 2);
    if (($current - $half) < 1)
        $begin = 1;
    elseif (($current+$half) > $pages)
        $begin = $pages - $amount+1;
    else
        $begin = $current - $half;
    
    $ret[\'digits\'] = array();
    for ($i=$begin; $i<$begin+$amount; $i++) {
        array_push($ret[\'digits\'], array("link"=>$_SERVER[\'PHP_SELF\']."?"._qs($current, $i), "text"=>$i, "page"=>$i));
    }
    return $ret;
}


/*
* this function used for link-generation
*/
function _qs($cur, $digit, $name = "start") {
    $regexp = "#$name=$cur#";
    if (preg_match($regexp, $_SERVER[\'QUERY_STRING\'])) 
        return str_replace("$name=$cur", "$name=$digit", $_SERVER[\'QUERY_STRING\']);
    elseif (strlen($_SERVER[\'QUERY_STRING\']) == 0)
        return "$name=$digit";
    else
        return $_SERVER[\'QUERY_STRING\']."&".$name."=".$digit;
}

//////////////////////////////////
//  пример использования
//

$num_of_pages = 10;
for($i=1; $i<=$num_of_pages; $i++) {
    // получаем массив страниц
    $_nav = get_pages($i, $num_of_pages);
    $nav= "";

    if ($_nav[\'is_prev\']) {
      $nav .= \'<a href="\'.$_nav[\'first\'][\'link\'].\'">\'.$_nav[\'first\'][\'text\'].\'</a> \';
      $nav .= \'<a href="\'.$_nav[\'prev\'][\'link\'].\'">\'.$_nav[\'prev\'][\'text\'].\'</a> \';
    }
    if (sizeof($_nav[\'digits\']) != 1) {
      foreach ($_nav[\'digits\'] as $nv) {
         if ($nv[\'page\'] != $i) {
            $nav .= \' <a href="\'.$nv[\'link\'].\'">\'.$nv[\'text\'].\'</a> \';
         } else {
            $nav .= \' <b>[\'.$i.\']</b> \';
         }
      }
    }
    if ($_nav[\'is_next\']) {
      $nav .= \'<a href="\'.$_nav[\'next\'][\'link\'].\'">\'.$_nav[\'next\'][\'text\'].\'</a> \';
      $nav .= \'<a href="\'.$_nav[\'last\'][\'link\'].\'">\'.$_nav[\'last\'][\'text\'].\'</a> \';
    }

    // output
    echo "<hr>".$nav;
}
?>


PS
как вариант - посмотри pear::pager (но там еще больше кода)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
а у меня - 5 строчек :-)

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
у меня 2 :) (см. выше).

Цитировать
Макс:
    $_prev = "<";
    $_next = ">";
    $_last = ">>";
    $_first = "<<";


так было бы правильнее ;)

    $_prev = "<";
    $_next = ">";
    $_last = ">>";
    $_first = "<<";
Мы такие!

Оффлайн nagash

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 341
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.nagash.org
D1g174LM4n14c
у тебя две потому что количество страниц с неба берётся...
совершенно непонятный у тебя код...
зачем он такой нужен?
выяснить какую циферку жирной сделать и без ссылки?
хм...

Оффлайн D1g174LM4n14c

  • 1m
  • Постоялец
  • ***
  • Сообщений: 137
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
nagash
я просто не привел код, который определяет переменные $cpages & $curr_page ... мне показалось мы говорим только про алгоритм вывода страниц и ссылок..
Мы такие!

Оффлайн Тушкан

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 3
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Народ, а может кто для моего скрипта прикрутить постраничный вывод, а то уж никак не доходит принцип работы, привожу код:
<?

  
mysql_connect("localhost""guest""guest"); 
  
mysql_select_db("guest");

$query "select * from news order by id desc"
$result mysql_query($query) or die (mysql_errno().": ".mysql_error());
$num mysql_num_rows($result);
if(
mysql_num_rows($result) > 0) { 

  while (
$row mysql_fetch_array($result)) 
  { 
    
$date $row["date"]; 
    
$header $row["header"];
    
$id $row["id"];
    
$text $row["text"];
    
$type $row["type"];

if (
$type == 1) {
$head "Важная";}
elseif (
$type == 2) {
$head "Обновление";}
else {
$head "Новость";}

$header str_replace "[r""<b><font color=red>"$header );
$header str_replace "[g""<b><font color=green>"$header );
$header str_replace "[""<u>"$header );
$header str_replace "]""</b></u><font color=black size=1>"$header );

Echo 
"
<table width=\\"
100%\\" border=\\"0\\" bgcolor=\\"#CACACA\\" cellpadding=\\"2\\">
  
<tr
    <
td bgcolor=\\"#ACACAC\\" class=\\"obvod\\">$date г.</td>
    <
td width=\\"73%\\" bgcolor=\\"#DFDFDF\\" class=\\"obvod\\"><b>$head:</b$header</td>
  </
tr>
  <
tr>
    <
td width=\\"9%\\"> </td>
    <
td colspan=\\"5\\" bgcolor=\\"#DFDFDF\\" class=\\"obvod\\">   $text</td>
  </
tr>
</
table>


";
   } 


?>

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
А сам?
Если за тебя напишут, то и не дойдет.
Давай сам пробуй.
что до тебя не доходит?
Как ссылку вывести?

Оффлайн Тушкан

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 3
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Со страницами вроде въехал...Не доходит с тем, как это все связать...Какая то мысля есть, но  оочень далекая...блестит, но из далека не видно её=(

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Тушкан
попробуй сесть, и все расписать на бумаге, может помочь.
•••Jah\'d never let us down!•••

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Тушкан
Для начала тебе нужно узнать про оператор LIMIT
употребяется в запросе SELECT
ставится САМЫМ последним в запросе.

SELECT * FROM table LIMIT 0,10 выберет тебе первые 10 записей
SELECT * FROM table LIMIT 99,10 выберет тебе десятые 10 записей
первая цифра означает с какой записи выводить, вторая - сколько.

Дальше сам допетришь?

Оффлайн Тушкан

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 3
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Такс, помоему меня посчитали за полного идиота и ламера...Извините, наверное не так выразился: про то как выводить я понял...мне не понятно как сделать ссылки внизу на страницы 1, 2, 3, 4...

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
прочитай самое первое сообщение в этой теме.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
Тушкан:
Такс, помоему меня посчитали за полного идиота и ламера

До того, как ты это написал - не считали...

 

Sitemap 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