2016-10-21 3 views
-1

У меня есть интерфейсный интерфейс GUI (HTML и JavaScript) для Perl-back-end. При нажатии на определенную кнопку на домашней странице интерфейсного модуля, Perl-back-end получает конкретный аргумент. Таким образом, этот аргумент приводит к изменению значения переменной ($checkInfo), которая затем возвращается обратно в графический интерфейс. Теперь в графическом интерфейсе появляется сообщение, которое отображает $checkInfo и при закрытии всплывающего окна открывается другая страница (например, страница 2). На странице 2 есть определенная кнопка, которая отправляет по электронной почте $checkInfo на определенный адрес электронной почты.Сохранение значения переменной в Perl

Проблемы я столкнулся в том, что $checkInfo равно "" на странице 2. На странице 1, фоновый возвращает $checkInfo = something в графический интерфейс, но это значение теряется, когда я иду на страницу 2. Я пробовал объявляя значение $ state $checkInfo, но это тоже не работает. Я использую $checkInfo только в функции main().

В коде, все, что вам нужно знать, что preSubmitCheck::autoSubmitCheck возвращают значение, что $checkInfo->{rc} != 0 и в первой итерации $mode ne 'ticket' но $mode eq 'ticket' во второй итерации. Во второй итерации мне нужно значение $ checkInfo быть таким же, как и первое итерационное значение.

код Perl:

my $username = defined param("username") ? param("username") : undef; 
my $action = defined param("run_type") ? param("run_type") : undef; 
my $cit_suite = defined param("cit_suite") ? param("cit_suite") : undef; 
my $buildroot = defined param("buildroot") ? param("buildroot") : undef; 
my $site = defined param("site") ? lc(param("site")) : undef; 
my $branch = defined param("branch") ? param("branch") : undef; 
my $hw = defined param("hw") ? param("hw") : undef; 
my $variant = defined param("variant") ? param("variant") : undef; 
my $num_runs = defined param("num_runs") ? param("num_runs") : undef; 
my $justification = defined param("justification") ? param("justification") : undef; 
my $mode = defined param("userAction") ? param("userAction") : undef; 
my $jobID = defined param("jobID") ? param("jobID") : undef; 
my $cancel_type = defined param("canceltype") ? param("canceltype") : undef; 

    state $checkInfo; 
    my $error; 
    my %rtn = (
      rc => 0, 
      message => "All is well." 
      ); 

    if($mode ne "ticket") { 
     $checkInfo = preSubmitCheck::autoSubmitCheck($site,$username,$num_runs); 
    } 
    if(defined $checkInfo && $checkInfo->{rc} == 0){ 
     my $target = 1; 
    } 
    else { 
     if($mode eq "ticket"){ 
      $error = $checkInfo->{message}; 
      my $rtnFromTicket = sendTicket(
       username => $username, 
       cit_suite => $cit_suite, 
       action => $action, 
       buildroot => $buildroot, 
       site => $site, 
       branch => $branch, 
       hw => $hw, 
       variant => $variant, 
       num_runs => $original_num_runs, 
       justification => $justification, 
       errorMessage => $error 
       ); 
      $rtn{rc} = 2; 
      $allMessage .= " Your job couldn't be automatically submitted: ". $error; 
      $allMessage .= " Email info: ". $rtnFromTicket -> {message}; 
      $rtn{message} = $allMessage; 
      print "00delimiter00";  # use as a delimiter to split from useless print information, and make the front end got the json data. 
      print to_json(\%rtn); 
      exit $rtn{rc}; 
     } 
     else{ 
      $error = $checkInfo->{message}; 
      $rtn{rc} = $checkInfo->{rc}; 
      if($rtn{rc} == 6) { 
       $allMessage .= " Your job couldn't be automatically submitted: ". $error. " You can schedule your run or open a ticket with the SMOKES team."; 
      } 
      else { 
       $allMessage .= " Your job couldn't be automatically submitted: ". $error; 
      } 
      $rtn{message} = $allMessage; 
      print "00delimiter00";  # use as a delimiter to split from useless print information, and make the front end got the json data. 
      print to_json(\%rtn); 
      exit $rtn{rc}; 
     } 
    } 

код GUI:

var query = "username=<% $ARGS{username} %>"; 
if(Mode=="all"){ 
    query += "&run_type=Presub_smoke"; 
} 
else { 
    query += "&run_type=CIT" + "&cit_suite=" + document.getElementById("citsuite").value; 
} 
query += "&buildroot=" + encodeURIComponent(document.getElementById("buildroot").value); 
query += "&site=" + encodeURIComponent(document.getElementById("remoteSite").value); 
query += "&branch=" + encodeURIComponent(document.getElementById("branch").value); 
query += "&hw=" + encodeURIComponent(document.getElementById("hwtype").value); 
query += "&variant=" + encodeURIComponent(document.getElementById("variant").value); 
query += "&num_runs=" + document.getElementById("num_runs").value; 
query += "&justification=" + encodeURIComponent(document.getElementById("justification").value); 
query += "&userAction=" + encodeURIComponent(action); 
var submitFcts = new Array(); 
submitFcts[3] = "updateSubmitInfo"; 
submitFcts[4] = "return_request"; 
makeUserRequest2("<% $CGI_form_path %>", query, submitFcts, ""); 

Я надеюсь, что этого достаточно для ответа на мой вопрос. Благодаря!

+2

Вам нужно кипятить огромное количество кода до минимального примера, который показывает проблему, а затем опубликовать этот пример. – RJM

+3

Совет: 'my $ username = defined param (" username ")? param ("username"): undef; 'можно сократить до' my $ username = param ("username"); ' – ikegami

+0

@ikegami спасибо, я буду помнить об этом :) –

ответ

2

state сохраняет только значение переменной в рамках одного процесса. При запуске CGI для каждого HTTP-запроса есть новый процесс.

Если вы хотите сохранить состояние по запросам, вам нужно будет удержать его где-нибудь, что сохранится через запросы - например, путем его хранения в куки, в сеансе или в базе данных.

+0

Я хотел избежать файлов cookie и баз данных. Есть ли другой вариант? –

+0

Итак, я реализовал файлы cookie в одном сценарии, но у меня ошибка. Я добавил дополнительную строку в cgi: 'my $ CookieMessage = определенный параметр (" CookieMessage ")? param ("CookieMessage"): undef; 'и еще одна дополнительная строка в графическом интерфейсе:' query + = "& CookieMessage =" + encodeURIComponent (document.cookie); ", но когда электронная почта выходит через PERL,' $ CookieMessage' превращается чтобы быть пустым –

+0

Я также заметил, что когда я читаю файл cookie в графическом интерфейсе, он дает мне правильное значение наряду с некоторыми другими ненужными значениями. 'document.cookie = receivedResult [" message "]; alert (document.cookie); ' –

Смежные вопросы