aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStruan Donald <struan@exo.org.uk>2011-05-13 16:36:13 +0100
committerStruan Donald <struan@exo.org.uk>2011-05-13 16:36:13 +0100
commitfbb8d5ca4e3bfecf5c276f4a8dd43fb5fc4002d9 (patch)
treee0d50673d0f564bce7c5a937a193ac1afedbd01f
parent84053fd846af39f03c8e6087e9f1df41dffe62ff (diff)
contact form validation and post submission page
-rw-r--r--perllib/FixMyStreet/App/Controller/Contact.pm66
-rw-r--r--t/app/controller/contact.t76
-rw-r--r--templates/web/default/contact/index.html15
-rw-r--r--templates/web/default/contact/submit.html18
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/\@/&#64;/;
-
- $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/\@/&#64;/;
+
+ 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&nbsp;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' %]