Просмотр исходного кода

implementing additional notifications based on field type

Medowar 2 недель назад
Родитель
Сommit
a8b01ece1a
5 измененных файлов с 60 добавлено и 6 удалено
  1. 11 2
      assets/js/form.js
  2. 11 0
      config/form_schema.php
  3. 12 2
      src/form/validator.php
  4. 7 0
      src/mail/mailer.php
  5. 19 2
      src/mail/mimemailbuilder.php

+ 11 - 2
assets/js/form.js

@@ -752,12 +752,21 @@
     }
 
     const depField = String(rule.field || '').trim();
-    const depValue = String(rule.equals || '');
     if (depField === '') {
       return false;
     }
 
-    return String(formData[depField] || '') === depValue;
+    const actualValue = String(formData[depField] || '');
+
+    if ('equals' in rule) {
+      return actualValue === String(rule.equals || '');
+    }
+
+    if (Array.isArray(rule.in)) {
+      return rule.in.some(val => String(val) === actualValue);
+    }
+
+    return false;
   }
 
   function isFieldVisible(field, formData) {

+ 11 - 0
config/form_schema.php

@@ -506,6 +506,17 @@ return [
                     'required'   => false,
                     'max_length' => 2000,
                 ],
+                [
+                    'key' => 'zusatz_cc_email',
+                    'label' => 'Zusätzliche Empfänger benachrichtigen (CC)',
+                    'type' => 'email',
+                    'required' => false,
+                    'subtext' => 'Geben Sie eine E-Mail-Adresse ein, die ebenfalls über diesen Antrag benachrichtigt werden soll.',
+                    'visible_if' => [
+                        'field' => 'mitgliedsart',
+                        'in' => ['Jugend', 'Spielmannszug'],
+                    ],
+                ],
                 [
                     'key' => 'körperliche_eignung',
                     'label' => 'Körperliche Eignung',

+ 12 - 2
src/form/validator.php

@@ -118,13 +118,23 @@ final class Validator
     private function ruleMatches(array $rule, array $data): bool
     {
         $sourceField = (string) ($rule['field'] ?? '');
-        $equals = (string) ($rule['equals'] ?? '');
 
         if ($sourceField === '') {
             return false;
         }
 
-        return $this->resolveRuleValue($sourceField, $data) === $equals;
+        $actualValue = $this->resolveRuleValue($sourceField, $data);
+
+        if (isset($rule['equals'])) {
+            return $actualValue === (string) $rule['equals'];
+        }
+
+        if (isset($rule['in']) && is_array($rule['in'])) {
+            $inValues = array_map(static fn($v) => (string) $v, $rule['in']);
+            return in_array($actualValue, $inValues, true);
+        }
+
+        return false;
     }
 
     /** @param array<string, mixed> $data */

+ 7 - 0
src/mail/mailer.php

@@ -97,6 +97,9 @@ final class Mailer
         $htmlBody = $this->renderAdminHtml($submission, $isMinorSubmission, $uploadWarning);
         $textBody = $this->renderAdminText($submission, $isMinorSubmission, $uploadWarning);
 
+        $formData = (array) ($submission['form_data'] ?? []);
+        $ccEmail = trim((string) ($formData['zusatz_cc_email'] ?? ''));
+
         foreach ($recipients as $recipient) {
             if (!is_string($recipient) || $recipient === '') {
                 continue;
@@ -109,6 +112,10 @@ final class Mailer
                     ->setHtmlBody($htmlBody)
                     ->setTextBody($textBody);
 
+                if ($ccEmail !== '' && filter_var($ccEmail, FILTER_VALIDATE_EMAIL)) {
+                    $mail->addCc($ccEmail);
+                }
+
                 if ($formDataPdf !== null) {
                     $mail->addAttachment($formDataPdf, 'Antragsdaten.pdf', 'application/pdf');
                 }

+ 19 - 2
src/mail/mimemailbuilder.php

@@ -18,6 +18,8 @@ final class MimeMailBuilder
     private string $textBody = '';
     /** @var array<int, array{path: string, name: string, mime: string}> */
     private array $attachments = [];
+    /** @var array<int, string> */
+    private array $cc = [];
     private string $errorInfo = '';
 
     public function setFrom(string $address, string $name = ''): self
@@ -33,6 +35,15 @@ final class MimeMailBuilder
         return $this;
     }
 
+    public function addCc(string $address): self
+    {
+        $sanitized = $this->sanitizeAddress($address);
+        if ($sanitized !== '') {
+            $this->cc[] = $sanitized;
+        }
+        return $this;
+    }
+
     public function setSubject(string $subject): self
     {
         $this->subject = $this->sanitizeHeaderText($subject);
@@ -111,11 +122,17 @@ final class MimeMailBuilder
 
         $type = $isMixed ? 'multipart/mixed' : 'multipart/alternative';
 
-        return implode("\r\n", [
+        $headers = [
             'From: ' . $from,
             'MIME-Version: 1.0',
             'Content-Type: ' . $type . '; boundary="' . $boundary . '"',
-        ]);
+        ];
+
+        if ($this->cc !== []) {
+            $headers[] = 'Cc: ' . implode(', ', $this->cc);
+        }
+
+        return implode("\r\n", $headers);
     }
 
     private function buildMixedBody(string $mixedBoundary, string $altBoundary): string