Forum Webscript.Ru

Программирование => PHP => Тема начата: D1g174LM4n14c от 16 Апреля 2003, 23:14:11

Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: D1g174LM4n14c от 16 Апреля 2003, 23:14:11
собсно, сабж.
хотелось бы обсудить различные алгоритмы составления навигационных ссылок при постраничном выводе...
Я говорю про

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

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

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

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

for ($i = 1; $i <= $cpages; $i++)
   $pages[$i] = ($i == $curr_page) ? \'\'.$i.\'\' : \'\'.$i.\'\';

echo \'Страницы: \'.join(\', \', $pages);
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: D1g174LM4n14c от 16 Апреля 2003, 23:26:53
p.s. Код в прошлом посте - просто неоптимизированный пример. Не пугайтесь, коллеги :)
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Макс от 17 Апреля 2003, 02:48:37
Вот решил свой код запостить. Выводит навигацию в стиле:
<< < 12 13 14 15 16 > >>
Сразу отвечу тем, кто спросит "Нафига столько писать для такой простой задачи?" - для универсальности :D.
(хотя кое-что лишнее здесь есть)

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

    $_prev = "<";
    $_next = ">";
    $_last = ">>";
    $_first = "<<";

    // 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 .= \'\'.$_nav[\'first\'][\'text\'].\' \';
      $nav .= \'\'.$_nav[\'prev\'][\'text\'].\' \';
    }
    if (sizeof($_nav[\'digits\']) != 1) {
      foreach ($_nav[\'digits\'] as $nv) {
         if ($nv[\'page\'] != $i) {
            $nav .= \' \'.$nv[\'text\'].\' \';
         } else {
            $nav .= \' [\'.$i.\'] \';
         }
      }
    }
    if ($_nav[\'is_next\']) {
      $nav .= \'\'.$_nav[\'next\'][\'text\'].\' \';
      $nav .= \'\'.$_nav[\'last\'][\'text\'].\' \';
    }

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


PS
как вариант - посмотри pear::pager (но там еще больше кода)
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Меняздесьдавнонет от 17 Апреля 2003, 10:53:27
а у меня - 5 строчек :-)
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: D1g174LM4n14c от 18 Апреля 2003, 12:57:13
у меня 2 :) (см. выше).

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


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

    $_prev = "<";
    $_next = ">";
    $_last = ">>";
    $_first = "<<";
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: nagash от 19 Апреля 2003, 01:34:05
D1g174LM4n14c
у тебя две потому что количество страниц с неба берётся...
совершенно непонятный у тебя код...
зачем он такой нужен?
выяснить какую циферку жирной сделать и без ссылки?
хм...
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: D1g174LM4n14c от 19 Апреля 2003, 10:30:50
nagash
я просто не привел код, который определяет переменные $cpages & $curr_page ... мне показалось мы говорим только про алгоритм вывода страниц и ссылок..
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Тушкан от 28 Сентября 2003, 22:09:55
Народ, а может кто для моего скрипта прикрутить постраничный вывод, а то уж никак не доходит принцип работы, привожу код:

  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", "", $header );
$header = str_replace ( "[g", "", $header );
$header = str_replace ( "[", "", $header );
$header = str_replace ( "]", "
", $header );

Echo "

 
   
   
 
 
   
   
 
$date г.$head: $header
  $text



";
   }
}

?>
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Меняздесьдавнонет от 29 Сентября 2003, 00:14:10
А сам?
Если за тебя напишут, то и не дойдет.
Давай сам пробуй.
что до тебя не доходит?
Как ссылку вывести?
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Тушкан от 29 Сентября 2003, 16:01:14
Со страницами вроде въехал...Не доходит с тем, как это все связать...Какая то мысля есть, но  оочень далекая...блестит, но из далека не видно её=(
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Xander от 29 Сентября 2003, 16:17:56
Тушкан
попробуй сесть, и все расписать на бумаге, может помочь.
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Меняздесьдавнонет от 29 Сентября 2003, 16:33:50
Тушкан
Для начала тебе нужно узнать про оператор LIMIT
употребяется в запросе SELECT
ставится САМЫМ последним в запросе.

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

Дальше сам допетришь?
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Тушкан от 30 Сентября 2003, 21:45:56
Такс, помоему меня посчитали за полного идиота и ламера...Извините, наверное не так выразился: про то как выводить я понял...мне не понятно как сделать ссылки внизу на страницы 1, 2, 3, 4...
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Макс от 30 Сентября 2003, 22:01:29
прочитай самое первое сообщение в этой теме.
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Меняздесьдавнонет от 01 Октября 2003, 01:56:50
Цитировать
Тушкан:
Такс, помоему меня посчитали за полного идиота и ламера

До того, как ты это написал - не считали...
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: TopTop от 06 Августа 2004, 08:14:58
Взял код первый - работает почти: Такой вывод нормальный?

 [1]  2  3  4  5 > >>
--------------------------------------------------------------------------------
<< <  1  [2]  3  4  5 > >>
--------------------------------------------------------------------------------
<< <  1  2  [3]  4  5 > >>
--------------------------------------------------------------------------------
<< <  2  3  [4]  5  6 > >>
--------------------------------------------------------------------------------
<< <  3  4  [5]  6  7 > >>
--------------------------------------------------------------------------------
<< <  4  5  [6]  7  8 > >>
--------------------------------------------------------------------------------
<< <  5  6  [7]  8  9 > >>
--------------------------------------------------------------------------------
<< <  6  7  [8]  9  10 > >>
--------------------------------------------------------------------------------
<< <  6  7  8  [9]  10 > >>
--------------------------------------------------------------------------------
<< <  6  7  8  9  [10]
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: TopTop от 06 Августа 2004, 08:22:39
И ещё
У меня та же проблема. Но отличается тем, что мне надо навигацию выделить в отдельный фрейм.

В фрейм 1 выводится по 15-20 записей из массива. Который заполняется запросом из бд на Оракле. Потом идет генерация ссылок в фрейм 2. И вот тут возникает непонятность. Взял скрипт из первого сообщения. Но он работает странно (см предыдущий пост)
Подскажите в чем дело?
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Макс от 06 Августа 2004, 11:59:40
вторая часть скрипта - это пример использования
Я показывал как ведет себя мой код при различных входных данных
Вообщем сначало разберись (если есть желание использовать)

Реальное применение функции get_pages() такое :

$_nav = get_pages($i, $num_of_pages);
    $nav= "";

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

    // output
    echo "
".$nav;
 то есть без цикла


ЗЫ
я уехал на море, так что ближайшую неделю проконсультировать по этому скрипту не смогу
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: Макс от 06 Августа 2004, 12:01:50
вообще весь этот код можно было тоже в функцию впихнуть. Просто я хотел отделить вычисление ссылок от формирования ХТМЛ-кода
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: TopTop от 06 Августа 2004, 12:02:29
Разбираюсь - но чет стока насмотрелся всего что уже не вкуриваю. Или близость отпуска сказывается. Хорошоего прибоя и небольших волн на море :)
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: TopTop от 06 Августа 2004, 12:08:08
Про цикл уже вкурил :) ты просто подтвердил мои опасения :) Спасипа тем более.
Название: Постраничный вывод. Алгоритм составления ссылок на страницы.
Отправлено: TopTop от 06 Августа 2004, 12:46:43
Вопрос в догонку

https://tportal.vaz.ru/tool/Al/navigation.php?start=3351212&start=3351213&start=3351212&start=3351213

Массив ссылок надо очищать? что бы не накапливались эти данные?
ну какие ссылки я кликаю