Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > вывод контента по частям


Автор: shootnix 23.2.2006, 13:16
Здравствуйте. Извините за, кажись, простой вопрос, но что-то я никак не соображу, что к чему.

Итак: есть скрипт, он вытягивает из базы определённую информацию - картинка+описание чего-то там.. Суть вот в чём: нужно, чтобы скрипт выдавал по 10 таких вот частей, а на остальное давал ссылку - 2,3 ну то есть, разделял на части сам и создавал линки. Ну вот как на этом даже вот форуме - делится же здесь на страницы инфа. Только нужно, чтобы это делал сам скрипт динамически.

Количество записей известно в начале. Количество выводимых записей - 10.

Плиз, помогите, нужно как можно быстрее. Кто чем - можно просто алгоритм, можно код smile)

Наверняка же есть уже какие-то стандарты в этих алгоритмах, гостевухи, к примеру, имеют такие фишки.

Автор: korob2001 24.2.2006, 08:59
smile Алгоритм такой:
1. Узнаём кол-во записей в БД.
2. Если нам нужно выводить по 10 сообщений на страницу, значит делим на 10, в итоге узнаём сколько ссылок нужно генерировать.
3. Узнаём остаток от деления общего кол-ва сообщений, на кол-во сообщений на страницу, т.е. 10. Если остаток есть значит добавляем ещё одну страницу, к кол-ву страниц.
4. Если сообщений больще чем, кол-во на страницу, генерируем ссылки myscript.pl?page=$count .

Вобще-то это сложно объяснить словами, но здесь я уже приводил пример разбивки на страницы, гостевой книги. Правда там вся инфа хранилась в текстовом файле, с базой же всё гораздо проще. Вот эта тема:
http://forum.vingrad.ru/index.php?showtopic=65789

Автор: shootnix 24.2.2006, 10:21
Спасибки. Буду разгебать smile

Автор: korob2001 24.2.2006, 10:25
Если не разберёшься, то пиши. Напишу пример разбивки на страницы с использованием БД. Просто сейчас времени в обрез.

Автор: igorold 27.2.2006, 16:13
Держи мой пример:

Код

    my $page = GetCGI("page");
    if ($page==0) {
        $page=1;
    }
    my $step=10;
    my $GetMax = RunQuery($dbh, "SELECT count(*) FROM Guestbook WHERE Podgr='1' and Flag<>'1'");
    my $Max_Gr = $GetMax->fetchrow_array();
    $GetMax->finish();
    my $Max_Page = int($Max_Gr/$step);
    if ($Max_Page*$step < $Max_Gr) {$Max_Page++};
    my $Gr1 = $step*($page-1);

    $Result = RunQuery($dbh, "SELECT Gruppa FROM Guestbook WHERE Podgr='1' ORDER BY Gruppa desc limit $Gr1, $step");
    my $Gr2=0;
    while (my @ReturnedData = $Result->fetchrow_array()) {
        if ($Gr2==0) { $Gr2=$ReturnedData[0]; }
        else         { $Gr1=$ReturnedData[0]; }
    }
    $Result->finish();
    my $Query = "SELECT G.Gruppa, G.Podgr, Description, CONCAT(U.Surname, ' ', U.Name) AS ini, DATE_FORMAT(MakeDate, '%d.%m.%Y - %T') as Data ";
    $Query = $Query . "FROM Guestbook G LEFT JOIN Users U ON G.UserID=U.i ";
    $Query = $Query . "WHERE G.Gruppa>='$Gr1' and G.Gruppa<='$Gr2' and Flag<>'1' ORDER BY G.Gruppa desc, G.Podgr";
    my $Content=GetArrayOfHashes($dbh, $Query);
    my %Params =
    (
        page            => $page,
        Max_Page        => $Max_Page,
        UserRights      => $UserRights,
        ApachePath      => $ApachePath,
        Table           => $Content
    );
    my $Result='';
    $template->process('gb.tmpl', \%Params, $Result);
    print $Result;

это скриптовая часть,

а вот что в файле gb.tmpl :
Код

<table border=0 cellpadding=0 cellspacing=0 width=100%>
    <tr><td><div align=center>
    [% Nom=0 %]
    [% WHILE Nom<Max_Page %]
        [% Nom=Nom+1 %]
        [% IF Nom == page %]
          &nbsp;[% Nom %]&nbsp;
        [% ELSE %]
          <A href="[% ApachePath %]/support.pl?MainModule=Guest&page=[% Nom %]&Level=0">&nbsp;[% Nom %]&nbsp;</A>
        [% END %]
    [% END %]
    </tr>
</table>

Добавлено @ 16:23
У меня встречный вопрос к спецам: номера отображаемых групп в моем примере я вычисляю так:
Код

    $Result = RunQuery($dbh, "SELECT Gruppa FROM Guestbook WHERE Podgr='1' ORDER BY Gruppa desc limit $Gr1, $step");
    my $Gr2=0;
    while (my @ReturnedData = $Result->fetchrow_array()) {
        if ($Gr2==0) { $Gr2=$ReturnedData[0]; }
        else         { $Gr1=$ReturnedData[0]; }
    }
    $Result->finish();

а нельзя как-то попроще, чтобы эти данные выдавались в массив и потом без всяких циклов обращаться к элементам [0] и [-1]
(т.е. к первому элементу массива и к последнему)

Автор: korob2001 24.8.2006, 21:06
igorold - ивиняюсь, я просто сразу не заметил твоего вопроса, в конце последнего поста. Потому если ты ещё не решил проблему, давай к нему вернёмся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)