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 @@
+
+
+
{{ $key }}: {{ (is_string($value) ? $value : json_encode($value)) }}
+ @endforeach + +