From c4d2479caf009b38318892adb5c771aff5283af7 Mon Sep 17 00:00:00 2001 From: Raruto Date: Fri, 22 Jan 2021 18:46:36 +0100 Subject: [PATCH] cleaner forms submit logic --- modules/Forms/admin.php | 3 ++- modules/Forms/bootstrap.php | 45 +++++++++++++++++-------------- modules/Forms/views/api/email.php | 8 ++++++ 3 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 modules/Forms/views/api/email.php diff --git a/modules/Forms/admin.php b/modules/Forms/admin.php index 587d72c26..baf1ca6f2 100755 --- a/modules/Forms/admin.php +++ b/modules/Forms/admin.php @@ -34,7 +34,7 @@ if ($active) { $this->helper('admin')->favicon = 'forms:icon.svg'; - } + } /** * listen to app search to filter forms @@ -78,6 +78,7 @@ 'forms.save.before.{$name}', 'forms.submit.after', 'forms.submit.before', + 'forms.submit.email', ] as &$evt) { $triggers[] = $evt; } }); diff --git a/modules/Forms/bootstrap.php b/modules/Forms/bootstrap.php index 85b3bc439..579008ecb 100755 --- a/modules/Forms/bootstrap.php +++ b/modules/Forms/bootstrap.php @@ -255,25 +255,27 @@ $frm = $this->form($form); + // Invalid form name if (!$frm) { return false; } - // custom form validation + // Load custom form validator if ($this->app->path("#config:forms/{$form}.php") && false===include($this->app->path("#config:forms/{$form}.php"))) { return false; } + // Filter submitted data $this->app->trigger('forms.submit.before', [$form, &$data, $frm, &$options]); + // Send email if (isset($frm['email_forward']) && $frm['email_forward']) { $emails = array_map('trim', explode(',', $frm['email_forward'])); $filtered_emails = []; - foreach ($emails as $to){ - - // Validate each email address individually, push if valid + // Validate each email address individually, push if valid + foreach ($emails as $to) { if ($this->app->helper('utils')->isEmail($to)){ $filtered_emails[] = $to; } @@ -283,42 +285,45 @@ $frm['email_forward'] = implode(',', $filtered_emails); - // There is an email template available + // Load custom email template if ($template = $this->app->path("#config:forms/emails/{$form}.php")) { + $body = $this->app->view($template, ['data' => $data, 'frm' => $frm]); + } - $body = $this->app->renderer->file($template, ['data' => $data, 'frm' => $frm], false); - - // Prepare template manually - } else { - - $body = []; - - foreach ($data as $key => $value) { - $body[] = "{$key}:\n
"; - $body[] = (is_string($value) ? $value:json_encode($value))."\n
"; - } + // Filter email content + $this->app->trigger('forms.submit.email', [$form, &$data, $frm, &$body, &$options]); - $body = implode("\n
", $body); + // Fallback to default email template + if (empty($body)) { + $body = $this->app->view("forms:views/api/email.php", ['data' => $data, 'frm' => $frm]); } $formname = isset($frm['label']) && trim($frm['label']) ? $frm['label'] : $form; + $to = $frm['email_forward']; + $subject = $options['subject'] ?? $this->app->helper('i18n')->getstr("New form data for: %s", [$formname]); + // success = true try { - $response = $this->app->mailer->mail($frm['email_forward'], $options['subject'] ?? "New form data for: {$formname}", $body, $options); + $response = $this->app->mailer->mail($to, $subject, $body, $options); } catch (\Exception $e) { $response = $e->getMessage(); } } } + // Push entry to database if (isset($frm['save_entry']) && $frm['save_entry']) { $entry = ['data' => $data]; $this->save($form, $entry); } - $this->app->trigger('forms.submit.after', [$form, &$data, $frm]); + // Generate response array + $response = (isset($response) && $response !== true) ? ['error' => $response, 'data' => $data] : $data; + + // Filter submission response + $this->app->trigger('forms.submit.after', [$form, &$data, $frm, &$response]); - return (isset($response) && $response !== true) ? ['error' => $response, 'data' => $data] : $data; + return $response; } ]); diff --git a/modules/Forms/views/api/email.php b/modules/Forms/views/api/email.php new file mode 100644 index 000000000..c5a5b6ed4 --- /dev/null +++ b/modules/Forms/views/api/email.php @@ -0,0 +1,8 @@ + + + + @foreach($data as $key => $value) +

{{ $key }}: {{ (is_string($value) ? $value : json_encode($value)) }}

+ @endforeach + +