PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 1.2
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v1.2
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / API / Controller / EntryController.php

EntryController.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 1.2, at includes/API/Controller/EntryController.php

538 lines 23.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace BitCode\BitForm\API\Controller;
4
5 use WP_Error;
6 use WP_REST_Controller;
7 use BitCode\BitForm\Core\Util\IpTool;
8 use BitCode\BitForm\Core\Util\FileHandler;
9 use BitCode\BitForm\Core\Database\ApiModel;
10 use BitCode\BitForm\Core\Database\FormModel;
11 use BitCode\BitForm\Admin\Form\AdminFormManager;
12 use BitCode\BitForm\Core\Database\FormEntryModel;
13 use BitCode\BitForm\Core\Database\FormEntryLogModel;
14 use BitCode\BitForm\Core\WorkFlow\WorkFlowRunHelper;
15 use BitCode\BitForm\Core\Database\FormEntryMetaModel;
16 use BitCode\BitForm\Core\Form\Validator\FormFieldValidator;
17
18 class EntryController extends WP_REST_Controller
19 {
20 protected static $form;
21 protected $formModel;
22 protected $form_id;
23 private $_has_upload;
24 private $_field_label;
25 private $_fields;
26
27 function __construct()
28 {
29 $this->formModel = new FormModel();
30 }
31
32 public function form_content($formID)
33 {
34 $form = $this->formModel->get(
35 [
36 "id",
37 "form_content",
38 "form_name",
39 'created_at',
40 'views',
41 'entries',
42 'status'
43 ],
44 array(
45 'id' => $formID
46 )
47 );
48 return $form;
49 }
50
51 public function get_forms()
52 {
53 $db = new ApiModel();
54 $forms = $db->getForm();
55 if (count($forms) > 0) {
56 return rest_ensure_response(['forms' => $forms, 'status' => 200, 'code' => 4000, 'success' => true]);
57 } else {
58 return rest_ensure_response(['forms' => [], 'status' => 200, 'code' => 3910, 'message' => 'No forms available.', 'success' => true]);
59 }
60 }
61
62 public function get_fields($request)
63 {
64 if (!empty($request['form_id'])) {
65 $formManager = new AdminFormManager($request['form_id']);
66 if (!$formManager->isExist()) {
67 $error = ['message' => 'No Form with ID "<form_id>".', 'code' => '3200'];
68 wp_send_json_error($error, 404);
69 }
70 $db = new ApiModel();
71 $fields = $db->getField($request['form_id']);
72 $workFlows = $db->getWorkFlow($request['form_id']);
73 $fieldsKey = $formManager->getFieldsKey();
74 if (!empty($fields)) {
75 $filedsData = json_decode($fields[0]->form_content);
76 $data = ['fields' => $filedsData->fields, 'fieldkeys' => $fieldsKey, 'workflows' => $workFlows, 'workflow_key_name' => 'workflow'];
77 return rest_ensure_response(['fields' => $data, 'status' => 200, 'code' => 4000, 'success' => true]);
78 } else {
79 return rest_ensure_response(['fields' => [], 'status' => 200, 'code' => 3920, 'message' => 'No fields available', 'success' => true]);
80 }
81 }
82 }
83
84 private function fieldSanitize($form_fields, $data, $files)
85 {
86 $submitted_data = [];
87 $fieldError = [];
88 foreach ($form_fields as $key => $field) {
89 if (array_key_exists($field['key'], $data)) {
90 $submitted_data[$field['key']] = sanitize_text_field($data[$field['key']]);
91 } else if (array_key_exists($field['key'], $files)) {
92 } else if (!array_key_exists($field['key'], $data) || !array_key_exists($field['key'], $files)) {
93 $fieldError[$key] = $field['key'] . " field key is must be given";
94 }
95 }
96 if (!empty($fieldError)) {
97 $data = ['error' => $fieldError, 'code' => '3030'];
98 wp_send_json_error($data, 400);
99 }
100 return $submitted_data;
101 }
102 public function entry_store($request)
103 {
104 $formID = $request['form_id'];
105 $formManager = new AdminFormManager($request['form_id']);
106 if (!$formManager->isExist()) {
107 $data = ['message' => 'No Form with ID "<form_id>"', 'code' => '3200'];
108 wp_send_json_error($data, 400);
109 }
110 $formEntryModel = new FormEntryModel();
111 $ipTool = new IpTool();
112 $user_details = $ipTool->getUserDetail();
113 $entryMeta = new FormEntryMetaModel();
114 $form_fields = $this->getFields($formID);
115 $submitted_data = $this->fieldSanitize($form_fields, $_POST, $_FILES);
116 $formFieldValidator = new FormFieldValidator($form_fields, $submitted_data, $_FILES);
117 $validateField = $formFieldValidator->validate('create', $formID);
118 if (!$validateField) {
119 $errorMessage = count($formFieldValidator->getMessage()) > 0 ?
120 $formFieldValidator->getMessage() : __("Internal error occured!!!", 'bitform');
121 $error = ['errors' => $errorMessage, 'code' => '3070'];
122 wp_send_json_error($error, 422);
123 }
124 $entry_id = $formEntryModel->insert(
125 array(
126 'form_id' => $formID,
127 'user_id' => $user_details['id'],
128 'user_ip' => $user_details['ip'],
129 'user_device' => $user_details['device'],
130 'referer' => $user_details['page'],
131 'status' => 0,
132 'created_at' => $user_details['time']
133 )
134 );
135 $submitted_fields = $this->getFormContentWithValue($submitted_data, $formID)->fields;
136 $formManageer = new AdminFormManager($formID);
137 $file_fields = $formManageer->getUploadFields($formID);
138 $fileHandler = new FileHandler;
139 $workFlowRunHelper = new WorkFlowRunHelper($formID);
140 if (isset($_POST['workflow'])) {
141 $workFlowIds = is_array($_POST['workflow']) ? implode(",", $_POST['workflow']) : $_POST['workflow'];
142 $workFlowreturnedOnSubmit = $workFlowRunHelper->executeOnSubmit(
143 'create',
144 $submitted_fields,
145 $submitted_data,
146 $entry_id,
147 null,
148 $workFlowIds
149 );
150 unset($workFlowreturnedOnSubmit['data']);
151 }
152 if (!empty($workFlowreturnedOnSubmit['fields'])) {
153 $submitted_data = $workFlowreturnedOnSubmit['fields'];
154 unset($workFlowreturnedOnSubmit['fields']);
155 }
156 unset($submitted_data['workflow']);
157 foreach ($_FILES as $file_name => $file_details) {
158 if ($file_fields && in_array($file_name, $file_fields)) {
159 $filePath = $fileHandler->moveUploadedFiles($file_details, $formID, $entry_id);
160 if (!empty($filePath)) {
161 $submitted_data[$file_name] = $filePath;
162 }
163 }
164 }
165 foreach ($submitted_data as $key => $value) {
166 $entryMeta->insert(
167 array(
168 'bitforms_form_entry_id' => $entry_id,
169 'meta_key' => $key,
170 'meta_value' => is_string($submitted_data[$key]) ?
171 $submitted_data[$key] :
172 wp_json_encode($submitted_data[$key])
173 )
174 );
175 }
176 return rest_ensure_response(['status' => 200, 'code' => 4000, 'message' => 'Data Added Successfully!!', 'success' => true]);
177 }
178
179 public function getFormContentWithValue($defaultValues, $formID)
180 {
181 $form_content = \json_decode($this->form_content($formID)[0]->form_content);
182 if (!is_array($defaultValues)) {
183 return $form_content;
184 }
185 foreach ($form_content->fields as $fieldKey => $fieldDetails) {
186 // $field_name = empty($fieldDetails->lbl) ? null : \preg_replace('/[\`\~\!\@\#\$\'\.\s\?\+\-\*\&\|\/\\!]/', '_', $fieldDetails->lbl);
187 if ((isset($fieldDetails->mul) || $fieldDetails->typ === 'check') && isset($defaultValues[$fieldKey])) {
188 if (is_array($defaultValues[$fieldKey])) {
189 $fieldDetails->val =
190 wp_json_encode(
191 array_map('sanitize_text_field', $defaultValues[$fieldKey])
192 );
193 } else {
194 $fieldDetails->val = sanitize_text_field($defaultValues[$fieldKey]);
195 }
196 } elseif (isset($defaultValues[$fieldKey])) {
197 $fieldDetails->val = is_string($defaultValues[$fieldKey]) ?
198 sanitize_text_field($defaultValues[$fieldKey]) :
199 sanitize_text_field($defaultValues[$fieldKey][count($defaultValues[$fieldKey]) - 1]);
200 }
201 }
202 return $form_content;
203 }
204
205 public function getFields($formID)
206 {
207 if (!is_null($this->_fields)) {
208 return $this->_fields;
209 }
210 $form_content = \json_decode($this->form_content($formID)[0]->form_content);
211 $layout = $form_content->layout;
212 $fields = $form_content->fields;
213 $field_details = array();
214 foreach ($fields as $key => $field) {
215 if ($field->typ === 'recaptcha') {
216 continue;
217 }
218 $field_type = $field->typ;
219 $field_details[$key]['label'] = empty($field->lbl) ? null : $field->lbl;
220 $field_details[$key]['type'] = $field_type;
221 $field_details[$key]['key'] = $key;
222 if (isset($field->mul)) {
223 $field_details[$key]['mul'] = $field->mul;
224 }
225 if ($field_type === 'file-up' && isset($field->exts)) {
226 $field_details[$key]['valid']['type'] = $field->exts;
227 }
228 if (isset($field->valid) && !is_null($field->valid)) {
229 if (isset($field->valid->req)) {
230 $field_details[$key]['valid']['req'] = $field->valid->req;
231 }
232 if (isset($field->valid->reqMsg)) {
233 $field_details[$key]['valid']['reqMsg'] = $field->valid->reqMsg;
234 }
235 if (isset($field->valid->typMsg)) {
236 $field_details[$key]['valid']['typMsg'] = $field->valid->typMsg;
237 }
238 }
239 }
240 $this->_fields = $field_details;
241 return $field_details;
242 }
243
244 public function entry_update($request)
245 {
246 $formEntryModel = new FormEntryModel();
247 $entryID = $request['entry_id'];
248 $apiModel = new ApiModel();
249 $forms = $apiModel->getFormId($entryID);
250 if ($forms === []) {
251 $data = ['message' => 'No record with ID "<entry_id>".', 'code' => '3100'];
252 wp_send_json_error($data, 404);
253 }
254 $formID = $forms[0]->form_id;
255 $formEntryLogModel = new FormEntryLogModel();
256 $apiModel = new ApiModel();
257 $formOldData = $apiModel->get_form_value($entryID);
258 $key = null;
259 $entryMeta = new FormEntryMetaModel();
260 $ipTool = new IpTool();
261 $user_details = $ipTool->getUserDetail();
262 $form_fields = $this->getFields($formID);
263 $field_map = [];
264 foreach ($formOldData as $index => $data) {
265 foreach ($form_fields as $field_key => $field) {
266 if ($data->meta_key == $field['key']) {
267 $field_map[$field_key] = $field['key'];
268 }
269 }
270 }
271 $updatedValue = $this->fieldSanitize($form_fields, $_POST, $_FILES);
272 $formFieldValidator = new FormFieldValidator($form_fields, $updatedValue, $_FILES);
273 $validateField = $formFieldValidator->validate('edit', $formID);
274 if (!$validateField) {
275 $errorMessage = count($formFieldValidator->getMessage()) > 0 ?
276 $formFieldValidator->getMessage() : __("Internal error occured !!!", 'bitform');
277 $error = ['errors' => $errorMessage, 'code' => '3070'];
278 wp_send_json_error($error, 422);
279 }
280 $formEntry = $formEntryModel->update(
281 array(
282 "user_id" => $user_details['id'],
283 "user_ip" => $user_details['ip'],
284 "user_device" => $user_details['device'],
285 "status" => 0,
286 "updated_at" => $user_details['time']
287 ),
288 array(
289 'form_id' => $formID,
290 'id' => $entryID
291 )
292 );
293 $log_id = null;
294 if ($formEntry) {
295 $log_id = $formEntryLogModel->form_log_insert(
296 array(
297 "user_id" => $user_details['id'],
298 "action_type" => "update",
299 "log_type" => "entry",
300 "ip" => $user_details['ip'],
301 "form_entry_id" => $entryID,
302 "form_id" => $formID,
303 "created_at" => $user_details['time'],
304 )
305 );
306 }
307 if (is_wp_error($formEntry) || !$formEntry) {
308 $data = ['message' => 'No record with ID "<entry_id>', 'code' => '3100'];
309 wp_send_json_error($data, 404);
310 }
311 $file_fields = $this->getUploadFields($formID);
312 if (count($file_fields) > 0) {
313 $fileHandler = new FileHandler();
314 foreach ($file_fields as $file_name) {
315 if (!empty($_FILES[$file_name]['name'])) {
316 $meta_value = $fileHandler->moveUploadedFiles($_FILES[$file_name], $formID, $entryID);
317 if (!empty($meta_value)) {
318 $updatedValue[$file_name] = wp_json_encode($meta_value);
319 }
320 }
321 }
322 }
323 unset($updatedValue['_ajax_nonce']);
324 unset($_REQUEST['g-recaptcha-response']);
325 $workFlowRunHelper = new WorkFlowRunHelper($formID);
326 if (isset($_POST['workflow'])) {
327 $workFlowIds = is_array($_POST['workflow']) ? implode(",", $_POST['workflow']) : $_POST['workflow'];
328 $workFlowreturnedOnSubmit = $workFlowRunHelper->executeOnSubmit(
329 'edit',
330 $this->getFormContentWithValue($updatedValue, $formID)->fields,
331 $updatedValue,
332 $entryID,
333 $log_id,
334 $workFlowIds
335 );
336 if (!empty($workFlowreturnedOnSubmit['fields'])) {
337 $updatedValue = $workFlowreturnedOnSubmit['fields'];
338 unset($workFlowreturnedOnSubmit['fields']);
339 }
340 }
341 $formEntryMetaUpdateStatus = $entryMeta->update(
342 $updatedValue,
343 array(
344 'bitforms_form_entry_id' => $entryID
345 )
346 );
347 if (is_wp_error($formEntryMetaUpdateStatus) || isset($newFileInsertStatus) && is_wp_error($newFileInsertStatus)) {
348 return $formEntryMetaUpdateStatus;
349 }
350 $updatedValue = array_merge($formEntryMetaUpdateStatus, array('entry_id' => $entryID));
351 if (empty($workFlowreturnedOnSubmit['message'])) {
352 $workFlowreturnedOnSubmit['message'] = __('Entry Updated Successfully', 'bitform');
353 }
354 $workFlowreturnedOnSubmit['updatedData'] = $updatedValue;
355 $counter = 0;
356 for ($i = 0; $i < count($formOldData); $i++) {
357 if (array_key_exists($formOldData[$i]->meta_key . '_old', $updatedValue)) {
358 unset($updatedValue[$formOldData[$i]->meta_key . '_old']);
359 }
360 if (in_array($formOldData[$i]->meta_key, $file_fields)) {
361 if (
362 empty($_FILES[$formOldData[$i]->meta_key]['name'])
363 || (is_array($_FILES[$formOldData[$i]->meta_key]['name'])
364 && count($_FILES[$formOldData[$i]->meta_key]['name']) === 1
365 && empty($_FILES[$formOldData[$i]->meta_key]['name'][0]))
366 ) {
367 unset($updatedValue[$formOldData[$i]->meta_key]);
368 continue;
369 }
370 if (is_array($_FILES[$formOldData[$i]->meta_key]['name']) && !in_array($_FILES[$formOldData[$i]->meta_key]['name'], json_decode($formOldData[$i]->meta_value))) {
371 $key[$i] = '${' . $formOldData[$i]->meta_key . '} file was Updated To ' . json_encode($_FILES[$formOldData[$i]->meta_key]['name']);
372 } elseif (!is_array($_FILES[$formOldData[$i]->meta_key]['name']) && !in_array($_FILES[$formOldData[$i]->meta_key]['name'], json_decode($formOldData[$i]->meta_value))) {
373 $key[$i] = '${' . $formOldData[$i]->meta_key . '} file was Updated To ' . $_FILES[$formOldData[$i]->meta_key]['name'];
374 }
375 unset($updatedValue[$formOldData[$i]->meta_key]);
376 } else {
377 if (is_array($updatedValue[$formOldData[$i]->meta_key])) {
378 if (json_decode($formOldData[$i]->meta_value) !== $updatedValue[$formOldData[$i]->meta_key]) {
379 $key[$i] = '${' . $formOldData[$i]->meta_key . '} was Updated From ' . implode(',', json_decode($formOldData[$i]->meta_value)) . ' To ' . implode(",", $updatedValue[$formOldData[$i]->meta_key]);
380 }
381 } elseif (is_string($updatedValue[$formOldData[$i]->meta_key]) && !empty($updatedValue[$formOldData[$i]->meta_key])) {
382 if ($formOldData[$i]->meta_value !== $updatedValue[$formOldData[$i]->meta_key]) {
383 $key[$i] = '${' . $formOldData[$i]->meta_key . '} was Updated' . ($formOldData[$i]->meta_value ? ' From ' . $formOldData[$i]->meta_value : '') . ' To ' . $updatedValue[$formOldData[$i]->meta_key];
384 }
385 }
386 }
387 $counter++;
388 }
389 $newField = array_keys(array_diff_key($formEntryMetaUpdateStatus, $field_map));
390 for ($i = 0; $i < count($newField); $i++) {
391 if (is_array($updatedValue[$newField[$i]])) {
392 if (!empty($updatedValue[$newField[$i]])) {
393 $key[$counter + $i] = '${' . $newField[$i] . '} Updated To ' . implode(",", $updatedValue[$newField[$i]]);
394 }
395 } elseif (is_string($newField[$i])) {
396 if (!empty($updatedValue[$newField[$i]])) {
397 $key[$counter + $i] = '${' . $newField[$i] . '} Updated To ' . $updatedValue[$newField[$i]];
398 }
399 }
400 }
401 if ($key !== null) {
402 $logUpdate = implode("b::f", (array) $key);
403 $apiModel->logUpdate($logUpdate, $log_id);
404 }
405 return $workFlowreturnedOnSubmit;
406 }
407
408 public function getUploadFields($formID)
409 {
410 if (!is_null($this->_has_upload)) {
411 return $this->_has_upload;
412 }
413 $upload_fields = array();
414 $form_field_details = $this->getFields($formID);
415 foreach ($form_field_details as $field_name => $__field_detail) {
416 if (isset($__field_detail['type']) && $__field_detail['type'] === 'file-up') {
417 $upload_fields[] = $field_name;
418 }
419 }
420 $this->_has_upload = $upload_fields;
421 return $upload_fields;
422 }
423
424 public function entry_delete($request)
425 {
426 $entries['entry_id'] = $request['entry_id'];
427 $apiModel = new ApiModel();
428 $forms = $apiModel->getFormId($entries['entry_id']);
429 if ($forms === []) {
430 $data = ['message' => 'No record with ID "<entry_id>".', 'code' => '3100'];
431 wp_send_json_error($data, 404);
432 }
433 $formID = $forms[0]->form_id;
434 $formManager = new AdminFormManager($formID);
435 if (!$formManager->isExist()) {
436 $data = ['message' => 'No form found. Please check and try again', 'code' => '3130'];
437 wp_send_json_error($data, 404);
438 }
439 $workFlowRunHelper = new WorkFlowRunHelper($formID);
440 $workFlowreturnedOnDelete = $workFlowRunHelper->executeOnDelete(
441 $formManager,
442 $formID,
443 $entries
444 );
445
446 if (isset($workFlowreturnedOnDelete['entries'])) {
447 if (count($workFlowreturnedOnDelete['entries']) === 0) {
448 return ["message" => __('Entry Deletetion prevented by workflow', 'bitform')];
449 } elseif (count($workFlowreturnedOnDelete['entries']) === count($entries)) {
450 $message = __('Entry Deleted successfully', 'bitform');
451 } else {
452 $result['prevented'] = array_diff($entries, $workFlowreturnedOnDelete['entries']);
453 $entries = $workFlowreturnedOnDelete['entries'];
454 $message = __('Entry Deleted successfully, Some prevented by workflow', 'bitform');
455 }
456 } else {
457 $message = __('Entry Deleted successfully', 'bitform');
458 }
459 global $wpdb;
460 $prefix = $wpdb->prefix;
461 $formEntryModel = new FormEntryModel();
462 $delete_status = $formEntryModel->bulkDelete(
463 array(
464 "`{$prefix}bitforms_form_entries`.`id`" => $entries,
465 "`{$prefix}bitforms_form_entries`.`form_id`" => $formID,
466 )
467 );
468 if (file_exists(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID)) {
469 $fileHandler = new FileHandler();
470 foreach ($entries as $enrtyKey => $entryID) {
471 $fileEntries = BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID . DIRECTORY_SEPARATOR . $entryID;
472 if (file_exists($fileEntries)) {
473 $fileHandler->rmrf($fileEntries);
474 }
475 }
476 }
477 $count = $formEntryModel->count(
478 array(
479 'form_id' => $formID,
480 )
481 );
482 $formManager->resetSubmissionCount(intval($count[0]->count));
483 if (is_wp_error($delete_status)) {
484 return new WP_Error('entry_not_exists', __("Form entry deletion failed", "bitform"));
485 }
486 $result['message'] = $message;
487 return rest_ensure_response(['status' => 200, 'code' => 4000, 'message' => $message, 'success' => true]);
488 }
489 public function entry_view($request)
490 {
491 $entryID = $request['entry_id'];
492 if (!empty($entryID)) {
493 $db = new ApiModel();
494 $editEntry = $db->editEntry($entryID);
495 if (!empty($editEntry)) {
496 return rest_ensure_response(['data' => $editEntry, 'code' => 4000, 'status' => 200, 'success' => true]);
497 } else {
498 $data = ['message' => 'No record with ID "<entry_id>".', 'code' => '3100'];
499 wp_send_json_error($data, 404);
500 }
501 } else {
502 return rest_ensure_response(['data' => [], 'status' => 404, 'message' => 'route not found', 'success' => false]);
503 }
504 }
505 public function getEntryResponse($request)
506 {
507 $formId = wp_unslash($request['id']);
508 if (is_null($formId)) {
509 return new WP_Error('empty_form', __('Form id is Empty', 'bitform'));
510 }
511 $formManager = new AdminFormManager($formId);
512 if (!$formManager->isExist()) {
513 return new WP_Error('empty_form', __('provided form does not exists', 'bitform'));
514 }
515 $formEntry = new FormEntryModel();
516 $entries = $formEntry->get(
517 'id',
518 array(
519 'form_id' => $formId,
520 ),
521 null,
522 null,
523 'created_at',
524 'DESC'
525 );
526 if (is_wp_error($entries)) {
527 if ($entries->get_code() === 'result_empty') {
528 return rest_ensure_response(['data' => [], 'status' => 200, 'message' => 'form is empty', 'success' => true]);
529 }
530 return $entries;
531 }
532 $formFields = $formManager->getFieldLabel();
533 $entryMeta = new FormEntryMetaModel();
534 $formEntries = $entryMeta->getEntryMeta($formFields, $entries);
535 return rest_ensure_response(['data' => $formEntries, 'status' => 200, 'success' => true]);
536 }
537 }
538