From 62b16bc1127f026a37fbb87bac0b0fde1a6f9a74 Mon Sep 17 00:00:00 2001 From: Ned Zimmerman Date: Wed, 30 Aug 2017 17:13:39 -0300 Subject: [PATCH 01/28] Contact form (fix #4). --- app/controllers/App.php | 53 +++++++++++++++++++ .../assets/styles/components/_forms.scss | 24 +++++++++ .../views/partials/contact-form.blade.php | 21 ++++++-- 3 files changed, 93 insertions(+), 5 deletions(-) diff --git a/app/controllers/App.php b/app/controllers/App.php index 2c763c5..37a4d43 100644 --- a/app/controllers/App.php +++ b/app/controllers/App.php @@ -65,4 +65,57 @@ class App extends Controller return __('Contact Us', 'aldine'); } + + public function contactFormResponse() + { + if (isset($_POST['submitted'])) { + $output = []; + $name = (isset($_POST['visitor_name'])) ? $_POST['visitor_name'] : false; + $email = (isset($_POST['visitor_email'])) ? $_POST['visitor_email'] : false; + $institution = (isset($_POST['visitor_institution'])) ? $_POST['visitor_institution'] : false; + $message = (isset($_POST['message'])) ? $_POST['message'] : false; + if (!$name) { + $output['message'] = __('Name is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_name'; + } elseif (!$email) { + $output['message'] = __('Email is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_email'; + } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + $output['message'] = __('Email is invalid.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_email'; + } elseif (!$institution) { + $output['message'] = __('Institution is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_institution'; + } elseif (!$message) { + $output['message'] = __('Message is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'message'; + } else { + $sent = wp_mail( + get_option('admin_email'), + __('Contact Form: ', 'aldine') . $name, + sprintf( + "From: %1\$s <%2\$s>\n%3\$s", + $name, + $email, + strip_tags($message) + ), + "From: ${email}\r\nReply-To: ${email}\r\n" + ); + if ($sent) { + $output['message'] = __('Your message was sent!', 'aldine'); + $output['status'] = 'success'; + } else { + $output['message'] = __('Your message could not be sent.', 'aldine'); + $output['status'] = 'error'; + } + } + return $output; + } + return false; + } } diff --git a/resources/assets/styles/components/_forms.scss b/resources/assets/styles/components/_forms.scss index 8914fbe..786d595 100644 --- a/resources/assets/styles/components/_forms.scss +++ b/resources/assets/styles/components/_forms.scss @@ -11,8 +11,32 @@ .contact { margin-bottom: 120px; + p { + font-size: 0.875rem; + font-weight: 600; + font-family: $font-family-sans-serif; + } + + .success { + color: $dark-green; + } + + .error { + color: $dark-red; + } + form { width: 22.125rem; + + .error > input[type="text"], + .error > input[type="email"], + .error > textarea { + border-bottom: solid 2px $dark-red; + } + + .error > ::placeholder { + color: $dark-red; + } } label { diff --git a/resources/views/partials/contact-form.blade.php b/resources/views/partials/contact-form.blade.php index 4fb49c3..01137fd 100644 --- a/resources/views/partials/contact-form.blade.php +++ b/resources/views/partials/contact-form.blade.php @@ -1,11 +1,22 @@

{{ $contact_form_title }}

-
+ + @if($contact_form_response) +

{{ $contact_form_response['message'] }}

+ @endif -

-

-

-

+

+ +

+

+ +

+

+ +

+

+ +

From b30bb8902e3b33a800223d09d4d78528bf171f13 Mon Sep 17 00:00:00 2001 From: Ned Zimmerman Date: Wed, 30 Aug 2017 18:22:14 -0300 Subject: [PATCH 02/28] Improve contact form logic. --- app/controllers/App.php | 53 ------------------------------------ app/helpers.php | 59 +++++++++++++++++++++++++++++++++++++++++ app/setup.php | 5 ++++ 3 files changed, 64 insertions(+), 53 deletions(-) diff --git a/app/controllers/App.php b/app/controllers/App.php index 37a4d43..2c763c5 100644 --- a/app/controllers/App.php +++ b/app/controllers/App.php @@ -65,57 +65,4 @@ class App extends Controller return __('Contact Us', 'aldine'); } - - public function contactFormResponse() - { - if (isset($_POST['submitted'])) { - $output = []; - $name = (isset($_POST['visitor_name'])) ? $_POST['visitor_name'] : false; - $email = (isset($_POST['visitor_email'])) ? $_POST['visitor_email'] : false; - $institution = (isset($_POST['visitor_institution'])) ? $_POST['visitor_institution'] : false; - $message = (isset($_POST['message'])) ? $_POST['message'] : false; - if (!$name) { - $output['message'] = __('Name is required.', 'aldine'); - $output['status'] = 'error'; - $output['field'] = 'visitor_name'; - } elseif (!$email) { - $output['message'] = __('Email is required.', 'aldine'); - $output['status'] = 'error'; - $output['field'] = 'visitor_email'; - } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { - $output['message'] = __('Email is invalid.', 'aldine'); - $output['status'] = 'error'; - $output['field'] = 'visitor_email'; - } elseif (!$institution) { - $output['message'] = __('Institution is required.', 'aldine'); - $output['status'] = 'error'; - $output['field'] = 'visitor_institution'; - } elseif (!$message) { - $output['message'] = __('Message is required.', 'aldine'); - $output['status'] = 'error'; - $output['field'] = 'message'; - } else { - $sent = wp_mail( - get_option('admin_email'), - __('Contact Form: ', 'aldine') . $name, - sprintf( - "From: %1\$s <%2\$s>\n%3\$s", - $name, - $email, - strip_tags($message) - ), - "From: ${email}\r\nReply-To: ${email}\r\n" - ); - if ($sent) { - $output['message'] = __('Your message was sent!', 'aldine'); - $output['status'] = 'success'; - } else { - $output['message'] = __('Your message could not be sent.', 'aldine'); - $output['status'] = 'error'; - } - } - return $output; - } - return false; - } } diff --git a/app/helpers.php b/app/helpers.php index a8dcf93..e5c4014 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -144,3 +144,62 @@ function remove_hash($color) { return ltrim($color, '#'); } + +/** + * + * Catch a contact form submission. + * + * @return false | array + */ +function contact_form_submission() +{ + if (isset($_POST['submitted'])) { + $output = []; + $name = (isset($_POST['visitor_name'])) ? $_POST['visitor_name'] : false; + $email = (isset($_POST['visitor_email'])) ? $_POST['visitor_email'] : false; + $institution = (isset($_POST['visitor_institution'])) ? $_POST['visitor_institution'] : false; + $message = (isset($_POST['message'])) ? $_POST['message'] : false; + if (!$name) { + $output['message'] = __('Name is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_name'; + } elseif (!$email) { + $output['message'] = __('Email is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_email'; + } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + $output['message'] = __('Email is invalid.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_email'; + } elseif (!$institution) { + $output['message'] = __('Institution is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'visitor_institution'; + } elseif (!$message) { + $output['message'] = __('Message is required.', 'aldine'); + $output['status'] = 'error'; + $output['field'] = 'message'; + } else { + $sent = wp_mail( + get_option('admin_email'), + sprintf(__('Contact Form Submission from %s', 'aldine'), $name), + sprintf( + "From: %1\$s <%2\$s>\n%3\$s", + $name, + $email, + strip_tags($message) + ), + "From: ${email}\r\nReply-To: ${email}\r\n" + ); + if ($sent) { + $output['message'] = __('Your message was sent!', 'aldine'); + $output['status'] = 'success'; + } else { + $output['message'] = __('Your message could not be sent.', 'aldine'); + $output['status'] = 'error'; + } + } + return $output; + } + return false; +} diff --git a/app/setup.php b/app/setup.php index 321a77a..d3e2095 100644 --- a/app/setup.php +++ b/app/setup.php @@ -182,3 +182,8 @@ if ($header_text_color) { } share('contact_form_response', $response); +}); From c2f5f06a9641b40d98dab5043708232bd5681850 Mon Sep 17 00:00:00 2001 From: Ned Zimmerman Date: Wed, 30 Aug 2017 20:02:39 -0300 Subject: [PATCH 03/28] Add custom logo support. --- app/controllers/App.php | 9 ++++++++ app/setup.php | 7 +++++- resources/assets/images/logo.png | Bin 5594 -> 0 bytes resources/assets/images/logo.svg | 1 + resources/assets/images/logo@2x.png | Bin 11316 -> 0 bytes resources/assets/styles/layouts/_header.scss | 23 +++++++++++-------- resources/views/partials/footer.blade.php | 8 +++---- resources/views/partials/header.blade.php | 14 +++++------ 8 files changed, 40 insertions(+), 22 deletions(-) delete mode 100644 resources/assets/images/logo.png create mode 100644 resources/assets/images/logo.svg delete mode 100644 resources/assets/images/logo@2x.png diff --git a/app/controllers/App.php b/app/controllers/App.php index 2c763c5..62cd68b 100644 --- a/app/controllers/App.php +++ b/app/controllers/App.php @@ -6,6 +6,15 @@ use Sober\Controller\Controller; class App extends Controller { + public function siteLogo() + { + if (has_custom_logo()) { + return wp_get_attachment_image($custom_logo_id, 'original'); + } else { + return file_get_contents(get_theme_file_path() . '/dist/' . svg_path('images/logo.svg')); + } + } + public function siteName() { return get_bloginfo('name'); diff --git a/app/setup.php b/app/setup.php index d3e2095..08b0be4 100644 --- a/app/setup.php +++ b/app/setup.php @@ -51,7 +51,12 @@ add_action('after_setup_theme', function () { * Enable custom logos * @link https://developer.wordpress.org/themes/functionality/custom-logo/ */ - add_theme_support('custom-logo'); + add_theme_support('custom-logo', [ + 'height' => 40, + 'width' => 265, + 'flex-width' => true, + 'flex-height' => true, + ]); /** * Enable post thumbnails diff --git a/resources/assets/images/logo.png b/resources/assets/images/logo.png deleted file mode 100644 index 0683a36f4930a82d35138d34c50de4963354b2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5594 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 diff --git a/resources/assets/images/logo@2x.png b/resources/assets/images/logo@2x.png deleted file mode 100644 index ec2b33396b0d1fd460c3137fb55df2c9dfa41f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11316 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

{!! sprintf(__('Powered by %s', 'aldine'), 'Pressbooks') !!}

- @foreach(App::books($current_page, 9, $current_order_by) as $book) + @foreach($books as $book) @include('partials.book', ['book' => $book]) @endforeach
- @if(App::totalPages(9) > 1) + @if($total_pages > 1)