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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая страница, Как сделать что-бы она появилась раз? 
:(
    Опции темы
r
Дата 1.9.2005, 23:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Суть проблемы вот в чем, скрипт генерит формы, всякие html страницы показывает, и что самое плохое, пользователь может нажать в браузере кнопочку и вернутся скажем на предыдущую форму. Это не есть гуд. Я задавал уже этот вопрос, и мне посоветовали обратится к модулю Session.pm, модуль впендюрил в проект, вот только теперь не знаю как его использовать с этой целью. Подскажите как нормальные люди так делают? smile
  Вверх
sharq
Дата 2.9.2005, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



r можешь отключить или заблокировать запись в журнал посещений, т.е. кнопочку назад, с помощью js.
С помощью модуля CGI::Session можешь запоминать посещенные страницы пользователем, записывая инфо в сессию, а дальше с этой инфой можешь делать все что захочешь: блокировать, создавать самому ссылку назад на перезагрузку страницы и т.п.
Читай CGI::Session::Cookbook, там есть пример сохранения истории в сессию.

smile
Добавлено @ 00:10

Пора зарегистрироваться!!!



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
r
Дата 2.9.2005, 00:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(sharq @ 2.9.2005, 00:09)
Пора зарегистрироваться!!!

А какой смысл? В инете редко бываю когда деньги на мобиле есть. smile Спасибо за ответ.
  Вверх
r
Дата 2.9.2005, 17:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(sharq @ 2.9.2005, 00:09)
r можешь отключить или заблокировать запись в журнал посещений, т.е. кнопочку назад, с помощью js.
С помощью модуля CGI::Session можешь запоминать посещенные страницы пользователем, записывая инфо в сессию, а дальше с этой инфой можешь делать все что захочешь: блокировать, создавать самому ссылку назад на перезагрузку страницы и т.п.
Читай CGI::Session::Cookbook, там есть пример сохранения истории в сессию.

smile
Добавлено @ 00:10

Пора зарегистрироваться!!!

Извини, как заблокировать запись?
А если у него js не поддерживаются?
Покажи небольшой кусок кода как блокировать, а то моя твоя не понимай. smile Спасибо.
  Вверх
r
Дата 8.9.2005, 19:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В принципе, можно выдавать пользователю код 204, и тогда страница не появится. Но проблемма у меня вот в чем, у меня постоянно выдается один и тот-же заголовок:
Код

#!C:\perl\bin\perl -w
use strict;
use CGI;
my $cgi = new CGI;

sub form_1{
...
}

sub form_2{
...
}

sub form_3{
...
}

print $cgi->header(-charset =>'Windows-1251');

if( defined $cgi->param('form_1') ) {
form_1;
} elsif ( defined $cgi->param('form_2') ) {
 form_2;  
}else {
form_3;
};


Можно конечно заблокировать одну из форм, но как этак извратится? smile
  Вверх
korob2001
Дата 8.9.2005, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А что за проблема с заголовком? Вот твоё условие в конце программы:
Код

# Следующий заголовок удаляем.
# print $cgi->header(-charset =>'Windows-1251');

if( defined $cgi->param('form_1') ) {
    # Здесь заголовок 1
    form_1;
} elsif ( defined $cgi->param('form_2') ) {
    # Заголовок 2
    form_2;  
}else {
    # Перенаправление
    form_3;
};

После этого, твоя программа будет возвращать заголовок в зависимости от условия. Или я вопроса не понял???


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


Unregistered











Я рад что ты появился, сейчас попробую.
  Вверх
korob2001
Дата 8.9.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Я рад что ты появился, сейчас попробую.

Пробуй.
Да у меня с инетом возникли недоразумения. Неделю как на необитаемом острове просидел. smile


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


Unregistered











Что-то не получается, конечно получается вставить заголовок в каждую форму это уже плюс, при загрузке первой формы я кладу имя этой формы в сессию, если конечно там ее нет, далее вызывается вторая форма, затем нажимаю на браузере кнопку перехода назад, вижу первую форму и нажимаю на submit и smile данные оправляются еще раз. Они правда повторно не пишутся в сессию, но все равно неправильно показывать пользователю старые заполненые формы. Тем более попадется какой-нибудь даун как начнет на все подряд жать. Вот задал вопрос на js форуме как у браузера кнопку отключить для начала.
Код

#!C:\perl\bin\perl -w
use strict;
use CGI;
my $cgi = new CGI;

sub form_1{
...
}

sub form_2{
...
}


sub form_3{
my $form = "form_3";
my $sess_ID = new CGI::Session("driver:File", undef, {Directory=>'../publik_html/session/'});
my $header = $sess_ID -> param('form'); 
if ($header eq $form ){
print $cgi -> redirect(-url=>'mmm');
}
print $cgi -> header;
...
}

print $cgi->header(-charset =>'Windows-1251');

if( defined $cgi->param('form_1') ) {
form_1;
} elsif ( defined $cgi->param('form_2') ) {
 form_2;  
}else {
form_3;
}; 
 

  Вверх
korob2001
Дата 9.9.2005, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А как ты поля формы создаёшь? Если с CGI.pm, то прописывай каждому полю параметр override.
Код

print $cgi->textfield( -name => 'user',
                       -size => 25,
                       -maxlength => 50,
                       -override => 1 );                            

Я так понимаю, что ты хочешь избежать повторной отправки формы? Так же на JS, сразу же на событии onMouseUp блокируй кнопку отправки. Вот небольшой пример такой формы:
Код

<html>
 <head>
  <title>Test form</title>
 </head>
 <body bgcolor="#cccccc" onLoad="location: history.forward()">
  <form action="/cgi-bin/test.pl" method="POST" name="test">
   <input type="text" size="30" maxlength="50">
   <!--// Здесь остальные поля формы //-->
   <input type="submit" value="Отправить" name="send" onMouseUp="this.disabled=true">
   <input type="reset" value="Очистить">
  </form>
 </body>
</html>

Здесь сразу же после нажатия блокируется кнопка отправки сообщения и если пользователь жмёт кнопку назад, то его автоматом перекидывает на текущую страницу, т.е. путь назад закрыт. Поэксперементируй, правда я не стал переписывать это всё на манер CGI.pm, думаю ты и сам с этим прекрасно справишься.

Это сообщение отредактировал(а) korob2001 - 9.9.2005, 02:57


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


Unregistered











Не, фигня какая-то, так и не понял куда и что пихать, мне вот подсказали запретить браузеру кешировать результат, а это как? Спасибо.
  Вверх
korob2001
Дата 11.9.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так, давай сначала и по порядку. Насколько я понял, ты хочешь создать Multi форму и тебе нужно сделать что бы при переходе к каждой последующей форме пользователь не мог вернуться к пред идущей. Я правильно понимаю задачу? Если да, попробуй такой, не большой, пример:
Код

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

my $cgi = new CGI;



sub first_form {
    print $cgi->h3("Форма 1");
    print $cgi->start_form();
    print $cgi->b("Ваше имя:");
    print $cgi->textfield( -name => 'name',
                           -override => 1 );  # Очищаем поле после отправки
    print $cgi->submit( -name => 'send1', -value => 'Далее' );
    print $cgi->end_form();
}

sub second_form {
    print $cgi->h3("Форма 2");
    print $cgi->start_form();
    print $cgi->b("Фамилия:");
    print $cgi->hidden( -name => 'name', -value => $cgi->param('name') );
    print $cgi->textfield( -name => 'surname',
                           -override => 1 ); # Очищаем поле после отправки
    print $cgi->submit( -name => 'send2', -value => 'Далее' );
    print $cgi->end_form();
}

sub third_form {
    print $cgi->h3("Форма 3");
    print $cgi->start_form();
    print $cgi->b("Ваш E-mail:");
    print $cgi->hidden( -name => 'name', -value => $cgi->param('name') );
    print $cgi->hidden( -name => 'surname', -value => $cgi->param('surname') );
    print $cgi->textfield( -name => 'mail',
                           -override => 1 ); # Очищаем поле после отправки
    print $cgi->submit( -name => 'send3', -value => 'Отправить' );
    print $cgi->end_form();
}

sub success {
    print $cgi->h3( { -style => "color: #aa0000" }, "Получены следующие данные:");
    print $cgi->b("Имя: ");
    print $cgi->font( $cgi->param('name') );
    print $cgi->br();
    print $cgi->b("Фамилия: ");
    print $cgi->font( $cgi->param('surname') );
    print $cgi->br();
    print $cgi->b("E-mail: ");
    print $cgi->font( $cgi->param('mail') );
}


print $cgi->header( -charset => 'Windows-1251' );
# Так как все подпрограммы будут генерировать HTML и мы достаточно ленивы
# выводим верхнюю часть страницы только 1 раз
print $cgi->start_html( -title => 'Test',
                        -onLoad => "history.forward()" ); # <--| Запретим пользователю возврат

if ( defined $cgi->param('send1') ) {
     second_form();
} elsif ( defined $cgi->param('send2') ) {
     third_form();
} elsif ( defined $cgi->param('send3') ) {
     success();
} else {
     first_form();
}

# Также поступим и с нижней частью документа
print $cgi->end_html();

Здесь пользователь должен заполнить 3 формы, в каждой из которых по одному полю. Когда заполнишь хотя бы одну и нажмёшь кнопку "Далее", попробуй вернуться к предидущей.


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


Unregistered











Да блин, пашет здорово пашет. А если будут отключены js?

P.s. Да, ты все-таки по моему мнению лучший специалист. Спасибо.
  Вверх
korob2001
Дата 14.9.2005, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

А если будут отключены js?

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

P.s. Да, ты все-таки по моему мнению лучший специалист.

Спасибо, я аж застеснялся. smile


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


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



JavaScript - это хорошо, но для полной уверенности необходимо проверять самому (на сервере) данные перед их записью. Например, чтобы один и тот же пользователь не мог каждую секунду редактировать данные, поставить ограничение на редактирование - т.е. защита от так называемого флуда.
Проверка может быть как раз через сессии.
Но это уже лирика.

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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