Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите плиз!!!! Разбиение на страницы!!! Разбиение на страницы 
:(
    Опции темы
fregat
Дата 24.8.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Уважаемые Господа программисты!!!

Прошу вас подсказать как сделать на основе данного скрипта разбиение на страницы, то есть по 10 записей на страницу...  | 1 | 2 | 3 |
Код

#!/usr/bin/perl

print "Content-type: text/html\n\n";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
if (!$buffer) {
 $buffer=$ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $form{$name} = $value;
}

$id = $form{'news'};
$file="news.txt";

open (NEWS1, "$file");
@list=<NEWS1>;
close (NEWS1);
#@list=(@list);
@list=reverse(@list);
#@list=(@list);
for ($i=0;$i<@list;$i++)
  {
         ($data,$news)=split(/|/,$list[$i]); 

print "<div align=\"center\">";
print "<table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"blacktext13\">";
print "<tr><td width=\"200\" valign=\"top\"><p style=\"margin-top: 15px; margin-left:30px\"><font color=\"#CC0000\">$data</font></td>";
print "<td width=\"100%\" valign=\"top\"><p style=\"margin-right: 30px; margin-left: 15px; margin-top:15px\">$news</td>";
print "</tr></table></div>\n";

}

Заранее благодарен..........

Это сообщение отредактировал(а) korob2001 - 24.8.2006, 13:10
PM MAIL   Вверх
korob2001
Дата 24.8.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Посмотри вот этот пост, особенно обрати внимание на коментарии.
http://forum.vingrad.ru/index.php?showtopic=65789

Модератор: пользуйся кнопкой "Код", для вставки кода. Тем самым ты сохранишь его форматирование, плюс подсветишь его.

Это сообщение отредактировал(а) korob2001 - 24.8.2006, 13:12


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
fregat
Дата 24.8.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Учту замечания по поводу кода............

Посмотрел пост (showtopic=65789) неужели код для разбивки такой здоровый...
поставил свои переменные - на страницы не разбивает.... просто выводит все из файла.......
PM MAIL   Вверх
fregat
Дата 24.8.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.1.2006

Репутация: нет
Всего: нет




Не могу вьехать........


Код

#!/usr/bin/perl

print "Content-type: text/html\n\n";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
if (!$buffer) {
 $buffer=$ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $form{$name} = $value;
}

$id = $form{'news'};
$file="news.txt";

open (NEWS1, "$file");
@list=<NEWS1>;
close (NEWS1);
for ($i=0;$i<@list;$i++)
  {

#################################################
# Несколько переменных для разбивки на страницы #
#################################################
my $start_mess = $form_data{'ms'} || 1;
$start_mess = 1 unless $start_mess =~ /^[0-9]+$/;
my $stop_mess  = $start_mess + $mstopage;
$mstopage     = 5; 
my @pages = ();
my $pag_count = 0;
my $cnt_pg = 1;
my $count  = 0;
my $mess_count = 0;

foreach $list (reverse @list){
#####################################################
# Разбиваем на страницы                             #
#####################################################
++$mess_count;
++$count;

if ( $count == $start_mess ) {
             $pag_count++;
             push( @pages, "<b>$pag_count</b>" );
             $cnt_pg += $mstopage;
             $mess_count = 0;
} elsif ( $mess_count == $mstopage ) {
             $pag_count++;
             push(@pages, "<a href='$ENV{SCRIPT_NAME}?ms=$cnt_pg'>$pag_count</a>");
             $cnt_pg += $mstopage;
             $mess_count = 0;
}

next if ( ( $count < $start_mess ) || ( $count >= $stop_mess ) );


($data,$news)=split(/::/,$list[$i]);
 

print "<div align=\"center\">";
print "<table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"blacktext13\">";
print "<tr><td width=\"200\" valign=\"top\"><p style=\"margin-top: 15px; margin-left:30px\"><font color=\"#CC0000\">$data</font></td>";
print "<td width=\"100%\" valign=\"top\"><p style=\"margin-right: 30px; margin-left: 15px; margin-top:15px\">$news</td>";
print "</tr></table></div>\n";

}    

#####################################
# Выводим ссылки, на страницы       #
#####################################
print join(" | ", @pages);


}


При выводе получается вот что....

1 | 2 | 3
08.12.2004  2 
08.12.2004  2 
08.12.2004  2 
08.12.2004  2 
08.12.2004  2 
1 | 2 | 3
20.12.2004  3 
20.12.2004  3 
20.12.2004  3 
20.12.2004  3 
20.12.2004  3 
1 | 2 | 3

и.т.д

Техтовый файл:

02.12.2004:: 1 
08.12.2004:: 2
20.12.2004:: 3
27.12.2004:: 4
12.01.2005:: 5
02.12.2004:: 6
02.12.2004:: 7 
08.12.2004:: 8
20.12.2004:: 9
27.12.2004:: 10
12.01.2005:: 11
02.12.2004:: 12 




Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  news.pl 2,19 Kb
PM MAIL   Вверх
korob2001
Дата 24.8.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



1. Конфигурационные переменные, пишутся, как правило в начале файла. Тебе же потом будет удобнее их настраивать. Так что запиши переменные в самом начале файла, сразу за последним use, если они у тебя есть, если нет, значит после строки #!/usr/bin/perl:
Код

my $mstopage     = 5; # Кол-во сообщений на страницу
my $file         = "news.txt"; # Файл с сообщениями


2. Заметь, что у тебя 2 цикла, а нужен один. Убери наружный цикл for. Не забудь убрать в конце скобку которая к нему относится.

3. Раз уж мы убрали for, то измени все переменные где есть индекс соответствующим образом. Т.е. вместо этого:
Код

($data,$news)=split(/::/,$list[$i]);

пишешь просто:
Код

($data,$news)=split(/::/,$list);

Думаю теперь ты понял, почему ты получал такой результат?
На каждой итерации наружного цикла for ты выводил нужное кол-во записей на страницу и делал это врутренний цикл foreach. Так как наружный цикл, так же как внутренний проходят по каждой записи, потому у тебя и получилось такое же кол-во блоков, сколько и записей в файле:
Код

20.12.2004  3 
20.12.2004  3 
20.12.2004  3 
20.12.2004  3 
20.12.2004  3 
1 | 2 | 3

Так как ты разбивал переменную не внутреннего цикла $list, а наружного $list[$i], потому и получалось так, что при выводе каждого блока в переменной $news был не верный номер строки, а в переменной $data не верная дата. Точнее они были верными, но для наружного цикла.  
Цитата

Посмотрел пост (showtopic=65789) неужели код для разбивки такой здоровый...

Код здоровый из-за того, что всё приходится подсчитывать вручную, так как сообщения находятся в файле, а не в БД. Код разбивки для вывода из базы данных, был бы меньше.
Во вторых я не стремился его сократить, та как главное что бы человек понял принцип.

PS: Так же рекомендую пользоваться всегда прагмой компилятора strict. Хорошие привычки нужно вырабатывать с самого начала. Но это так, совет можешь и не обращать на него внимания, если считаешь, что ты прав. ;)))))

Это сообщение отредактировал(а) korob2001 - 24.8.2006, 21:18


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
fregat
Дата 24.8.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



После изменений выводит следующие....

02.12.2004  12 
12.01.2005  11 
27.12.2004  10 
20.12.2004  9 
08.12.2004  8  

1 | 2 | 3


Как я понял это первая страница... Но при переходе на страницу 2 или 3 ничего не происходит... т.е. 

02.12.2004  12 
12.01.2005  11 
27.12.2004  10 
20.12.2004  9 
08.12.2004  8 

Может я чего не так сделал....

 #for ($i=0;$i<@list;$i++)



PM MAIL   Вверх
korob2001
Дата 24.8.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



А ну да, вот здесь:
Код

my $start_mess = $form_data{'ms'} || 1;

У тебя нет хеша %form_data, у тебя он называется %form. Потому:
Код

my $start_mess = $form{'ms'} || 1;

Т.е. ты не получал параметра, который передаёт номер сообщения, потому всегда оставался на первой странице, по умолчанию. Об этом бы тебе сообщила прагма strict если бы ты её использовал.

Это сообщение отредактировал(а) korob2001 - 24.8.2006, 21:38


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
fregat
Дата 24.8.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



ОК... Спасибо огромное.... 

$form_data - это мой косяк, пропустил.....  smile 

Все работает.... только мне кажется немного тормозит.......

Еще раз СПАСИБО.....
PM MAIL   Вверх
korob2001
Дата 24.8.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Ну вообще-то тормозить ему пока несчего, так как файл у нас не очень большой.
Но в принципе можно доработать алгоритм, тем более ты всё равно читаешь весь файл в массив, потому тебе заранее известно общее кол-во записей. Этот вариант хорошо подходит для построчного вывода из файла, когда общее кол-во записей в файле не известно заранее.

В добавок ко всему, если ты читаешь весь файл в память, то ты скорее убъёшь её, чем этот код начнёт реально тормозить. Подумай о том, что бы исправить свой код для построчного вывода из файла, например вот таким циклом:
Код

#!/usr/bin/perl -w
use strict;


open(DATA, "<news.txt") or die "Can't open file 'news.txt': $!";

while (my $line = <DATA>) {


}

close(DATA);

C другой стороны, не получится обернуть файл в обратном направлении. Но опять же, можно создать не текстовый файл, а с байтовыми блоками. Потом при открытии переходить в конец файла и читать эти блоки в обратном направлении, скажем по 2048 байт каждый блок, но можно сделать и больше размер блока.

Это сообщение отредактировал(а) korob2001 - 24.8.2006, 22:03


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.