Sfoglia il codice sorgente

changing it to be in config, not form itself

Medowar 2 settimane fa
parent
commit
b61e2818e3
4 ha cambiato i file con 43 aggiunte e 42 eliminazioni
  1. 2 11
      assets/js/form.js
  2. 16 11
      config/form_schema.php
  3. 7 18
      src/form/validator.php
  4. 18 2
      src/mail/mailer.php

+ 2 - 11
assets/js/form.js

@@ -752,21 +752,12 @@
     }
 
     const depField = String(rule.field || '').trim();
+    const depValue = String(rule.equals || '');
     if (depField === '') {
       return false;
     }
 
-    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;
+    return String(formData[depField] || '') === depValue;
   }
 
   function isFieldVisible(field, formData) {

+ 16 - 11
config/form_schema.php

@@ -3,6 +3,22 @@
 declare(strict_types=1);
 
 return [
+    'additional_notifications' => [
+        [
+            'condition' => [
+                'field' => 'mitgliedsart',
+                'equals' => 'Jugend',
+            ],
+            'cc' => ['jugendwart@example.org'],
+        ],
+        [
+            'condition' => [
+                'field' => 'mitgliedsart',
+                'equals' => 'Spielmannszug',
+            ],
+            'cc' => ['spielmannszug@example.org'],
+        ],
+    ],
     'steps' => [
         [
             'title' => 'Persönliche Daten',
@@ -506,17 +522,6 @@ 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',

+ 7 - 18
src/form/validator.php

@@ -101,7 +101,7 @@ final class Validator
             return false;
         }
 
-        return $this->ruleMatches($field['required_if'], $data);
+        return $this->evaluateCondition($field['required_if'], $data);
     }
 
     /** @param array<string, mixed> $field */
@@ -111,30 +111,19 @@ final class Validator
             return true;
         }
 
-        return $this->ruleMatches($field['visible_if'], $data);
+        return $this->evaluateCondition($field['visible_if'], $data);
     }
 
-    /** @param array<string, mixed> $rule */
-    private function ruleMatches(array $rule, array $data): bool
+    public function evaluateCondition(array $rule, array $data): bool
     {
         $sourceField = (string) ($rule['field'] ?? '');
+        $equals = (string) ($rule['equals'] ?? '');
 
         if ($sourceField === '') {
             return false;
         }
 
-        $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;
+        return $this->resolveRuleValue($sourceField, $data) === $equals;
     }
 
     /** @param array<string, mixed> $data */
@@ -190,11 +179,11 @@ final class Validator
     /** @param array<string, mixed> $option */
     private function isOptionVisible(array $option, array $data): bool
     {
-        if (isset($option['visible_if']) && is_array($option['visible_if']) && !$this->ruleMatches($option['visible_if'], $data)) {
+        if (isset($option['visible_if']) && is_array($option['visible_if']) && !$this->evaluateCondition($option['visible_if'], $data)) {
             return false;
         }
 
-        if (isset($option['hidden_if']) && is_array($option['hidden_if']) && $this->ruleMatches($option['hidden_if'], $data)) {
+        if (isset($option['hidden_if']) && is_array($option['hidden_if']) && $this->evaluateCondition($option['hidden_if'], $data)) {
             return false;
         }
 

+ 18 - 2
src/mail/mailer.php

@@ -98,7 +98,23 @@ final class Mailer
         $textBody = $this->renderAdminText($submission, $isMinorSubmission, $uploadWarning);
 
         $formData = (array) ($submission['form_data'] ?? []);
-        $ccEmail = trim((string) ($formData['zusatz_cc_email'] ?? ''));
+        $ccEmails = [];
+        $notifications = (array) ($this->schema->raw()['additional_notifications'] ?? []);
+        $validator = new \App\Form\Validator($this->schema);
+        
+        foreach ($notifications as $notification) {
+            if (!isset($notification['condition']) || !is_array($notification['condition'])) {
+                continue;
+            }
+            if ($validator->evaluateCondition($notification['condition'], $formData)) {
+                $ccs = (array) ($notification['cc'] ?? []);
+                foreach ($ccs as $cc) {
+                    if (is_string($cc) && filter_var($cc, FILTER_VALIDATE_EMAIL)) {
+                        $ccEmails[] = trim($cc);
+                    }
+                }
+            }
+        }
 
         foreach ($recipients as $recipient) {
             if (!is_string($recipient) || $recipient === '') {
@@ -112,7 +128,7 @@ final class Mailer
                     ->setHtmlBody($htmlBody)
                     ->setTextBody($textBody);
 
-                if ($ccEmail !== '' && filter_var($ccEmail, FILTER_VALIDATE_EMAIL)) {
+                foreach ($ccEmails as $ccEmail) {
                     $mail->addCc($ccEmail);
                 }