diff options
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Contact.pm | 66 | ||||
-rw-r--r-- | t/app/controller/contact.t | 76 | ||||
-rw-r--r-- | templates/web/default/contact/index.html | 15 | ||||
-rw-r--r-- | templates/web/default/contact/submit.html | 18 |
4 files changed, 169 insertions, 6 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Contact.pm b/perllib/FixMyStreet/App/Controller/Contact.pm index 6a243576d..daa1c1e98 100644 --- a/perllib/FixMyStreet/App/Controller/Contact.pm +++ b/perllib/FixMyStreet/App/Controller/Contact.pm @@ -23,10 +23,9 @@ Contact us page sub index : Path : Args(0) { my ( $self, $c ) = @_; - $c->stash->{contact_email} = $c->cobrand->contact_email; - $c->stash->{contact_email} =~ s/\@/@/; - - $c->forward('determine_contact_type'); + return unless + $c->forward('setup_request') + && $c->forward('determine_contact_type'); # my ($q, $errors, $field_errors) = @_; # my @errors = @$errors; @@ -70,6 +69,14 @@ sub index : Path : Args(0) { # return $out; } +sub submit : Path('submit') : Args(0) { + my ( $self, $c ) = @_; + + return unless + $c->forward('setup_request') + && $c->forward('validate'); +} + sub determine_contact_type : Private { my ( $self, $c ) = @_; @@ -106,6 +113,57 @@ sub determine_contact_type : Private { $c->stash->{problem} = $problem; } } + + return 1; +} + +sub validate : Private { + my ( $self, $c ) = @_; + + my ( %field_errors, @errors ); + my %required = ( + name => _('Please give your name'), + em => _('Please give your email'), + subject => _('Please give a subject'), + message => _('Please write a message') + ); + + foreach my $field ( keys %required ) { + $field_errors{$field} = $required{$field} + unless $c->req->param($field) =~ /\S/; + } + + unless ( $field_errors{em} ) { + $field_errors{em} = _('Please give a valid email address') + if !mySociety::EmailUtil::is_valid_email( $c->req->param('em') ); + } + + push @errors, _('Illegal ID') + if $c->req->param('id') && $c->req->param('id') !~ /^[1-9]\d*$/ + or $c->req->param('update_id') + && $c->req->param('update_id') !~ /^[1-9]\d*$/; + + if ( @errors or scalar keys %field_errors ) { + $c->stash->{errors} = \@errors; + $c->stash->{field_errors} = \%field_errors; + $c->go('index'); + } +} + +sub setup_request : Private { + my ( $self, $c ) = @_; + + $c->stash->{contact_email} = $c->cobrand->contact_email; + $c->stash->{contact_email} =~ s/\@/@/; + + for my $param (qw/em subject message/) { + $c->stash->{$param} = $c->req->param($param); + } + + # name is already used in the stash for the app class name + $c->stash->{form_name} = $c->req->param('name'); + + return 1; } =head1 AUTHOR diff --git a/t/app/controller/contact.t b/t/app/controller/contact.t index 412b834f3..a5135c60a 100644 --- a/t/app/controller/contact.t +++ b/t/app/controller/contact.t @@ -69,4 +69,80 @@ for my $test ( }; } +for my $test ( + { + fields => { + em => ' ', + name => '', + subject => '', + message => '', + }, + errors => [ + 'Please give your name', + 'Please give your email', + 'Please give a subject', + 'Please write a message', + ] + }, + { + fields => { + em => 'invalidemail', + name => '', + subject => '', + message => '', + }, + errors => [ + 'Please give your name', + 'Please give a valid email address', + 'Please give a subject', + 'Please write a message', + ] + }, + { + fields => { + em => 'test@example.com', + name => 'A name', + subject => '', + message => '', + }, + errors => [ 'Please give a subject', 'Please write a message', ] + }, + { + fields => { + em => 'test@example.com', + name => 'A name', + subject => 'A subject', + message => '', + }, + errors => [ 'Please write a message', ] + }, + { + fields => { + em => 'test@example.com', + name => 'A name', + subject => ' ', + message => '', + }, + errors => [ 'Please give a subject', 'Please write a message', ] + }, + { + fields => { + em => 'test@example.com', + name => 'A name', + subject => 'A subject', + message => ' ', + }, + errors => [ 'Please write a message', ] + }, + + ) +{ + subtest 'check submit page error handling' => sub { + $mech->get_ok('/contact'); + $mech->submit_form_ok( { with_fields => $test->{fields} } ); + is_deeply $mech->form_errors, $test->{errors}; + is_deeply $mech->visible_form_values, $test->{fields}; + }; +} + done_testing(); diff --git a/templates/web/default/contact/index.html b/templates/web/default/contact/index.html index b06154083..0937e73cf 100644 --- a/templates/web/default/contact/index.html +++ b/templates/web/default/contact/index.html @@ -70,20 +70,31 @@ please <a href="/">go to the front page</a> and follow the instructions.') %] </p> +[% IF field_errors.name %] + <div class="form-error">[% field_errors.name %]</div> +[% END %] <div class="form-field"> <label for="form_name">Your name:</label> - <input type="text" name="name" id="form_name" value="[% form_name %]" size="30"></div> +[% IF field_errors.em %] + <div class="form-error">[% field_errors.em %]</div> +[% END %] <div class="form-field"> <label for="form_email">Your email:</label> -<input type="text" name="em" id="form_email" value="[% email %]" size="30"></div> +<input type="text" name="em" id="form_email" value="[% em %]" size="30"></div> +[% IF field_errors.subject %] + <div class="form-error">[% field_errors.subject %]</div> +[% END %] <div class="form-field"> <label for="form_subject">Subject:</label> <input type="text" name="subject" id="form_subject" value="[% subject %]" size="30"></div> +[% IF field_errors.message %] + <div class="form-error">[% field_errors.message %]</div> +[% END %] <div class="form-field"> <label for="form_message">Message:</label> diff --git a/templates/web/default/contact/submit.html b/templates/web/default/contact/submit.html new file mode 100644 index 000000000..12f3f30a6 --- /dev/null +++ b/templates/web/default/contact/submit.html @@ -0,0 +1,18 @@ +[% INCLUDE 'header.html', title => loc('Contact Us') %] + +<h1>[% loc('Contact the team') %]</h1> + +<form method="post" action="/contact/submit"> + +<input type="hidden" name="submit_form" value="1"> + + +<p> +[% IF success %] + [% loc("Thanks for your feedback. We'll get back to you as soon as we can!") %] +[% ELSE %] + [% tprintf( loc('Failed to send message. Please try again, or <a href="mailto:%s">email us</a>.'), contact_email ) %] +[% END %] +</p> + +[% INCLUDE 'footer.html' %] |