?
Solved

Perl Redirect after Form Submit

Posted on 2010-09-08
4
Medium Priority
?
683 Views
Last Modified: 2012-05-10
Hi All,

I've read thru every possible solution posted at this website and none seem to work for me. I must admit Perl isnt my thing. This is the first time I am dealing with Perl.

The Perl below is used to submit a web form. After the form has been submitted, it goes to a Page that simply displays a message and tries to close the Window. Although the Forms are submitted successfully, I'd like the Perl to redirect users to a Thank You Page. (I've attached an image of the message that follows after submitting)

As I said, I've tried every possible solution found here, but I do not have any experience with Perl. Your help will be greatly appreciated.
 
#!/usr/perl/bin/perl --
#
require "MRlib.pl";
require "MRDateRep.pl";


package FP;

&importLanguageFile('MRProcessIncomingForms.txt');

$EMAIL_FIELD_SEPARATOR = '=' if !$EMAIL_FIELD_SEPARATOR;

#$DEBUG_INCOMING = 2;

# Name: DebugIncomingForms
# Synopsis: outputs debug info if "incoming" debugging is turned on
# Arguments: string to print
# Returns: nothing
# Notes: usually appends data to InMailDebug.txt in debug directory
#

{
    # this value will be persistent between calls to this sub, but viewable
    # only within the outer block enclosing the my statement and the sub
    my ($debugFileExists);

    sub DebugIncomingForms
    {
	return if ! $DEBUG_INCOMING;    #note: we borrow "MRincoming.pl"s switch

	my ( $text, $file, $lt );
	$text = shift;
	$lt = localtime;

	# all debugging to one file - no more $pid in filename
	$file = &GetDebugDirectory() . "InMailFormDebug.txt";

	open ( DEBUG, '>>', "$file" );


	# print a header line the first time we're called
	if (!$debugFileExists)
	{
	    $debugFileExists = 1;
	    print DEBUG "\n\nDebugging MRProcessIncomingForms.pl: $lt ($pid) (version $PROD_VERSION)\n===================================\n\n";
	}

	# Include timestamp and pid in every line we output.
	# Timestamp is useful for seeing if the server is hanging.
	# Pid is useful for sorting out which debugging is from which process
	# the debugging is coming from when 2 processes run at once.
        # Sometimes it gets annoying though, which is why I added the exception.

	print DEBUG "--- $lt ($pid)---\n" if !$DEBUG_INCOMING_NO_STAMPLINE;
	print DEBUG "$text\n";
	close DEBUG;

	# make sure the file is writable by any user who runs this script
	chmod 0777, $file if !$NT;
    }
}

sub CreateIncomingFormat
{
    $in{'LONGDESCRIPTION'} =~ s/\r\n/\n/g if $NT;
    my @value = values %in;  # A note about lack of input validation below.  For the data that's simply being forwarded
    my @title = keys %in;    # to MRincoming.pl in a text file, we will let MRincoming.pl do the validation.
    my %day = ();
    my %month = ();
    my %year = ();
    my %hour = ();
    my %minute = ();
    my $j = 0;

    my %multivalueFields = &FP::CreateHashFromArray(&FP::CGIParam('FP::in', 'MULTIVALUE_FIELDS', 'RE:Fix_Field'));

    &PrintTableTop_Round();

    for ($i = 0; $i <= $#value; $i++)
    {
    	if ($title[$i] !~ /^TO$|^FROM$|^CC_USERS$|^TITLE$|^PROJECTNUM$|^PROJECTNAME$|^DATE_TYPE$|^MULTIVALUE_FIELDS$|^SURVEY$|^ANONYMOUS$/gi)
        {
            $title = &UnFix_Fields($title[$i]);
            @info = split(/_/, $title);
    	    if ($title =~ /^Year_/i)
            {
    	    	$year{$info[1]} = $value[$i];
                $dateProjField[$j] = $info[1];
                $j++;
            }
            elsif ($title =~ /^Month_/i)
    	    {
                $month{$info[1]} = $value[$i];
    	    }
            elsif ($title =~ /^Day_/i)
    	    {
                $day{$info[1]} = $value[$i];
    	    }
            elsif ($title =~ /^Hour_/i)
            {
                $hour{$info[1]} = $value[$i];
            }
            elsif ($title =~ /^Minute/i)
            {
                $minute{$info[1]} = $value[$i];
            }
            else
    	    {
                if ($title eq "LONGDESCRIPTION")
                {
                    $EMAIL_MESSAGE .= "$value[$i]\n";
            	}
                else
                {
                    next if $title =~ /^originalticket$|^originalproject$|^Original__bProject$|^Original__bIssue$|^Original__bAssignees$/;
                    if ($multivalueFields{$title[$i]})
                    {
                        # get all values if this is a multi choice field
                        my @allValues = &GetMultiples($title[$i]);
                        # Join with semicolons.  If a value contains a semicolon wrap it in quotes.
                        $value[$i] = join ';', (map {$_=~ /;/ ? "\"$_\"" : $_} @allValues);
                    }

                    #   If carriage return newline are found, this is a multi line field so add the field seperator
                    if ($value[$i] =~ /\r\n/gi)
                    {
                        $value[$i] .= "\r\nEND $title\r\n";
                    }
                    elsif ($value[$i] =~ /\n/gi)
                    {
                        $value[$i] .= "\nEND $title\n";
                    }

                    if (($value[$i] ne "") && ($value[$i] ne "http://") && ($value[$i] ne "ftp://") && ($value[$i] ne "No Choice"))
                    {
                        $EMAIL_MESSAGE .= "$title $EMAIL_FIELD_SEPARATOR $value[$i]\n";
                    }
                }
    	    }   #end else
        }   #end if
    }   #end for
    for ($i = 0; $i <= $#dateProjField;$i++)
    {
    	$year = $year{$dateProjField[$i]};
    	$month = $month{$dateProjField[$i]};
    	$day = $day{$dateProjField[$i]};
        $hour = $hour{$dateProjField[$i]};
        $minute = $minute{$dateProjField[$i]};
    	if (($year != "") && ($month != "") && ($day != ""))
    	{
            my $dateType = &FP::CGIParam('FP::in', 'DATE_TYPE', qr/^\d*$/);
            if ($dateType == $MRDateUS)
    	    {
                $EMAIL_MESSAGE .= "$dateProjField[$i] $EMAIL_FIELD_SEPARATOR $month/$day/$year";
            }
            elsif ($dateType == $MRDateEuropean)
            {
                $EMAIL_MESSAGE .= "$dateProjField[$i] $EMAIL_FIELD_SEPARATOR $day/$month/$year";
            }
            else
            {
                $EMAIL_MESSAGE .= "$dateProjField[$i] $EMAIL_FIELD_SEPARATOR $year-$month-$day";
            }
    	}
        if (length($hour) && length($minute))
        {
            $EMAIL_MESSAGE .= " $hour:$minute";
        }
        $EMAIL_MESSAGE .= "\n";

    }
}   # end sub


###################################
&ReadParse();

# Prevent an empty ticket from being created when someone just
# types in the url /MRcgi/MRProcessIncomingForms.pl in a browser.
#   Unfortunately, they could just add a single variable and achieve
#   the same effect.  I don't want to stop a legitimate submission
#   from going through though.
if (scalar keys %in == 0)
{
    &StartIt();
    print "<script language = \"javascript\">self.close()</script>";
    &EndIt();
    exit;
}

    sub fixu
    {
        my $x = shift;
	$x =~ s`([^-=/,._\w])`sprintf( '%%%02x', ord($1) )`ge;
	return $x;
    }

if ( $DEBUG_INCOMING =- 2 )
{   #save arguments in URL friendly way
    my $path = "$CMI/etc/debugging/MRIncomingArgs";
    if ( open( DEBUG_INCOMING, ">$path" ) )
    {
    	print( DEBUG_INCOMING
	     join('&', map{ fixu($_) . "=" . fixu($in{$_}) }
	     		sort keys %in ), "\n" );
	close DEBUG_INCOMING;
    }
}

$username = &FP::CGIParam('FP::in', 'USER', 'RE:userid');
$ProjectID = &FP::CGIParam('FP::in', 'PROJECTNUM', "RE:project");
$userkey = &FP::CGIParam('FP::in', 'MRP', 'RE:mrp');
&InitUserPrefs($username, $ProjectID);
&StartIt();

&PrintTableTop_Round();
$STR::MRProcessingIncomingForms_header =~ s/$_REQUEST_/$STR::MRProcessingIncomingForms_survey/g if &FP::CGIParam('FP::in', 'SURVEY', 'RE:1');
print "$STR::MRProcessingIncomingForms_header " . &FP::GetAName($ProjectID) . "<br>$STR::MRProcessingIncomingForms_CloseWindowAlert ";
&PrintTableBottom_Round();


$formattedFile = "$MR_TempDirectory${FS}formatted$FP::pid.txt";
open (MAIL, '>', "$formattedFile");
$EMAIL_MESSAGE = "From: " . &FP::CGIParam('FP::in', 'FROM', 'RE:singleLineText') . "\n";
$EMAIL_MESSAGE .= "To: " . &FP::CGIParam('FP::in', 'TO', 'RE:singleLineText') . "\n";
$EMAIL_MESSAGE .= "CC: " . &FP::CGIParam('FP::in', CC_USERS, 'RE:singleLineText') . "\n";
$EMAIL_MESSAGE .= "Subject: " . &FP::CGIParam('FP::in', 'TITLE', 'RE:singleLineText') . "\n\n\n";
&CreateIncomingFormat();
$EMAIL_MESSAGE =~ s/\n/\r\n/gi if !$NT;
print MAIL $EMAIL_MESSAGE;
close (MAIL);

&DebugIncomingForms( "EMAIL_MESSAGE:\n$EMAIL_MESSAGE\n" );

print "<script language = \"javascript\">self.close()</script>";
$ENV{FROM_HTML_FORM} = 1;


# This script does not require user login, so we need to be really careful about what we pass to
# the system command.  A malicious user could send in a bogus project number like " | rm -f / |".
# In order to make this hard to miss for future maintainers, I'm copying all data into a separate
# hash, %validatedArgs.

my %validatedArgs;

my $oTicket = &FP::CGIParam('FP::in', 'originalticket', qr/^\d*$/);
my $oProject = &FP::CGIParam('FP::in', 'originalproject', qr/^\d*$/);
if ($oTicket && $oProject)
{
    $validatedArgs{'additional'} = "originalticket=$oTicket originalproject=$oProject";
}
if (my $project = &FP::CGIParam('FP::in', 'PROJECTNUM', qr/^\d*$/))
{
    $validatedArgs{'project'} = 'project=' . $project;
}




# This used to direct the input into MRincoming.pl using "< file", but that involves cmd.exe, which is
# prone to permission errors.  Making MRincoming.pl read the file on its own using INPUTFILE avoids that.
my $command =
        "$perl ${CMI_CORRECTED}cgi${FS}MRincoming.pl $validatedArgs{'project'} $validatedArgs{'additional'} INPUTFILE=$formattedFile";
   $command .=
        " SURVEYCARRYOVER=1" if exists($in{'SURVEY'}) && $in{'SURVEY'};
if ( $DEBUG_INCOMING )
{
    use Data::Dumper;
    my $ddo = Data::Dumper->new( [ \%in ], [ 'web_fields' ] );
    $ddo->Indent(1);
    $ddo->Sortkeys(1);
    &DebugIncomingForms( $ddo->Dumper() . "command=$command\n\n" );
}

my $exitcode = system( $command )/256;

&MRdelete("$formattedFile");

#end

Open in new window



fpmessage.JPG
0
Comment
Question by:DapperTrojan
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
4 Comments
 
LVL 8

Accepted Solution

by:
mustaccio earned 2000 total points
ID: 33630388
Where you print the javascript code to close the window (self.close()), specify the URL of your confirmation page:

window.location = '/confirmation.html'
0
 

Author Comment

by:DapperTrojan
ID: 33631038
Hi Mustaccio,

Thanks..I will test your solution..BRB
0
 
LVL 8

Expert Comment

by:mustaccio
ID: 33631201
Just to clarify, you will need to set window.location _instead of_ self.close().
0
 

Author Closing Comment

by:DapperTrojan
ID: 33632040
It worked. Thanks so much.
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many time we need to work with multiple files all together. If its windows system then we can use some GUI based editor to accomplish our task. But what if you are on putty or have only CLI(Command Line Interface) as an option to  edit your files. I…
I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
Six Sigma Control Plans

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question