PluginProbe
The Innovative Form Builder – IvyForms / 1.4
The Innovative Form Builder – IvyForms v1.4
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 / Controllers / Form / ValidateBeforeSubmitController.php

ValidateBeforeSubmitController.php in The Innovative Form Builder – IvyForms 1.4, at backend/src/Controllers/Form/ValidateBeforeSubmitController.php

117 lines 3.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * @copyright © Melograno Venture Studio. All rights reserved.
5 * @licence See COPYING.md for license details.
6 */
7
8 namespace IvyForms\Controllers\Form;
9
10 use IvyForms\Common\Exceptions\InvalidArgumentException;
11 use IvyForms\Common\Exceptions\NotFoundException;
12 use IvyForms\Common\Sanitizer\Sanitizer;
13 use IvyForms\Controllers\Controller;
14 use IvyForms\Services\Field\FieldDuplicateValidationService;
15 use IvyForms\Services\Field\FieldService;
16 use IvyForms\Services\Form\FormService;
17 use IvyForms\Services\Translations\BackendStrings;
18 use WP_REST_Request;
19 use WP_REST_Response;
20
21 /**
22 * Validates no-duplicates field values before form submit or page navigation.
23 */
24 class ValidateBeforeSubmitController extends Controller
25 {
26 private FormService $formService;
27 private FieldService $fieldService;
28 private FieldDuplicateValidationService $fieldDuplicateValidationService;
29
30 public function __construct(
31 FormService $formService,
32 FieldService $fieldService,
33 FieldDuplicateValidationService $fieldDuplicateValidationService
34 ) {
35 $this->formService = $formService;
36 $this->fieldService = $fieldService;
37 $this->fieldDuplicateValidationService = $fieldDuplicateValidationService;
38 }
39
40 /**
41 * @param WP_REST_Request $data
42 *
43 * @return WP_REST_Response
44 *
45 * @throws InvalidArgumentException|NotFoundException
46 */
47 protected function handle(WP_REST_Request $data): WP_REST_Response
48 {
49 Sanitizer::verifyNonce($data->get_header('X-WP-Nonce'));
50
51 if (empty($data->get_params())) {
52 throw new InvalidArgumentException(
53 BackendStrings::getExceptionStrings()['invalid_request_data']
54 );
55 }
56
57 $formId = Sanitizer::sanitizeId($data->get_param('formId'));
58 Sanitizer::verifySubmissionNonce($data->get_param('nonce'), $formId);
59
60 if ($formId <= 0) {
61 throw new InvalidArgumentException(
62 BackendStrings::getExceptionStrings()['invalid_form_id']
63 );
64 }
65
66 $form = $this->formService->getFormById($formId);
67 $formFields = $this->fieldService->getAllFields($form->getId());
68
69 $pageId = $data->get_param('pageId');
70 $pageId = is_string($pageId) && $pageId !== '' ? sanitize_text_field($pageId) : null;
71
72 $values = $data->get_param('values');
73 if (!is_array($values)) {
74 throw new InvalidArgumentException(
75 BackendStrings::getExceptionStrings()['invalid_request_data']
76 );
77 }
78
79 $submissionData = Sanitizer::sanitizeFormSubmissionData(['values' => $values], $formFields);
80
81 [$isDuplicate, $duplicateErrors] = $this->fieldDuplicateValidationService->checkDuplicateFieldValues(
82 $formFields,
83 $submissionData,
84 $formId,
85 $pageId
86 );
87
88 $payload = [
89 'valid' => !$isDuplicate,
90 'is_duplicate' => $isDuplicate,
91 'duplicate_errors' => $duplicateErrors,
92 ];
93
94 /**
95 * Filter validate-before-submit API result (integrations e.g. Amelia).
96 *
97 * @param array{valid: bool, is_duplicate: bool, duplicate_errors: array<int|string, bool>} $payload
98 * @param int $formId
99 * @param array<string, mixed> $submissionData
100 * @param \IvyForms\Entity\Field\Field[] $formFields
101 * @param string|null $pageId
102 */
103 $payload = apply_filters(
104 'ivyforms/validate_before_submit_result',
105 $payload,
106 $formId,
107 $submissionData,
108 $formFields,
109 $pageId
110 );
111
112 return new WP_REST_Response([
113 'data' => $payload,
114 ], 200);
115 }
116 }
117