2016-10-21 7 views
-1

Ich habe ein GUI-Front-End (HTML und JavaScript) ein Perl-Back-End. Beim Klicken auf eine bestimmte Schaltfläche auf der Startseite des Front-Ends erhält das Perl-Back-End ein bestimmtes Argument. Dieses Argument führt also zu einer Wertänderung einer Variablen ($checkInfo), die dann an die GUI zurückgegeben wird. Die GUI zeigt nun eine Nachricht an, die $checkInfo anzeigt und nach dem Schließen des Pop-Ups öffnet sich eine weitere Seite (sprich Seite 2). Auf Seite 2 ist eine bestimmte Schaltfläche, die E-Mails $checkInfo an eine bestimmte E-Mail-Adresse.Behalten den Wert einer Variablen in Perl

Das Problem, das ich mit Blick auf bin, ist, dass $checkInfo zu "" auf Seite 2. Auf Seite 1, kehrt die Back-End-$checkInfo = something auf die GUI gleich ist, aber dieser Wert ist verloren, wenn ich zur Seite 2. Ich habe versucht, deklarieren $ Wert als state $checkInfo, aber das funktioniert auch nicht. Ich verwende $checkInfo nur in der main() Funktion. Im Code

, alles, was Sie wissen müssen, ist, dass preSubmitCheck::autoSubmitCheck den Wert zurück, so dass $checkInfo->{rc} != 0 und in der ersten Iteration $mode ne 'ticket' aber $mode eq 'ticket' in der zweiten Iteration. In der zweiten Iteration muss der Wert von $ checkInfo identisch mit dem ersten Iterationswert sein.

Perl-Code:

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-Code:

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, ""); 

Ich hoffe, dass dies für die Beantwortung meiner Frage genügt. Vielen Dank!

+2

Sie müssen Ihre große Menge Code auf ein minimales Beispiel, das das Problem zeigt, aufkochen und dann dieses Beispiel veröffentlichen. – RJM

+3

Tipp: 'my $ username = definierter Parameter (" Benutzername ")? param ("username"): undef; 'kann auf' my $ username = param ("username") verkürzt werden; ' – ikegami

+0

@ikegami danke Ich behalte das im Hinterkopf :) –

Antwort

2

state behält nur den Wert einer Variablen in einem einzigen Prozess bei. Wenn es als CGI ausgeführt wird, gibt es für jede HTTP-Anforderung einen neuen Prozess.

Wenn Sie den Status über mehrere Anfragen hinweg speichern möchten, müssen Sie ihn an einem anderen Ort aufbewahren, der über Anfragen hinweg Bestand hat - z. B. durch Speichern in einem Cookie, in einer Sitzung oder in einer Datenbank.

+0

Ich wollte Cookies und Datenbanken vermeiden. Gibt es noch eine andere Option? –

+0

Also habe ich Cookies in einem Szenario implementiert, aber ich treffe einen Fehler. Ich fügte eine zusätzliche Zeile im cgi hinzu: 'my $ CookieMessage = definierter Parameter (" CookieMessage ")? param ("CookieMessage"): undef; 'und eine weitere Zeile im GUI-Code:' query + = "& CookieMessage =" + encodeURIComponent (document.cookie); 'aber wenn die Email durch PERL ausgeht, wird' $ CookieMessage' out, um leer zu sein –

+0

Ich bemerkte auch, dass wenn ich den Cookie in der GUI lese, gibt es mir den richtigen Wert zusammen mit einigen anderen unnötigen Werten. 'document.cookie = returnedResult [" Nachricht "]; alert (document.cookie); ' –

Verwandte Themen