Как мне включить frameset в CGI.pm? - PullRequest
1 голос
/ 23 апреля 2010

Я хочу иметь cgi-скрипт, который делает две вещи.

  1. Возьмите данные из формы.
  2. Создание результатов на основе входных значений в кадре.

Я также хочу, чтобы кадр существовал только после того, как результат сгенерирован / напечатан.

Ниже приведен упрощенный код того, что я хочу сделать. Но почему-то это не работает. Как правильно это сделать?

    #!/usr/local/bin/perl

    use CGI ':standard';

    print header;
    print start_html('A Simple Example'),
        h1('A Simple Example'),
        start_form,
        "What's your name? ",textfield('name'),
        p,
        "What's the combination?",
        p,
        checkbox_group(-name=>'words',
               -values=>['eenie','meenie','minie','moe'],
               -defaults=>['eenie','minie']),
        p,
        "What's your favorite color? ",
        popup_menu(-name=>'color',
               -values=>['red','green','blue','chartreuse']),
        p,
        submit,
        end_form,
        hr;

    if (param()) {

        # begin create the frame

print <<EOF;
<html><head><title>$TITLE</title></head>
<frameset rows="10,90">
<frame src="$script_name/query" name="query">
<frame src="$script_name/response" name="response">
</frameset>
EOF

# Finish creating frame


        print 
        "Your name is: ",em(param('name')),
        p,
        "The keywords are: ",em(join(", ",param('words'))),
        p,
        "Your favorite color is: ",em(param('color')),
        hr;
    }
    print end_html;

Ответы [ 4 ]

3 голосов
/ 23 апреля 2010

HTML-фрейм ссылается на другие документы.Вы не создаете их все за один раз и отправляете их всем агенту пользователя в одном ответе.Распечатайте только фрейм-набор и ссылки на фреймы, и браузер выполнит дополнительную работу для выборки каждого фрейма отдельно.

Узнайте, как работают фреймы:

2 голосов
/ 02 мая 2010

Аскер говорит:

Я также хочу, чтобы фрейм существовал только после того, как результат был сгенерирован / напечатан.

Это делает это сложно, несмотря на то, что CGI.pmдействительно есть поддержка кадров.Вы не указали, почему хотите использовать набор фреймов, поэтому вам придется решить, стоит ли использовать подход с набором фреймов.

Один из вариантов - подделать его со скрытой фреймом..

Возможно, вам понадобится посмотреть:

  1. Сначала посмотрите здесь о поддержке CGI.pm для фреймов
    Doc - http://stein.cshl.org/WWW/CGI/#frames
    Пример - http://stein.cshl.org/WWW/CGI/examples/frameset.txt
    Попробуйте - http://stein.cshl.org/WWW/CGI/examples/frameset.pm

    Эффективно использовать кадры может быть сложно.Чтобы создать правильный набор фреймов, в котором запрос и ответ отображаются рядом, необходимо разделить сценарий на три функциональных раздела.Первый раздел должен создать объявление и выйти.Второй раздел отвечает за создание формы запроса и направление ее в один фрейм.Третий раздел отвечает за создание ответа и направление его в другой фрейм.

  2. См. Эту ссылку для динамического изменения набора фреймов:

    Одна ссылка -http://www.codeguru.com/forum/archive/index.php/t-373259.html
    Другие ссылки - http://www.google.com/search?q=javascript+dynamically+resize+frameset+cols

    a.Итак, сначала вы сначала создадите набор фреймов, но скроете фрейм ответа:

    <frameset rows="100%,*">`  
    

    b.Затем позже используйте JavaScript для динамического изменения размера фреймов.Используя в качестве примера код из http://stein.cshl.org/WWW/CGI/examples/frameset.txt, вам нужно изменить подпрограмму print_response для вывода javascript, чтобы изменить набор фреймов для изменения размеров фреймов (т. Е. Предоставить скрытый фрейм ответа):

    parent.document.getElementsByTagName("FRAMESET").item(1).cols = '10,90';
    
1 голос
/ 02 мая 2010

Аскер говорит:

Я также хочу, чтобы кадр существовал только после того, как результат будет сгенерирован / напечатан.

Это усложняет задачу, несмотря на то, что CGI.pm поддерживает фреймы. Вы не указали, почему хотите использовать набор фреймов, поэтому вам придется решить, стоит ли использовать подход с набором фреймов.

Вам необходимо использовать условные выражения и дополнительную информацию для управления тем, что выводится, когда: при печати формы запроса, при печати набора кадров и при печати отдельных кадров. Хитрость заключается в том, чтобы вывести набор фреймов в нужное время с фреймами, указанными назад в скрипте с помощью pathinfo, чтобы указать, какой HTML / фрейм вывести.

Во-первых, о поддержке кадров CGI.pm можно узнать здесь:

Эффективно использовать кадры может быть сложно. Чтобы создать правильный набор фреймов, в котором запрос и ответ отображаются рядом, необходимо разделить сценарий на три функциональных раздела. Первый раздел должен создать объявление и выйти. Второй раздел отвечает за создание формы запроса и направление ее в один фрейм. Третий раздел отвечает за создание ответа и направление его в другой фрейм.

Я пытался изменить http://stein.cshl.org/WWW/CGI/examples/frameset.txt, чтобы попытаться сделать то, что вы хотите сделать, но Я не / не могу это проверить (без CGI. пм сервер легко доступен). Я серьезно сомневаюсь, что это будет работать без некоторой отладки. Но, надеюсь, это дает вам основную идею работать с ним. Сначала изучите http://stein.cshl.org/WWW/CGI/examples/frameset.txt, а затем посмотрите мои изменения ниже:

#!/usr/local/bin/perl

### UNTESTED CODE ###

use CGI;
$query = new CGI;
print $query->header;
$TITLE="Frameset Example";

# We use the path information to distinguish between calls
# to the script to:
# (1) create the frameset
# (2) create the query form
# (3) create the query response

$path_info = $query->path_info;

# If no path information is provided, then we create 
# print query form            ###new####
# a side-by-side frame set    ###old###
if (!$path_info) {
    #&print_frameset;   ###old### 
    &print_html_header; ###new###
    &print_query        ###new###
    &print_end;         ###new###
    exit 0;
}

# If response path             ###new###
if ($path_info=~/response/) {  ###new###
    &print_frameset;           ###new###
    exit 0;                    ###new###
}                              ###new###

# If we get here, then we either create the query form
# or we create the response.
&print_html_header;
#&print_query if $path_info=~/query/;             ###old###
#&print_response if $path_info=~/response/;       ###old###
&print_query if $path_info=~/frame-query/;        ###new###
&print_response if $path_info=~/frame-response/;  ###new###
&print_end;


# Create the frameset
sub print_frameset {
    $script_name = $query->script_name;
    print <<EOF;
<html><head><title>$TITLE</title></head>
<frameset cols="50,50">
<!--frame src="$script_name/query" name="query"-->           <!--###old###-->
<!--frame src="$script_name/response" name="response"-->     <!--###old###-->
<frame src="$script_name/query" name="frame-query">          <!--###new###-->
<frame src="$script_name/response" name="frame-response">    <!--###new###-->
</frameset>
EOF
    ;
    exit 0;
}

sub print_html_header {
    print $query->start_html($TITLE);
}

sub print_end {
    print qq{<P><hr><A HREF="../index.html" TARGET="_top">More Examples</A>};
    print $query->end_html;
}

sub print_query {
    $script_name = $query->script_name;
    print "<H1>Frameset Query</H1>\n";
    #print $query->startform(-action=>"$script_name/response",-TARGET=>"response");   ###old###
    print $query->startform(-action=>"$script_name/response");  ###new###
    print "What's your name? ",$query->textfield('name');
    print "<P>What's the combination?<P>",
    $query->checkbox_group(-name=>'words',
          -values=>['eenie','meenie','minie','moe']);

    print "<P>What's your favorite color? ",
    $query->popup_menu(-name=>'color',
         -values=>['red','green','blue','chartreuse']),
    "<P>";
    print $query->submit;
    print $query->endform;
}

sub print_response {
    print "<H1>Frameset Result</H1>\n";
    unless ($query->param) {
 print "<b>No query submitted yet.</b>";
 return;
    }
    print "Your name is <EM>",$query->param(name),"</EM>\n";
    print "<P>The keywords are: <EM>",join(", ",$query->param(words)),"</EM>\n";
    print "<P>Your favorite color is <EM>",$query->param(color),"</EM>\n";
}
1 голос
/ 23 апреля 2010

Если вы хотите изменить структуру страницы, отображаемой в браузере пользователя (т. Е. Создать фрейм при отправке формы, которой раньше не было), вам придется использовать клиентский JavaScript длясделай это.Это может быть так же просто, как наличие рамки, но ее отображение и отображение при отправке формы, или это может потребовать манипулирования DOM для ее создания.

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

вместо фрейма и заполнить его через AJAX; CGI :: Ajax будет самым простым подходом для этого.Поскольку вам все равно придется использовать javascript (для раскрытия или создания фрейма), подход на основе AJAX не добавит никаких новых требований для пользователей вашего сайта.

Редактировать: Ух ты ... Есть ли какое-нибудь объяснение для проезжающих вниз голосов?Как вы думаете, я не смог ответить на вопрос?Я просто не прав?Просвети меня!

...