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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl и Ajax, Передача данных в другую функцию 
V
    Опции темы
Marlik
Дата 28.5.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет, есть образец CGI::Ajax модуля:

Код

use strict;
  use CGI;      
  use CGI::Ajax;

  my $cgi = new CGI;
  my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

  print $pjx->build_html( $cgi, \&Show_HTML);

  sub perl_func {
    my $input = shift;
    # тут проверяем что ввели, введенные данные хочется потом использовать в форме,
    # в функции Show_HTML
    return( $input );
  }

  sub Show_HTML {
    my $html = < <EOHTML;
     <html>
     <body>
     Введите что-нибудь:
     <input type="text" name="val1" id="val1"
     onkeyup="exported_func( ['val1'], ['resultdiv'] );">
     <div id="resultdiv"></div>
<form>
  # сюда бы вставить данные полученные из perl_func
</form>
     </body>
     </html>
    EOHTML
    return $html;
  }
  


Как можно в функции Show_HTML получить параметры из  perl_func?
Может где можно почитать, на русском желательно. Или есть альтернатива? Спасибо.


PM WWW Skype   Вверх
Pfailed
Дата 28.5.2011, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По вашему при выполнении perl_func выполняется Show_HTML? Я не использовал этот модуль, но по логике вещей, она не выполняется. 
Как я понимаю Show_HTML выполняется при генерации страницы, а perl_func при ответе на ajax запрос. А значит и получать параметры из perl_func бессмысленно.


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


Бывалый
*


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

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



Я просто не очень знаком с этим модулем, поэтому и заинтересовался, вот ссылка, я в английском не очень силен, а русский перевод оставляет желать лучшего. Как будто автор просто переводил текст, и не вникал в это. Может кто на форуме использует CGI::Ajax?

Простая задачка, подумал что на CGI::Ajax смогу реализовать. Взять данные из формы, проверить и выдать форму с этим значением в скрытом поле, без перезагрузки страницы. Такое реально? Спасибо.
PM WWW Skype   Вверх
EcSYZ
Дата 28.5.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Честно говоря, как работает CGI::Ajax не знаю, но более чем уверен, что никакой модуль на перле не сделает то, что нужно делать самостоятельно руками.
PM MAIL WWW   Вверх
Marlik
Дата 28.5.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да очень просто, на CGI это выглядит так -  в текстовое поле воткнул данные и только после перезагрузки всей страницы скрипт проверит данные, сгенерит форму и покажет юзеру. Это не хорошо потому как полей в форме может быть много, еще и капча. А CGI::Ajax может асинхронно проверять данные введенные в каждое поле без перезагрузки страницы. Просто привязываешь определенные функции к каждому полю, для проверки. В принципе просто. Интересует только передача данных из проверяющей функции в функцию которая генерит страничку. Спецов по CGI::Ajax нет?
PM WWW Skype   Вверх
Pfailed
Дата 28.5.2011, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Marlik @ 28.5.2011,  21:00)
Я просто не очень знаком с этим модулем, поэтому и заинтересовался, вот ссылка, я в английском не очень силен, а русский перевод оставляет желать лучшего. Как будто автор просто переводил текст, и не вникал в это. Может кто на форуме использует CGI::Ajax?

Простая задачка, подумал что на CGI::Ajax смогу реализовать. Взять данные из формы, проверить и выдать форму с этим значением в скрытом поле, без перезагрузки страницы. Такое реально? Спасибо.

Судя по приведённому примеру реально.

Добавлено через 3 минуты и 33 секунды
Цитата(Marlik @  28.5.2011,  21:42 Найти цитируемый пост)
Интересует только передача данных из проверяющей функции в функцию которая генерит страничку. Спецов по CGI::Ajax нет? 

Вам нужен спец по здравому смыслу. Зачем передавать данные из проверяющей функции в функцию которая генерит страничку?


--------------------
PM MAIL   Вверх
Marlik
Дата 28.5.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pfailed @ 28.5.2011,  21:43)
Добавлено @ 21:46
Цитата(Marlik @  28.5.2011,  21:42 Найти цитируемый пост)
Интересует только передача данных из проверяющей функции в функцию которая генерит страничку. Спецов по CGI::Ajax нет? 

Вам нужен спец по здравому смыслу. Зачем передавать данные из проверяющей функции в функцию которая генерит страничку?

Потому что данные взятые из текстового поля будут использованы в новой генеренной форме, для простого CGI, запрос надо отправлять два раза, а требуется один раз. Юзер ввел число и нажал на submit, в это время когда он ввел число и сгенерилась новая страничка со сгенеренной формой где в hidden число введеное юзером. Пример капчи, есть капчи в которых если не разобрал буковок, капчу перезагрузил, а страница не изменилась. Это как образец CGI::Ajax приложения.

Добавлено через 1 минуту
Может есть другие модули, похожие?
PM WWW Skype   Вверх
EcSYZ
Дата 28.5.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я могу подкинуть довольно простую идею на jQuery+AJAX если интересно.
PM MAIL WWW   Вверх
Marlik
Дата 28.5.2011, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Интересно, подкидывай, а то пора уже тему закрывать.
PM WWW Skype   Вверх
EcSYZ
Дата 28.5.2011, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот просто jQuery модуль, позволяющий брать данные из формы и передавать их скрипту без перезагрузки страницы:
jquery.iframe-post-form.min.js

И парой строчек привязываем сабмит формы к этому модулю:
Код

$(document).ready(function(){
    $("form#form_XXX").iframePostForm({
        complete : function (response)
        {
            var jsondata = jQuery.parseJSON( response );
            if(jsondata.status == 'ok') {
                alert('OK');
            } else {
                alert('Failed');
            }
        }
    });
});


Так что можно возвращать JSON ответ следующего вида:
Код

если всё ок
{
   "status": "ok",
   "html": "тут новый код для нашей страницы"
}

или если в форме не правильные данные
{
   "status": "failed"
}


Так что если в ответе статус будет "ок", то просто берём и заменяем нашу форму на код пришедший в ответе.
PM MAIL WWW   Вверх
Marlik
Дата 29.5.2011, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо конечно, но как-то это сложно. Я ведь через Ajax передаю запросы в функции Перл они делают всякие различные проверки, на стороне сервера, я конечно не уверен, но мне кажется jQuery  работает случайно не на стороне клиента?

В принципе, как вариант, если я смогу в функцию Перл получить данные через Ajax запрос, то что мне мешает  засунуть данные в БД, а в другой функции достать? Надо поэкспериментировать. 
PM WWW Skype   Вверх
Pfailed
Дата 29.5.2011, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Marlik, похоже вы не понимаете принципов работы ajax.
Ниже еще 1 пример. На событие onchange происходит проверка, что в поле введена цифра и меньше ли она ста. После проверки рядом с полем выводится соответствующее сообщение. Просто запустите этот пример и станет понятно как оно работает.
Код

#!/usr/bin/perl

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Ajax;
use strict;

my $cgi = CGI->new();
my $ajax = CGI::Ajax->new(check_form => \&ajax_check_form);

print $ajax->build_html($cgi, \&ajaxed_html), $cgi->end_html;

sub ajaxed_html {
    $cgi->start_html .
    <<HTML;
    <input type="text" name="digit" id="digit" 
    onchange="check_form(['digit'], ['cres'])" />
    <span id="cres"></span>
HTML
}

sub ajax_check_form {
    my $input = shift;
    return "<font color='red'>no digit</font>" if $input !~ /^\d+$/;
    return "<font color='red'>$input &gt; 100</font>" if $input > 100;
    return "<font color='green'>OK</font>";
}




--------------------
PM MAIL   Вверх
Marlik
Дата 29.5.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, за пример. То-же самое только сзади. Вот в том-то и дело что понимаю, так мне надо расширенный вариант Ajax. Вопрос уже не о том как работает Ajax, а как расширить возможности или найти альтернативу. Представьте себе ситуацию, я прошу юзера ввести данные, затем я их проверяю, и если все o key! показываю другую форму и предлагаю нажать кнопку на форме, для отправки данных. Ну так это бред!!! Хочется все делать сразу одним кликом на мышке, а не двумя.

Добавлено через 4 минуты и 48 секунд
Для большего понимания, мне нужно взять в вашем примере переменную $input после проверки в функции ajax_check_form и передать значение переменной $input в функцию ajaxed_html и там при построении странички использовать значение $input. Спасибо, тему пора закрывать.
PM WWW Skype   Вверх
EcSYZ
Дата 29.5.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все JS замуты делаются только руками, и никак уж не перловыми модулями. Так что либо мой наипростейший вариант на jQuery, либо никак вообще  smile 
PM MAIL WWW   Вверх
Pfailed
Дата 29.5.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Marlik,  smile 
Предлагаю нормальный вариант. При генерации страницы генерируется сколько нужно форм. Первая делается видимой, остальные нет.
Смотрим раздел "Sending Perl Subroutine Output to a Javascript function" в документации CGI::Ajax. Создаем JavaScript функцию через которую будут проходить все ответы ajax_check_form(). В зависимости от прешедших данных она скрывате текущую форму и делает видимой следующую или указывает пользователю на ошибки ввода.

Добавлено через 3 минуты и 7 секунд
Цитата(Marlik @  29.5.2011,  13:56 Найти цитируемый пост)
Для большего понимания, мне нужно взять в вашем примере переменную $input после проверки в функции ajax_check_form и передать значение переменной $input в функцию ajaxed_html и там при построении странички использовать значение $input. 

Поймите, что функция ajaxed_html выполняется только 1 раз, при открытии страницы. В ответах на ajax запросы она никак не участвует.


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


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

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


 




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


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

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