PluginProbe
The Innovative Form Builder – IvyForms / 1.5
The Innovative Form Builder – IvyForms v1.5
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
← All changes | backend/src/Factory/Notification/NotificationFactory.php +95 -5 1.0 → 1.5 View file →
@@ -14,8 +14,27 @@
14 14 */
15 15 class NotificationFactory
16 16 {
17 17 /**
18 + * Lite-owned keys; everything else is treated as extension data (Pro / add-ons).
19 + *
20 + * @var string[]
21 + */
22 + private const KNOWN_NOTIFICATION_DATA_KEYS = [
23 + 'id',
24 + 'name',
25 + 'sender',
26 + 'replyTo',
27 + 'receiver',
28 + 'enabled',
29 + 'subject',
30 + 'message',
31 + 'showEmptyFields',
32 + 'smartLogic',
33 + 'formId',
34 + ];
35 +
36 + /**
18 37 * Create a NotificationEntity from an array of data.
19 38 *
20 39 * @param array<string, mixed> $data
21 40 *
@@ -23,12 +42,25 @@
23 42 * @throws InvalidArgumentException
24 43 */
25 44 public static function create(array $data): NotificationEntity
26 45 {
46 + /**
47 + * Normalize/augment notification factory input (e.g. Pro attachment fields from DB).
48 + *
49 + * @since 1.2.0
50 + *
51 + * @param array<string, mixed> $data
52 + */
53 + $data = apply_filters('ivyforms/notification/factory_data', $data);
54 +
55 + $smartLogic = self::normalizeSmartLogic($data['smartLogic'] ?? false);
56 +
27 57 $contact = new NotificationContact(
28 58 $data['sender'] ?? '',
29 59 $data['receiver'] ?? '',
30 - $data['replyTo'] ?? ''
60 + $data['replyTo'] ?? '',
61 + $data['cc'] ?? '',
62 + $data['bcc'] ?? ''
31 63 );
32 64
33 65 $notificationValueObject = new Notification(
34 66 $data['id'] ?? 0,
@@ -36,10 +68,10 @@
36 68 $contact,
37 69 $data['enabled'] ?? true,
38 70 $data['subject'] ?? '',
39 71 $data['message'] ?? '',
40 - $data['showEmptyFields'] ?? false,
41 - $data['smartLogic'] ?? false,
72 + (bool) ($data['showEmptyFields'] ?? false),
73 + $smartLogic,
42 74 $data['formId'] ?? 0
43 75 );
44 76
45 77 $notificationEntity = new NotificationEntity($notificationValueObject);
@@ -63,8 +95,16 @@
63 95 if (isset($data['receiver'])) {
64 96 $notificationEntity->getNotificationContact()->setReceiver($data['receiver']);
65 97 }
66 98
99 + if (isset($data['cc'])) {
100 + $notificationEntity->getNotificationContact()->setCc($data['cc']);
101 + }
102 +
103 + if (isset($data['bcc'])) {
104 + $notificationEntity->getNotificationContact()->setBcc($data['bcc']);
105 + }
106 +
67 107 if (isset($data['enabled'])) {
68 108 $notificationEntity->setEnabled($data['enabled']);
69 109 }
70 110
@@ -76,13 +116,13 @@
76 116 $notificationEntity->setMessage(wp_unslash($data['message']));
77 117 }
78 118
79 119 if (isset($data['showEmptyFields'])) {
80 - $notificationEntity->setShowEmptyFields($data['showEmptyFields']);
120 + $notificationEntity->setShowEmptyFields((bool) $data['showEmptyFields']);
81 121 }
82 122
83 123 if (isset($data['smartLogic'])) {
84 - $notificationEntity->setSmartLogic($data['smartLogic']);
124 + $notificationEntity->setSmartLogic($smartLogic);
85 125 }
86 126
87 127 if (isset($data['formId'])) {
88 128 $notificationEntity->setFormId($data['formId']);
@@ -87,7 +127,57 @@
87 127 if (isset($data['formId'])) {
88 128 $notificationEntity->setFormId($data['formId']);
89 129 }
90 130
131 + $notificationEntity->setExtensionData(self::extractExtensionData($data));
132 +
91 133 return $notificationEntity;
134 + }
135 +
136 + /**
137 + * Keys in $data that are not owned by Lite.
138 + *
139 + * @param array<string, mixed> $data
140 + * @return array<string, mixed>
141 + */
142 + private static function extractExtensionData(array $data): array
143 + {
144 + return array_diff_key($data, array_flip(self::KNOWN_NOTIFICATION_DATA_KEYS));
145 + }
146 +
147 + /**
148 + * Normalize smartLogic from DB/API payload.
149 + *
150 + * @param mixed $smartLogic
151 + * @return array<string, mixed>
152 + */
153 + private static function normalizeSmartLogic($smartLogic): array
154 + {
155 + if (is_array($smartLogic)) {
156 + $match = $smartLogic['match'] ?? 'any';
157 +
158 + return [
159 + 'enabled' => (bool)($smartLogic['enabled'] ?? false),
160 + 'match' => in_array($match, ['any', 'all'], true) ? $match : 'any',
161 + 'rules' => is_array($smartLogic['rules'] ?? null) ? $smartLogic['rules'] : [],
162 + ];
163 + }
164 +
165 + if (is_string($smartLogic)) {
166 + $decoded = json_decode($smartLogic, true);
167 + if (is_array($decoded)) {
168 + return self::normalizeSmartLogic($decoded);
169 + }
170 + return [
171 + 'enabled' => in_array(strtolower($smartLogic), ['1', 'true'], true),
172 + 'match' => 'any',
173 + 'rules' => [],
174 + ];
175 + }
176 +
177 + return [
178 + 'enabled' => (bool)$smartLogic,
179 + 'match' => 'any',
180 + 'rules' => [],
181 + ];
92 182 }
93 183 }