Compare commits

...

9 Commits

Author SHA1 Message Date
5c197f2299 Merge pull request '#125_fehler_im_kontaktformular' (#126) from #125_fehler_im_kontaktformular into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #126
2022-08-24 22:41:21 +02:00
ddc89d5bd6 fix: Don't load contact_form.js and contact_from_toggle.js on all pages.
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 20:05:02 +02:00
3b14c01591
Only load or do things if necessary
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 15:27:20 +02:00
0882053a42
Handle request errors 2022-08-24 15:15:08 +02:00
f9229b5998
Make ajax URL relative to webroot and variable name more unique 2022-08-24 15:13:39 +02:00
42b9b3a62e
Set the return path via the envelope sender
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 14:35:01 +02:00
590cbfbb65 feat: Type hinting all the way.
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 08:03:54 +02:00
aebb53e5c1 fix: Fixed undefined variables error. 2022-08-24 08:03:27 +02:00
7df4a24abd fix: Fixed broken replacement for newlines. 2022-08-24 07:59:58 +02:00
4 changed files with 55 additions and 29 deletions

View File

@ -1,29 +1,45 @@
const ajaxUrl = '../php/contact_form.php'; const contactFormAjaxUrl = '/php/contact_form.php';
const contact_form = document.getElementsByClassName('content__contact_form')[0];
const subject = document.getElementsByClassName('contact_form__subject')[0];
const message = document.getElementsByClassName('contact_form__message')[0];
const name = document.getElementsByClassName('contact_form__name')[0];
const email = document.getElementsByClassName('contact_form__email')[0];
const captcha = document.getElementsByClassName('contact_form__captcha')[0];
const now = (new Date().getTime()/1000).toFixed();
const feedback = document.getElementsByClassName('contact_form__feedback')[0];
window.addEventListener('DOMContentLoaded', function(event) { window.addEventListener('DOMContentLoaded', function() {
const contact_form = document.getElementsByClassName('content__contact_form')[0];
if (contact_form) {
contact_form.addEventListener('submit', wtf_submitContactForm, false);
wtf_startContactFormSession();
}
});
function wtf_startContactFormSession() {
let formData = new FormData(); let formData = new FormData();
formData.append('action', 'start_session'); formData.append('action', 'start_session');
fetch(ajaxUrl, { fetch(contactFormAjaxUrl, {
method: 'POST', method: 'POST',
mode: 'same-origin', mode: 'same-origin',
body: formData, body: formData,
}) })
.then(response => response.json()) .then(response => {
if (!response.ok) {
throw new Error('Response was not OK');
}
return response.json();
})
.then(json => { .then(json => {
console.log(json); console.log(json);
}) })
}); .catch(error => {
console.error('Could not start the session:', error);
});
}
contact_form.addEventListener('submit', function(event) { function wtf_submitContactForm(event) {
event.preventDefault(); event.preventDefault();
const subject = document.getElementsByClassName('contact_form__subject')[0];
const message = document.getElementsByClassName('contact_form__message')[0];
const name = document.getElementsByClassName('contact_form__name')[0];
const email = document.getElementsByClassName('contact_form__email')[0];
const captcha = document.getElementsByClassName('contact_form__captcha')[0];
let formData = new FormData(); let formData = new FormData();
formData.append('action', 'handle_form'); formData.append('action', 'handle_form');
formData.append('subject', subject.value); formData.append('subject', subject.value);
@ -39,13 +55,14 @@ contact_form.addEventListener('submit', function(event) {
return; return;
} }
fetch(ajaxUrl, { fetch(contactFormAjaxUrl, {
method: 'POST', method: 'POST',
mode: 'same-origin', mode: 'same-origin',
body: formData, body: formData,
}) })
.then(response => response.json()) .then(response => response.json())
.then(json => { .then(json => {
const feedback = document.getElementsByClassName('contact_form__feedback')[0];
console.log(json); console.log(json);
if (json.errors) { if (json.errors) {
feedback.classList.remove('--success'); feedback.classList.remove('--success');
@ -75,4 +92,4 @@ contact_form.addEventListener('submit', function(event) {
} }
}) })
.catch(error => console.log(error)); .catch(error => console.log(error));
}, false); }

View File

@ -1,5 +1,7 @@
/* Unhide contact form if JS is enabled */ /* Unhide contact form if JS is enabled */
window.addEventListener('DOMContentLoaded', (event) => { window.addEventListener('DOMContentLoaded', (event) => {
const contact_form_wrapper = document.getElementsByClassName('content__contact_form_wrapper')[0]; const contact_form_wrapper = document.getElementsByClassName('content__contact_form_wrapper')[0];
contact_form_wrapper.style.setProperty('display', 'block'); if (contact_form_wrapper) {
contact_form_wrapper.style.setProperty('display', 'block');
}
}); });

View File

@ -6,17 +6,16 @@ function sanitize_text(string $name, string $type) {
'text' => FILTER_SANITIZE_SPECIAL_CHARS, 'text' => FILTER_SANITIZE_SPECIAL_CHARS,
'email' => FILTER_SANITIZE_EMAIL, 'email' => FILTER_SANITIZE_EMAIL,
); );
$text = trim($text); $text = filter_var(trim($_POST[$name]), $filters[$type]);
$text = filter_var($_POST[$name], $filters[$type]);
$text = stripslashes($text); $text = stripslashes($text);
return $text; return $text;
} }
function prepare_message_body($message) { function prepare_message_body(string $message, string $name) {
// Replace HTML-Entities with actual carriage returns and line feeds // Replace HTML-Entities with actual carriage returns and line feeds
$message = str_replace("
", "\r", $message); $message = str_replace("
", "\r", $message);
$message = str_replace("
", "\r", $message); $message = str_replace("
", "\n", $message);
// Ensure line breaks via carriage return + line feed // Ensure line breaks via carriage return + line feed
$message = str_replace("\r\n", "\n", $message); $message = str_replace("\r\n", "\n", $message);
@ -34,22 +33,30 @@ function prepare_message_body($message) {
* mail(): Braucht auf dem Server einen korrekt konfigurierten Mailserver * mail(): Braucht auf dem Server einen korrekt konfigurierten Mailserver
* phpmailer: Bibliothek, der per Composer installiert wird. Tut ganz gut mit SMTP. * phpmailer: Bibliothek, der per Composer installiert wird. Tut ganz gut mit SMTP.
*/ */
function send_message_to_office($subject, $message, $name, $email) { function send_message_to_office(string $subject, string $message, string $name, string $email) {
$returnPath = filter_var(getenv('WTF_RETURN_PATH'), FILTER_VALIDATE_EMAIL);
$to = filter_var(getenv('WTF_CONTACT_TO'), FILTER_VALIDATE_EMAIL);
if (!$returnPath || !$to) {
error_log('Address for "To" or "Return-Path" is invalid');
return false;
}
return mail( return mail(
getenv('WTF_CONTACT_TO'), $to,
"=?UTF-8?B?" . base64_encode($subject) . "?=", "=?UTF-8?B?" . base64_encode($subject) . "?=",
prepare_message_body($message), prepare_message_body($message, $name),
$additional_headers = array( array(
"From" => getenv('WTF_CONTACT_FROM'), "From" => getenv('WTF_CONTACT_FROM'),
"Reply-To" => $email, "Reply-To" => $email,
"Return-Path" => getenv('WTF_RETURN_PATH'),
"Content-Type" => "text/plain; charset=utf-8", "Content-Type" => "text/plain; charset=utf-8",
"Content-Transfer-Encoding" => "base64", "Content-Transfer-Encoding" => "base64",
), ),
"-f $returnPath"
); );
} }
function send_response($response_data) { function send_response(array $response_data) {
$json = json_encode($response_data); $json = json_encode($response_data);
if ($json === false) { if ($json === false) {
// Avoid echo of empty string (which is invalid JSON), and // Avoid echo of empty string (which is invalid JSON), and

View File

@ -63,7 +63,7 @@ __ ____________________
{% if 'manifest.json'|asseturl is defined -%} {% if 'manifest.json'|asseturl is defined -%}
<link rel="manifest" href="{{ 'manifest.json'|asseturl }}"> <link rel="manifest" href="{{ 'manifest.json'|asseturl }}">
{%- endif %} {%- endif %}
{% if '/js/contact_form_toggle.js'|asseturl is defined -%} {% if '/js/contact_form_toggle.js'|asseturl is defined and this.title == 'Kontakt' -%}
<script type="text/javascript" src="{{ '/js/contact_form_toggle.js'|asseturl }}"></script> <script type="text/javascript" src="{{ '/js/contact_form_toggle.js'|asseturl }}"></script>
{%- endif %} {%- endif %}
</head> </head>
@ -131,7 +131,7 @@ __ ____________________
{%- if '/js/nav_toggle.js'|asseturl is defined -%} {%- if '/js/nav_toggle.js'|asseturl is defined -%}
<script type="text/javascript" src="{{ '/js/nav_toggle.js'|asseturl }}"></script> <script type="text/javascript" src="{{ '/js/nav_toggle.js'|asseturl }}"></script>
{%- endif %} {%- endif %}
{% if '/js/contact_form_toggle.js'|asseturl is defined -%} {% if '/js/contact_form_toggle.js'|asseturl is defined and this.title == 'Kontakt' -%}
<script type="text/javascript" src="{{ '/js/contact_form.js'|asseturl }}"></script> <script type="text/javascript" src="{{ '/js/contact_form.js'|asseturl }}"></script>
{%- endif %} {%- endif %}
</body> </body>