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


Автор: expr 24.3.2010, 12:01
Доброго всем времени суток.
Поставили задачу доделать веб морду на перловке, а опыта общение с ним у меня нет. Не могу доделать сохранение измененных параметров.
Суть такова: параметры читаются из конфига и выдаются на странице в виде таблички (Параметр | Значение)
allowoverlap    no
context    default
bindport    5060

Количество параметров не постоянно, и в этом то месте я застрял. Попробовал сделать на подобии уже имеющегося кода, но там статическое количество данных :(

Темплейт страницы:
Код

<form action="sip.pl?act=save_com" method="POST">
<table>
    <tr><td width="200">Параметр</td><td width="200">Значение</td></tr>
    <TMPL_LOOP NAME="COMMON">
    <tr><td><input type="text" name="name" value="<TMPL_VAR NAME="NAME">"></td><td><input type="text" name="value" value="<TMPL_VAR NAME="VALUE">"></td></tr>
    </TMPL_LOOP>
    <tr><td><a href="sip.pl?act=edit&part=common&entry=_new">Добавить</a></td><td><input type="submit" value="Сохранить"></td></tr>
</table>
</form>


обрабатывается на данный момент так:
Код

# Filling hash with POST parameters
my @post_params_list = split(/&/,  $ENV{'QUERY_STRING'});
my %post_params_hash = undef;
foreach my $post_param (@post_params_list)
{
    if($post_param =~ /(.+)\=(.+)/)
    {
        $post_params_hash{$1} = $2;
    }
}
# handling various cases
if($post_params_hash{'act'} eq 'save_com')
{
    save_common_hash(
                $cgi_params{'name'},
                $cgi_params{'value'});
}


Пытаюсь разобрать и отобразить принятое:
Код

sub save_common_hash
{
    my $html_t = HTML::Template->new(filename => 'sip_common.tmpl');
    my @loop_data = ();
    my $names = @_[0];
    my $values = @_[1];
    my $name;
    my $value;
    
    foreach $name ($names)
    {
        my %row_data;
        $row_data{NAME} = $name;
        $row_data{VALUE} = $value;
        push(@loop_data, \%row_data);
    }
    $html_t->param(COMMON => \@loop_data);
    print_common_header('Обновленные данные');
    print $html_t->output;
    print $cgi_handle->end_html;
    undef $html_t;
}

но в $name помещаются сразу все имена параметров, разделенные странным символом (в черном ромбе белый знак вопроса).
Возникает вопрос как делать правильно(передавать по другому или как то сплитить, то что принимается)?

Автор: Vaneska 24.3.2010, 14:19
Тебе надо получать параметры скрипта не ручками.
Для этого на CPAN есть куча модулей.
Например так. Это старая технология.
Код

use CGI;

my $q = CGI->new;

@names  = $q->param;

for my $name ( @names ) {
    my $value = $q->param($name);
}



По новому веб сайты делаются с помощью фреймворков:

Проверенные:
http://search.cpan.org/~markstos/CGI-Application-4.31/lib/CGI/Application.pm
http://search.cpan.org/~bobtfish/Catalyst-Runtime-5.80021/lib/Catalyst.pm ( http://search.cpan.org/~hkclark/Catalyst-Manual-5.8004/lib/Catalyst/Manual/Intro.pod )
http://search.cpan.org/~alexmv/Jifty-0.91117/lib/Jifty/Manual/Tutorial.pod

Новые легкие:
http://search.cpan.org/~kraih/Mojolicious-0.999924/lib/Mojolicious/Lite.pm ( мало документации, почти стабильный )
http://search.cpan.org/~sukria/Dancer-1.160/lib/Dancer/Cookbook.pod ( в рунете о нем вообще мало знают, не знаю насчет стабильности )

На CPAN еще кучу можно найти, выбирай что больше понравится и используй. Будет гораздо эффективней, чем самому писать.
Хотя самому тоже надо  для изучания perl и веба






Автор: expr 24.3.2010, 14:26
Спасибо, буду пробовать.

Цитата(Vaneska @  24.3.2010,  14:19 Найти цитируемый пост)
По новому веб сайты делаются с помощью фреймворков:

Проверенные:
CGI::Application
Catalyst ( документация )
Jifty

Новые легкие:
Mojolicious::Lite ( мало документации, почти стабильный )
Dancer ( в рунете о нем вообще мало знают, не знаю насчет стабильности )

На CPAN еще кучу можно найти, выбирай что больше понравится и используй. Будет гораздо эффективней, чем самому писать.


Это да, но
Цитата(expr @  24.3.2010,  12:01 Найти цитируемый пост)
Поставили задачу доделать веб морду

а она не маленькая. Гораздо больше трудозатрат выйдет перетащить на фреймворк, чем маленькую толику добит в том же стиле.

Автор: expr 24.3.2010, 15:17
Код

use CGI;
my $q = CGI->new;
@names  = $q->param;
for my $name ( @names ) {
    my $value = $q->param($name);
}

так только первое значение выдает и все :(

Автор: Vaneska 24.3.2010, 23:44
Так попробуй
Код

$params = $q->Vars;
print $params->{'address'};


Автор: expr 25.3.2010, 12:40
проблема в том, что я заранее не знаю имя параметра.
да и отпало уже, плюнул и переписал все на питоне  smile 

Автор: Vaneska 25.3.2010, 12:54
Цитата(expr @  25.3.2010,  12:40 Найти цитируемый пост)
проблема в том, что я заранее не знаю имя параметра.

А подумать немножко?
Код

$params = $q->Vars;
while( my ( $key, $value ) = each (%$params) ) {

}

Автор: expr 25.3.2010, 16:52
Цитата(Vaneska @  25.3.2010,  12:54 Найти цитируемый пост)
А подумать немножко?

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

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