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
ivyforms / backend / src / Services / Field / FieldDuplicateValidationService.php

FieldDuplicateValidationService.php in The Innovative Form Builder – IvyForms 1.5, at backend/src/Services/Field/FieldDuplicateValidationService.php

106 lines 3.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace IvyForms\Services\Field;
4
5 use IvyForms\Common\Sanitizer\Sanitizer;
6 use IvyForms\Entity\Field\Field;
7 use IvyForms\Repository\EntryField\EntryFieldRepositoryInterface;
8
9 /**
10 * Validates no-duplicates field values against stored submissions.
11 */
12 class FieldDuplicateValidationService
13 {
14 private EntryFieldRepositoryInterface $entryFieldRepository;
15
16 public function __construct(EntryFieldRepositoryInterface $entryFieldRepository)
17 {
18 $this->entryFieldRepository = $entryFieldRepository;
19 }
20
21 /**
22 * @param Field[] $formFields
23 * @param array<string,mixed> $submissionData
24 * @return array{0: bool, 1: array<int|string,bool>}
25 */
26 public function checkDuplicateFieldValues(
27 array $formFields,
28 array $submissionData,
29 int $formId,
30 ?string $pageId = null,
31 ?int $excludeEntryId = null
32 ): array {
33 $duplicateErrors = [];
34 $isDuplicate = false;
35 $fieldValues = [];
36
37 foreach ($formFields as $field) {
38 if (!$this->isFieldOnPage($field, $pageId)) {
39 continue;
40 }
41 $fid = $field->getId();
42 $fidStr = (string) $fid;
43 if (isset($submissionData[$fidStr])) {
44 $fieldValues[$fidStr] = $submissionData[$fidStr];
45 }
46 if (!$this->shouldCheckDuplicateValue($field, $fieldValues, $fidStr)) {
47 continue;
48 }
49 $rawVal = $fieldValues[$fidStr];
50 $baseNormalized = Sanitizer::normalizeFieldValue($rawVal);
51 $val = apply_filters(
52 'ivyforms/field/normalize_value_for_duplicate_check',
53 $baseNormalized,
54 $field,
55 $rawVal
56 );
57
58 $isFieldDuplicate = $val !== $baseNormalized
59 ? $this->entryFieldRepository->checkDuplicateValueNormalized(
60 $formId,
61 $fid,
62 (string) $val,
63 static function (string $stored) use ($field): string {
64 return (string) apply_filters(
65 'ivyforms/field/normalize_value_for_duplicate_check',
66 Sanitizer::normalizeFieldValue($stored),
67 $field,
68 $stored
69 );
70 },
71 $excludeEntryId
72 )
73 : $this->entryFieldRepository->checkDuplicateValue($formId, $fid, (string) $val, $excludeEntryId);
74
75 if ($isFieldDuplicate) {
76 $duplicateErrors[$fidStr] = true;
77 $isDuplicate = true;
78 }
79 }
80
81 return [$isDuplicate, $duplicateErrors];
82 }
83
84 private function isFieldOnPage(Field $field, ?string $pageId): bool
85 {
86 return $pageId === null || $field->getPageId() === $pageId;
87 }
88
89 /**
90 * @param array<string, mixed> $fieldValues
91 */
92 private function shouldCheckDuplicateValue(Field $field, array $fieldValues, string $fidStr): bool
93 {
94 if (!$field->getFieldAdvancedSettings()->isNoDuplicates()) {
95 return false;
96 }
97 if (!array_key_exists($fidStr, $fieldValues)) {
98 return false;
99 }
100
101 $value = $fieldValues[$fidStr];
102
103 return $value !== '' && $value !== null;
104 }
105 }
106