PluginProbe
The Innovative Form Builder – IvyForms / 1.5.1
The Innovative Form Builder – IvyForms v1.5.1
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/Repository/Field/FieldRepository.php +172 -112 0.8 → 1.5.1 View file →
@@ -6,13 +6,8 @@
6 6 */
7 7
8 8 namespace IvyForms\Repository\Field;
9 9
10 -// phpcs:disable PSR1.Files.SideEffects
11 -if (!defined('ABSPATH')) {
12 - exit; // Exit if accessed directly
13 -}
14 -
15 10 use IvyForms\Common\Exceptions\InvalidArgumentException;
16 11 use IvyForms\Common\Exceptions\QueryExecutionException;
17 12 use IvyForms\Entity\Field\Field;
18 13 use IvyForms\Factory\Field\FieldFactory;
@@ -56,63 +51,13 @@
56 51 'rowIndex' => $data['rowIndex'] ?? 0,
57 52 'columnIndex' => $data['columnIndex'] ?? 0,
58 53 'width' => $data['width'] ?? 100,
59 54 'parentId' => $data['parentId'] ?? null,
60 - 'settings' => json_encode(
61 - /**
62 - * Allows modification of the settings data before saving to database.
63 - * @since 0.1.0
64 - *
65 - * @param mixed[] $settings The current settings array.
66 - * @param mixed[] $data The full field data array.
67 - * @param Field $entity The Field entity instance.
68 - * @return mixed[] The modified settings array.
69 - */
70 - apply_filters(
71 - 'ivyforms/repository/field/settings',
72 - [
73 - 'hideLabel' => (int)$data['hideLabel'],
74 - 'readOnly' => (int)$data['readOnly'],
75 - 'description' => $data['description'],
76 - 'requiredMessage' => $data['requiredMessage'],
77 - 'cssClasses' => $data['cssClasses'],
78 - 'limitMaxLength' => (int)$data['limitMaxLength'],
79 - 'maxLength' => $data['maxLength'],
80 - 'labelPosition' => $data['labelPosition'],
81 - 'noDuplicates' => (int)$data['noDuplicates'],
82 - 'shuffleOptions' => (int)$data['shuffleOptions'],
83 - 'showValues' => (int)$data['showValues'],
84 - 'enableSearch' => (int)$data['enableSearch'],
85 - 'rows' => (int)$data['rows'],
86 - 'confirmFieldEnabled' => (int)($data['confirmFieldEnabled'] ?? 0),
87 - 'confirmFieldLabel' => $data['confirmFieldLabel'] ?? '',
88 - 'confirmFieldPlaceholder' => $data['confirmFieldPlaceholder'] ?? '',
89 - 'confirmFieldHideLabel' => (int)($data['confirmFieldHideLabel'] ?? 0),
90 - 'phoneFormat' => $data['phoneFormat'],
91 - 'phoneAutoDetect' => $data['phoneAutoDetect'],
92 - 'minValue' => isset($data['minValue'])
93 - ? (float)$data['minValue'] : null,
94 - 'maxValue' => isset($data['maxValue'])
95 - ? (float)$data['maxValue'] : null,
96 - 'step' => (float)$data['step'],
97 - 'numberFormat' => $data['numberFormat'] ?? '',
98 - 'visible' => (int)$data['visible'],
99 - 'inputPrefix' => $data['inputPrefix'] ?? '',
100 - 'inputSuffix' => $data['inputSuffix'] ?? '',
101 - 'timeFieldType' => $data['timeFieldType'] ?? '',
102 - 'timeFormat' => $data['timeFormat'] ?? '',
103 - 'dateFieldType' => $data['dateFieldType'] ?? '',
104 - 'dateFormat' => $data['dateFormat'] ?? '',
105 - 'minDateValue' => $data['minDateValue'] ?? '',
106 - 'maxDateValue' => $data['maxDateValue'] ?? '',
107 - ],
108 - $data,
109 - $entity
110 - )
111 - ),
55 + 'pageId' => $data['pageId'] ?? null,
56 + 'settings' => $this->encodeFieldSettings($data, $entity, false),
112 57 'dateCreated' => current_time('mysql')
113 58 ],
114 - ['%d', '%d', '%s', '%s', '%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%s', '%s']
59 + ['%d', '%d', '%s', '%s', '%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%s']
115 60 );
116 61
117 62 if ($result === false) {
118 63 throw new QueryExecutionException(
@@ -134,8 +79,11 @@
134 79 * @throws QueryExecutionException
135 80 */
136 81 public function update(int $id, $entity): bool
137 82 {
83 + if ($id < 1) {
84 + throw new InvalidArgumentException('Field id must be a positive integer.');
85 + }
138 86
139 87 $data = $entity->toArray();
140 88
141 89 $result = $this->wpdb->update(
@@ -152,63 +100,13 @@
152 100 'rowIndex' => $data['rowIndex'] ?? 0,
153 101 'columnIndex' => $data['columnIndex'] ?? 0,
154 102 'width' => $data['width'] ?? 100,
155 103 'parentId' => $data['parentId'] ?? null,
156 - 'settings' => json_encode(
157 - /**
158 - * Allows modification of the settings data before updating database.
159 - * @since 0.1.0
160 - *
161 - * @param mixed[] $settings The current settings array.
162 - * @param mixed[] $data The full field data array.
163 - * @param Field $entity The Field entity instance.
164 - * @return mixed[] The modified settings array.
165 - */
166 - apply_filters(
167 - 'ivyforms/repository/field/settings',
168 - [
169 - 'hideLabel' => (int)$data['hideLabel'],
170 - 'readOnly' => (int)$data['readOnly'],
171 - 'description' => $data['description'],
172 - 'requiredMessage' => $data['requiredMessage'],
173 - 'cssClasses' => $data['cssClasses'],
174 - 'limitMaxLength' => (int)$data['limitMaxLength'],
175 - 'maxLength' => $data['maxLength'],
176 - 'labelPosition' => $data['labelPosition'],
177 - 'noDuplicates' => (int)$data['noDuplicates'],
178 - 'shuffleOptions' => (int)$data['shuffleOptions'],
179 - 'showValues' => (int)$data['showValues'],
180 - 'enableSearch' => (int)$data['enableSearch'],
181 - 'rows' => (int)$data['rows'],
182 - 'confirmFieldEnabled' => (int)($data['confirmFieldEnabled'] ?? 0),
183 - 'confirmFieldLabel' => $data['confirmFieldLabel'] ?? '',
184 - 'confirmFieldPlaceholder' => $data['confirmFieldPlaceholder'] ?? '',
185 - 'confirmFieldHideLabel' => (int)($data['confirmFieldHideLabel'] ?? 0),
186 - 'phoneFormat' => $data['phoneFormat'],
187 - 'phoneAutoDetect' => $data['phoneAutoDetect'],
188 - 'minValue' => isset($data['minValue'])
189 - ? (float)$data['minValue'] : null,
190 - 'maxValue' => isset($data['maxValue'])
191 - ? (float)$data['maxValue'] : null,
192 - 'step' => (float)$data['step'],
193 - 'numberFormat' => $data['numberFormat'] ?? '',
194 - 'visible' => array_key_exists('visible', $data) ? (int)$data['visible'] : 1,
195 - 'inputPrefix' => $data['inputPrefix'] ?? '',
196 - 'inputSuffix' => $data['inputSuffix'] ?? '',
197 - 'timeFieldType' => $data['timeFieldType'] ?? '',
198 - 'timeFormat' => $data['timeFormat'] ?? '',
199 - 'dateFieldType' => $data['dateFieldType'] ?? '',
200 - 'dateFormat' => $data['dateFormat'] ?? '',
201 - 'minDateValue' => $data['minDateValue'] ?? '',
202 - 'maxDateValue' => $data['maxDateValue'] ?? '',
203 - ],
204 - $data,
205 - $entity
206 - )
207 - ),
104 + 'pageId' => $data['pageId'] ?? null,
105 + 'settings' => $this->encodeFieldSettings($data, $entity, true),
208 106 ],
209 - ['id' => $data['id']],
210 - ['%d', '%d', '%s', '%s', '%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%s'],
107 + ['id' => $id],
108 + ['%d', '%d', '%s', '%s', '%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%s', '%s'],
211 109 ['%d']
212 110 );
213 111
214 112 if ($result === false) {
@@ -215,8 +113,170 @@
215 113 throw new QueryExecutionException(BackendStrings::getAllFormsStrings()['unable_to_save_data'] . __CLASS__);
216 114 }
217 115
218 116 return $result;
117 + }
118 +
119 + /**
120 + * @param mixed[] $data
121 + */
122 + private function encodeFieldSettings(array $data, Field $entity, bool $forUpdate): string
123 + {
124 + $settings = $this->buildFieldSettingsPayload($data, $forUpdate);
125 +
126 + /**
127 + * Allows modification of the settings data before saving to database.
128 + *
129 + * @param mixed[] $settings The current settings array.
130 + * @param mixed[] $data The full field data array.
131 + * @param Field $entity The Field entity instance.
132 + * @return mixed[] The modified settings array.
133 + */
134 + $settings = apply_filters('ivyforms/repository/field/settings', $settings, $data, $entity);
135 +
136 + $encoded = wp_json_encode($settings);
137 + if ($encoded === false) {
138 + throw new QueryExecutionException(
139 + 'Failed to encode field settings: ' . json_last_error_msg()
140 + );
141 + }
142 +
143 + return $encoded;
144 + }
145 +
146 + /**
147 + * @param mixed[] $data
148 + *
149 + * @return mixed[]
150 + */
151 + private function buildFieldSettingsPayload(array $data, bool $forUpdate): array
152 + {
153 + return array_merge(
154 + $this->buildCoreFieldSettings($data, $forUpdate),
155 + $this->buildFileUploadFieldSettings($data)
156 + );
157 + }
158 +
159 + /**
160 + * @param mixed[] $data
161 + *
162 + * @return mixed[]
163 + */
164 + private function buildCoreFieldSettings(array $data, bool $forUpdate): array
165 + {
166 + return array_merge(
167 + $this->buildBaseFieldSettings($data),
168 + [
169 + 'limitRange' => $this->resolveLimitRangeFlag($data, $forUpdate),
170 + 'visible' => $this->resolveVisibleFlag($data, $forUpdate),
171 + ],
172 + $this->buildExtendedFieldSettings($data)
173 + );
174 + }
175 +
176 + /**
177 + * @param mixed[] $data
178 + *
179 + * @return mixed[]
180 + */
181 + private function buildBaseFieldSettings(array $data): array
182 + {
183 + return [
184 + 'hideLabel' => (int) $data['hideLabel'],
185 + 'readOnly' => (int) $data['readOnly'],
186 + 'description' => $data['description'],
187 + 'requiredMessage' => $data['requiredMessage'],
188 + 'cssClasses' => $data['cssClasses'],
189 + 'limitMaxLength' => (int) $data['limitMaxLength'],
190 + 'maxLength' => $data['maxLength'],
191 + 'labelPosition' => $data['labelPosition'],
192 + 'noDuplicates' => (int) $data['noDuplicates'],
193 + 'shuffleOptions' => (int) $data['shuffleOptions'],
194 + 'showValues' => (int) $data['showValues'],
195 + 'enableSearch' => (int) $data['enableSearch'],
196 + 'rows' => (int) $data['rows'],
197 + ];
198 + }
199 +
200 + /**
201 + * @param mixed[] $data
202 + *
203 + * @return mixed[]
204 + */
205 + private function buildExtendedFieldSettings(array $data): array
206 + {
207 + return [
208 + 'confirmFieldEnabled' => (int) ($data['confirmFieldEnabled'] ?? 0),
209 + 'confirmFieldLabel' => $data['confirmFieldLabel'] ?? '',
210 + 'confirmFieldPlaceholder' => $data['confirmFieldPlaceholder'] ?? '',
211 + 'confirmFieldHideLabel' => (int) ($data['confirmFieldHideLabel'] ?? 0),
212 + 'phoneFormat' => $data['phoneFormat'],
213 + 'phoneAutoDetect' => $data['phoneAutoDetect'],
214 + 'minValue' => isset($data['minValue']) ? (float) $data['minValue'] : null,
215 + 'maxValue' => isset($data['maxValue']) ? (float) $data['maxValue'] : null,
216 + 'step' => (float) $data['step'],
217 + 'showGrid' => (int) ($data['showGrid'] ?? 0),
218 + 'numberFormat' => $data['numberFormat'] ?? '',
219 + 'inputPrefix' => $data['inputPrefix'] ?? '',
220 + 'inputSuffix' => $data['inputSuffix'] ?? '',
221 + 'timeFieldType' => $data['timeFieldType'] ?? '',
222 + 'timeFormat' => $data['timeFormat'] ?? '',
223 + 'dateFieldType' => $data['dateFieldType'] ?? '',
224 + 'dateFormat' => $data['dateFormat'] ?? '',
225 + 'minDateValue' => $data['minDateValue'] ?? '',
226 + 'maxDateValue' => $data['maxDateValue'] ?? '',
227 + 'showRatingText' => (int) ($data['showRatingText'] ?? 0),
228 + 'ratingIcon' => $data['ratingIcon'] ?? 'star',
229 + 'htmlContent' => $data['htmlContent'] ?? '',
230 + 'agreementText' => $data['agreementText'] ?? '',
231 + 'limitDateRange' => (int) $data['limitDateRange'],
232 + 'minTimeValue' => $data['minTimeValue'] ?? '',
233 + 'maxTimeValue' => $data['maxTimeValue'] ?? '',
234 + 'limitTimeRange' => (int) $data['limitTimeRange'],
235 + 'nameFieldType' => $data['nameFieldType'] ?? '',
236 + 'subFieldIndex' => isset($data['subFieldIndex']) ? (int) $data['subFieldIndex'] : null,
237 + ];
238 + }
239 +
240 + /**
241 + * @param mixed[] $data
242 + */
243 + private function resolveLimitRangeFlag(array $data, bool $forUpdate): int
244 + {
245 + if (!$forUpdate) {
246 + return (int) $data['limitRange'];
247 + }
248 +
249 + return filter_var($data['limitRange'], FILTER_VALIDATE_BOOLEAN) ? 1 : 0;
250 + }
251 +
252 + /**
253 + * @param mixed[] $data
254 + */
255 + private function resolveVisibleFlag(array $data, bool $forUpdate): int
256 + {
257 + if (!$forUpdate) {
258 + return (int) $data['visible'];
259 + }
260 +
261 + return array_key_exists('visible', $data) ? (int) $data['visible'] : 1;
262 + }
263 +
264 + /**
265 + * @param mixed[] $data
266 + *
267 + * @return mixed[]
268 + */
269 + private function buildFileUploadFieldSettings(array $data): array
270 + {
271 + return [
272 + 'maxFileSizeMb' => isset($data['maxFileSizeMb']) ? (int) $data['maxFileSizeMb'] : 0,
273 + 'saveUploadsTo' => (string) ($data['saveUploadsTo'] ?? 'ivyforms'),
274 + 'allowedFileExtensions' => isset($data['allowedFileExtensions'])
275 + && is_array($data['allowedFileExtensions'])
276 + ? array_values($data['allowedFileExtensions'])
277 + : [],
278 + ];
219 279 }
220 280
221 281 /**
222 282 * Get fields by form ID