PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.7
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.7
6.2.14 6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 3.6.65 All 196 releases
fluentform / app / Services / Submission / SubmissionService.php

SubmissionService.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 6.2.7, at app/Services/Submission/SubmissionService.php

788 lines 26.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentForm\App\Services\Submission;
4
5 defined('ABSPATH') or die;
6
7 use Exception;
8 use FluentForm\App\Models\EntryDetails;
9 use FluentForm\App\Models\Form;
10 use FluentForm\App\Helpers\Helper;
11 use FluentForm\App\Models\FormMeta;
12 use FluentForm\App\Models\Submission;
13 use FluentForm\Framework\Support\Arr;
14 use FluentForm\App\Models\SubmissionMeta;
15 use FluentForm\Framework\Support\Collection;
16 use FluentForm\App\Services\Form\FormService;
17 use FluentForm\App\Modules\Form\FormDataParser;
18 use FluentForm\App\Modules\Form\FormFieldsParser;
19
20 class SubmissionService
21 {
22 /**
23 * @var \FluentForm\App\Models\Submission|\FluentForm\Framework\Database\Query\Builder|\FluentForm\Framework\Database\Orm\Builder
24 */
25 protected $model;
26 protected $formService;
27
28 public function __construct()
29 {
30 $this->model = new Submission();
31 $this->formService = new FormService();
32 }
33
34 public function get($attributes = [])
35 {
36 if (!defined('FLUENTFORM_RENDERING_ENTRIES')) {
37 define('FLUENTFORM_RENDERING_ENTRIES', true);
38 }
39
40 $entries = $this->model->paginateEntries($attributes);
41
42 if (Arr::get($attributes, 'parse_entry')) {
43 $form = Form::find(Arr::get($attributes, 'form_id'));
44
45 $parsedEntries = FormDataParser::parseFormEntries($entries->items(), $form);
46
47 $entries->setCollection(Collection::make($parsedEntries));
48 }
49
50 return apply_filters('fluentform/get_submissions', $entries);
51 }
52
53 public function find($submissionId)
54 {
55 try {
56 if (!defined('FLUENTFORM_RENDERING_ENTRY')) {
57 define('FLUENTFORM_RENDERING_ENTRY', true);
58 }
59
60 $submission = $this->model->with(['form','submissionMeta' => function($q) {
61 $q->where('meta_key', '_entry_uid_hash');
62 }])->findOrFail($submissionId);
63
64 $form = $submission->form;
65
66
67 $autoRead = apply_filters_deprecated(
68 'fluentform_auto_read',
69 [true, $form],
70 FLUENTFORM_FRAMEWORK_UPGRADE,
71 'fluentform/auto_read_submission'
72 );
73
74 $autoRead = apply_filters('fluentform/auto_read_submission', $autoRead, $form);
75
76 if ('unread' === $submission->status && $autoRead) {
77 $submission->fill(['status' => 'read'])->save();
78 }
79
80 $meta = $submission->submissionMeta;
81 if (count($meta)) {
82 $submission->_entry_uid_hash = Arr::get($meta, '0.value');
83 $this->setEntryUidLink($submission);
84 }
85
86 $submission = apply_filters('fluentform/submission_before_parse', $submission, $form);
87
88 $submission = FormDataParser::parseFormEntry($submission, $form, null, true);
89 $this->enrichWithUser($submission);
90
91 $submission = apply_filters_deprecated(
92 'fluentform_single_response_data',
93 [$submission, $form->id],
94 FLUENTFORM_FRAMEWORK_UPGRADE,
95 'fluentform/find_submission'
96 );
97
98 return apply_filters('fluentform/find_submission', $submission, $form->id)->makeHidden('form');
99 } catch (Exception $e) {
100 throw new Exception(
101 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output
102 __('No Entry found.', 'fluentform')
103 );
104 }
105 }
106
107
108 /**
109 * @param array{
110 * formId?: int, // Optional when using uidHash
111 * serialNumber?: int, // Required if using formId without uidHash
112 * uidHash?: string, // Can be used with or without formId
113 * isHtml?: bool
114 * } $params Either (formId + serialNumber) OR uidHash required
115 *
116 * @return Submission
117 * @throws Exception
118 */
119 public function findByParams($params)
120 {
121 try {
122 if (!defined('FLUENTFORM_RENDERING_ENTRY')) {
123 define('FLUENTFORM_RENDERING_ENTRY', true);
124 }
125
126 $formId = $params['formId'] ?? null;
127 $serialNumber = $params['serialNumber'] ?? null;
128 $uidHash = $params['uidHash'] ?? null;
129 $isHtml = $params['isHtml'] ?? false;
130 if (!($uidHash || ($formId && $serialNumber))) {
131 throw new \Exception(
132 __('Either uidHash or (formId + serialNumber) must be provided', 'fluentform')
133 );
134 }
135
136 $query = Submission::query();
137
138 if ($formId) {
139 $query->where('form_id', $formId);
140 }
141
142 if ($serialNumber) {
143 $query->where('serial_number', $serialNumber);
144 } else {
145 $query->whereHas('submissionMeta', function ($metaQuery) use ($uidHash) {
146 $metaQuery->where('meta_key', '_entry_uid_hash')
147 ->where('value', $uidHash); // Changed to 'value' column
148 });
149 }
150
151 $submission = $query->orderBy('serial_number', 'desc')->first();
152
153 if (!$submission) {
154 throw new \Exception(
155 __('No entry found matching the criteria', 'fluentform')
156 );
157 }
158 $form = $submission->form;
159
160 $autoRead = apply_filters('fluentform/auto_read_submission', true, $form);
161
162 if ('unread' === $submission->status && $autoRead) {
163 $submission->fill(['status' => 'read'])->save();
164 }
165
166 $meta = $submission->submissionMeta()->where('meta_key', '_entry_uid_hash')->first();
167 if ($meta && $meta->value) {
168 $submission->_entry_uid_hash = $meta->value;
169 $this->setEntryUidLink($submission);
170 }
171
172 $submission = FormDataParser::parseFormEntry($submission, $form, null, $isHtml);
173 $this->enrichWithUser($submission);
174
175 return apply_filters('fluentform/find_submission', $submission, $form->id);
176 } catch (Exception $e) {
177 throw new Exception(
178 sprintf(
179 /* translators: %s: error message */
180 esc_html__('No Entry found. Error: %s', 'fluentform'),
181 esc_html($e->getMessage())
182 )
183 );
184 }
185 }
186
187 public function resources($attributes)
188 {
189 $resources = [];
190
191 $formId = Arr::get($attributes, 'form_id');
192 $submissionId = Arr::get($attributes, 'entry_id');
193
194 if (Arr::get($attributes, 'counts')) {
195 $resources['counts'] = $this->model->countByGroup($formId);
196 }
197
198 $formInputsAndLabels = null;
199
200 $wantsLabels = Arr::get($attributes, 'labels');
201
202 if ($wantsLabels) {
203 $formInputsAndLabels = $this->formService->getInputsAndLabels($formId);
204 $resources['labels'] = $formInputsAndLabels['labels'];
205 }
206
207 if (Arr::get($attributes, 'fields')) {
208 $formInputsAndLabels = $formInputsAndLabels ? $formInputsAndLabels : $this->formService->getInputsAndLabels($formId);
209 $resources['fields'] = $formInputsAndLabels['inputs'];
210 }
211
212 if (Arr::get($attributes, 'visibleColumns')) {
213 $resources['visibleColumns'] = Helper::getFormMeta($formId, '_visible_columns', null);
214 }
215
216 if (Arr::get($attributes, 'columnsOrder')) {
217 $resources['columnsOrder'] = Helper::getFormMeta($formId, '_columns_order', null);
218 }
219
220 if (Arr::get($attributes, 'next')) {
221 $resources['next'] = $this->model->findAdjacentSubmission($attributes);
222 }
223
224 if (Arr::get($attributes, 'previous')) {
225 $attributes['direction'] = 'previous';
226 $resources['previous'] = $this->model->findAdjacentSubmission($attributes);
227 }
228 if (count(array_intersect(['orderData', 'widgets', 'cards'], array_keys($attributes))) > 0) {
229 try {
230 $submission = $this->model->with('form')->findOrFail($submissionId);
231 } catch (Exception $e) {
232 throw new Exception(
233 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output
234 __('No Entry found.', 'fluentform')
235 );
236 }
237
238 if (Arr::get($attributes, 'orderData')) {
239 $hasPayment = $submission->payment_status || $submission->payment_total || 'subscription' === $submission->payment_type;
240
241 if ($hasPayment) {
242 $resources['orderData'] = apply_filters(
243 'fluentform/submission_order_data',
244 false,
245 $submission,
246 $submission->form
247 );
248
249 if ($wantsLabels) {
250 $resources['labels'] = apply_filters(
251 'fluentform/submission_labels',
252 $resources['labels'],
253 $submission,
254 $submission->form
255 );
256 }
257 }
258 }
259
260 if (Arr::get($attributes, 'widgets')) {
261 $resources['widgets'] = apply_filters(
262 'fluentform/submissions_widgets', [], $resources, $submission
263 );
264 }
265
266 if (Arr::get($attributes, 'cards')) {
267 $resources['cards'] = apply_filters(
268 'fluentform/submission_cards', [], $resources, $submission
269 );
270 }
271 }
272
273 return apply_filters('fluentform/submission_resources', $resources);
274 }
275
276 public function updateStatus($attributes = [])
277 {
278 $submissionId = intval(Arr::get($attributes, 'entry_id'));
279
280 $status = sanitize_text_field(Arr::get($attributes, 'status'));
281
282 $this->model->amend($submissionId, ['status' => $status]);
283
284 do_action('fluentform/after_submission_status_update', $submissionId, $status);
285
286 return $status;
287 }
288
289 public function toggleIsFavorite($submissionId)
290 {
291 try {
292 $submission = $this->model->findOrFail($submissionId);
293 } catch (Exception $e) {
294 throw new Exception(
295 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output
296 __('No Entry found.', 'fluentform')
297 );
298 }
299
300 if ($submission->is_favourite) {
301 $message = __('The entry has been removed from favorites', 'fluentform');
302 } else {
303 $message = __('The entry has been marked as favorites', 'fluentform');
304 }
305
306 $submission->fill(['is_favourite' => !$submission->is_favourite])->save();
307
308 return [$message, $submission->is_favourite];
309 }
310
311 public function storeColumnSettings($attributes = [])
312 {
313 $formId = intval(Arr::get($attributes, 'form_id'));
314 $metaKey = sanitize_text_field(Arr::get($attributes, 'meta_key'));
315
316 $allowedKeys = ['_visible_columns', '_columns_order'];
317 if (!in_array($metaKey, $allowedKeys)) {
318 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
319 throw new \Exception(__('Invalid meta key for column settings.', 'fluentform'));
320 }
321
322 $metaValue = wp_unslash(Arr::get($attributes, 'settings'));
323
324 FormMeta::persist($formId, $metaKey, $metaValue);
325 }
326
327 public function handleBulkActions($attributes = [])
328 {
329 $formId = intval(Arr::get($attributes, 'form_id'));
330
331 $submissionIds = fluentFormSanitizer(Arr::get($attributes, 'entries', []));
332
333 $actionType = sanitize_text_field(Arr::get($attributes, 'action_type'));
334
335 if (!$formId || !count($submissionIds)) {
336 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output
337 throw new Exception(__('Please select entries first', 'fluentform'));
338 }
339
340 $query = $this->model->where('form_id', $formId)->whereIn('id', $submissionIds);
341
342 $statuses = Helper::getEntryStatuses($formId);
343
344 $message = '';
345
346 if (isset($statuses[$actionType])) {
347 $query->update([
348 'status' => $actionType,
349 'updated_at' => current_time('mysql'),
350 ]);
351
352 foreach ($submissionIds as $submissionId) {
353 do_action('fluentform/after_submission_status_update', $submissionId, $actionType);
354 }
355
356 $message = 'Selected entries successfully marked as ' . $statuses[$actionType];
357 } elseif ('other.delete_permanently' == $actionType) {
358 $ownedIds = $this->model->where('form_id', $formId)
359 ->whereIn('id', $submissionIds)
360 ->pluck('id')
361 ->all();
362
363 if ($ownedIds) {
364 $this->deleteEntries($ownedIds, $formId);
365 }
366
367 $message = __('Selected entries successfully deleted', 'fluentform');
368 } elseif ('other.make_favorite' == $actionType) {
369 $query->update([
370 'is_favourite' => 1,
371 ]);
372
373 $message = __('Selected entries successfully marked as favorites', 'fluentform');
374 } elseif ('other.unmark_favorite' == $actionType) {
375 $query->update([
376 'is_favourite' => 0,
377 ]);
378
379 $message = __('Selected entries successfully removed from favorites', 'fluentform');
380 }
381
382 return $message;
383 }
384
385 public function deleteEntries($submissionIds, $formId)
386 {
387 $submissionIds = (array)$submissionIds;
388
389 do_action('fluentform/before_deleting_entries', $submissionIds, $formId);
390
391 foreach ($submissionIds as $submissionId) {
392 do_action_deprecated(
393 'fluentform_before_entry_deleted',
394 [$submissionId, $formId],
395 FLUENTFORM_FRAMEWORK_UPGRADE,
396 'fluentform/before_deleting_entries'
397 );
398 }
399
400 $this->deleteFiles($submissionIds, $formId);
401
402 Submission::remove($submissionIds, $formId);
403
404 do_action('fluentform/after_deleting_submissions', $submissionIds, $formId);
405
406 foreach ($submissionIds as $submissionId) {
407 do_action_deprecated(
408 'fluentform_after_entry_deleted',
409 [$submissionId, $formId],
410 FLUENTFORM_FRAMEWORK_UPGRADE,
411 'fluentform/after_deleting_entries'
412 );
413 }
414 }
415
416 public function deleteFiles($submissionIds, $formId)
417 {
418 apply_filters_deprecated(
419 'fluentform_disable_attachment_delete',
420 [
421 false,
422 $formId
423 ],
424 FLUENTFORM_FRAMEWORK_UPGRADE,
425 'fluentform/disable_attachment_delete',
426 'Use fluentform/disable_attachment_delete instead of fluentform_disable_attachment_delete'
427 );
428
429 $disableAttachmentDelete = apply_filters(
430 'fluentform/disable_attachment_delete', false, $formId
431 );
432
433 $shouldDelete = defined('FLUENTFORMPRO') && $formId && !$disableAttachmentDelete;
434
435 if ($shouldDelete) {
436 $deletables = $this->getAttachments($submissionIds, $formId);
437
438 foreach ($deletables as $file) {
439 $file = wp_upload_dir()['basedir'] . FLUENTFORM_UPLOAD_DIR . '/' . basename($file);
440
441 if (is_readable($file) && !is_dir($file)) {
442 wp_delete_file($file);
443 }
444 }
445 // Empty Temp Uploads
446 if (defined('FLUENTFORMPRO')) {
447 $tempDir = wp_upload_dir()['basedir'] . FLUENTFORM_UPLOAD_DIR . '/temp/';
448 $files = glob($tempDir . '*');
449 if(!empty($files)){
450 foreach ($files as $file) {
451 if (basename($file) !== 'index.php') {
452 wp_delete_file($file);
453 }
454 }
455 }
456 }
457
458 }
459 }
460
461 public function getAttachments($submissionIds, $form)
462 {
463 $submissionIds = (array)$submissionIds;
464
465 if (!$form instanceof Form) {
466 $form = Form::find($form);
467 }
468
469 $fields = FormFieldsParser::getAttachmentInputFields($form, ['element', 'attributes']);
470
471 $attachments = [];
472
473 if ($fields) {
474 $fields = Arr::pluck($fields, 'attributes.name');
475
476 $submissions = $this->model->whereIn('id', $submissionIds)->get();
477
478 foreach ($submissions as $submission) {
479 $response = json_decode($submission->response, true);
480
481 $files = Arr::collapse(Arr::only($response, $fields));
482
483 $attachments = array_merge($attachments, $files);
484 }
485 }
486
487 return $attachments;
488 }
489
490 public function getNotes($submissionId, $attributes)
491 {
492 $formId = (int)Arr::get($attributes, 'form_id');
493 $apiLog = 'yes' === sanitize_text_field(Arr::get($attributes, 'api_log'));
494
495 $metaKeys = ['_notes'];
496
497 if ($apiLog) {
498 $metaKeys[] = 'api_log';
499 }
500
501 $perPage = (int) Arr::get($attributes, 'per_page', 0);
502 $page = (int) Arr::get($attributes, 'page', 1);
503
504 $query = SubmissionMeta::where('response_id', $submissionId)
505 ->whereIn('meta_key', $metaKeys)
506 ->orderBy('id', 'DESC');
507
508 if ($perPage > 0) {
509 $perPage = min($perPage, 100);
510 $notes = $query->forPage($page, $perPage)->get();
511 } else {
512 $notes = $query->get();
513 }
514
515 // Batch-fetch users to avoid N+1 queries
516 $userIds = $notes->pluck('user_id')->filter()->unique()->values()->toArray();
517 $usersMap = [];
518 if (!empty($userIds)) {
519 $users = get_users(['include' => $userIds, 'fields' => ['ID', 'display_name']]);
520 foreach ($users as $user) {
521 $usersMap[$user->ID] = $user->display_name;
522 }
523 }
524
525 foreach ($notes as $note) {
526 if ($note->user_id) {
527 $note->pemalink = get_edit_user_link($note->user_id);
528 if (isset($usersMap[$note->user_id])) {
529 $note->created_by = $usersMap[$note->user_id];
530 } else {
531 $note->created_by = __('Fluent Forms Bot', 'fluentform');
532 }
533 } else {
534 $note->pemalink = false;
535 }
536 }
537
538 apply_filters_deprecated(
539 'fluentform_entry_notes',
540 [
541 $notes,
542 $submissionId,
543 $formId
544 ],
545 FLUENTFORM_FRAMEWORK_UPGRADE,
546 'fluentform/entry_notes',
547 'Use fluentform/entry_notes instead of fluentform_entry_notes'
548 );
549
550 $notes = apply_filters('fluentform/entry_notes', $notes, $submissionId, $formId);
551
552 return apply_filters('fluentform/submission_notes', $notes, $submissionId, $formId);
553 }
554
555 public function storeNote($submissionId, $attributes = [])
556 {
557 $formId = intval(Arr::get($attributes, 'form_id'));
558
559 $content = sanitize_textarea_field($attributes['note']['content']);
560 $status = sanitize_text_field($attributes['note']['status']);
561 $user = get_user_by('ID', get_current_user_id());
562 $now = current_time('mysql');
563
564 $note = [
565 'response_id' => $submissionId,
566 'form_id' => $formId,
567 'meta_key' => '_notes',
568 'value' => $content,
569 'status' => $status,
570 'user_id' => $user->ID,
571 'name' => $user->display_name,
572 'created_at' => $now,
573 'updated_at' => $now,
574 ];
575
576 $note = apply_filters_deprecated(
577 'fluentform_add_response_note',
578 [$note],
579 FLUENTFORM_FRAMEWORK_UPGRADE,
580 'fluentform/store_submission_note'
581 );
582
583 $note = apply_filters('fluentform/store_submission_note', $note);
584
585 $submissionMeta = new SubmissionMeta;
586
587 $submissionMeta->fill($note)->save();
588
589 do_action_deprecated(
590 'fluentform_new_response_note_added',
591 [$submissionMeta->id, $submissionMeta],
592 FLUENTFORM_FRAMEWORK_UPGRADE,
593 'fluentform/submission_note_stored'
594 );
595
596 do_action('fluentform/submission_note_stored', $submissionMeta->id, $submissionMeta);
597
598 return [
599 'message' => __('Note has been successfully added', 'fluentform'),
600 'note' => $submissionMeta,
601 'insert_id' => $submissionMeta->id,
602 ];
603 }
604
605 public function updateSubmissionUser($userId, $submissionId)
606 {
607 if (!$userId || !$submissionId) {
608 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output
609 throw new Exception(__('Submission ID and User ID is required', 'fluentform'));
610 }
611
612 $submission = Submission::find($submissionId);
613 $user = get_user_by('ID', $userId);
614
615 if (!$submission || $submission->user_id == $userId || !$user) {
616 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output
617 throw new Exception(__('Invalid Request', 'fluentform'));
618 }
619
620 Submission::where('id', $submission->id)
621 ->update([
622 'user_id' => $userId,
623 'updated_at' => current_time('mysql'),
624 ]);
625
626 if (defined('FLUENTFORMPRO')) {
627 // let's update the corresponding user IDs for transactions
628 \FluentForm\App\Models\Transaction::where('submission_id', $submission->id)
629 ->update([
630 'user_id' => $userId,
631 'updated_at' => current_time('mysql'),
632 ]);
633 }
634
635 do_action('fluentform/log_data', [
636 'parent_source_id' => $submission->form_id,
637 'source_type' => 'submission_item',
638 'source_id' => $submission->id,
639 'component' => 'General',
640 'status' => 'info',
641 'title' => 'Associate user has been changed from ' . $submission->user_id . ' to ' . $userId,
642 ]);
643
644 do_action_deprecated(
645 'fluentform_submission_user_changed',
646 [
647 $submission,
648 $user
649 ],
650 FLUENTFORM_FRAMEWORK_UPGRADE,
651 'fluentform/submission_user_changed',
652 'Use fluentform/submission_user_changed instead of fluentform_submission_user_changed.'
653 );
654
655 do_action('fluentform/submission_user_changed', $submission, $user);
656
657 return ([
658 'message' => __('Selected user has been successfully assigned to this submission', 'fluentform'),
659 'user' => [
660 'name' => $user->display_name,
661 'email' => $user->user_email,
662 'ID' => $user->ID,
663 'permalink' => get_edit_user_link($user->ID),
664 ],
665 'user_id' => $userId,
666 ]);
667 }
668
669 public function updateEntryDiffs($entryId, $formId, $formData)
670 {
671 EntryDetails::where('submission_id', $entryId)
672 ->where('form_id', $formId)
673 ->whereIn('field_name', array_keys($formData))
674 ->delete();
675
676 $entryItems = [];
677 foreach ($formData as $dataKey => $dataValue) {
678 if (!$dataValue) {
679 continue;
680 }
681
682 if (is_array($dataValue)) {
683 foreach ($dataValue as $subKey => $subValue) {
684 $entryItems[] = [
685 'form_id' => $formId,
686 'submission_id' => $entryId,
687 'field_name' => $dataKey,
688 'sub_field_name' => $subKey,
689 'field_value' => maybe_serialize($subValue),
690 ];
691 }
692 } else {
693 $entryItems[] = [
694 'form_id' => $formId,
695 'submission_id' => $entryId,
696 'field_name' => $dataKey,
697 'sub_field_name' => '',
698 'field_value' => $dataValue,
699 ];
700 }
701 }
702
703 if ($entryItems) {
704 EntryDetails::insert($entryItems);
705 }
706
707 return true;
708 }
709
710 public function recordEntryDetails($entryId, $formId, $data)
711 {
712 $formData = Arr::except($data, Helper::getWhiteListedFields($formId));
713
714 $entryItems = [];
715 foreach ($formData as $dataKey => $dataValue) {
716 if ($dataValue === '' || $dataValue === null) {
717 continue;
718 }
719
720 if (is_array($dataValue) || is_object($dataValue)) {
721 foreach ($dataValue as $subKey => $subValue) {
722 if (empty($subValue)) {
723 continue;
724 }
725 $entryItems[] = [
726 'form_id' => $formId,
727 'submission_id' => $entryId,
728 'field_name' => trim($dataKey),
729 'sub_field_name' => $subKey,
730 'field_value' => maybe_serialize($subValue),
731 ];
732 }
733 } else {
734 $entryItems[] = [
735 'form_id' => $formId,
736 'submission_id' => $entryId,
737 'field_name' => trim($dataKey),
738 'sub_field_name' => '',
739 'field_value' => $dataValue,
740 ];
741 }
742 }
743
744 if ($entryItems) {
745 EntryDetails::insert($entryItems);
746 }
747
748 return true;
749 }
750
751 public function getPrintContent($attr)
752 {
753 $content = (new SubmissionPrint())->getContent($attr);
754 return array('success' => true, 'content' => $content);
755 }
756
757 private function setEntryUidLink($submission)
758 {
759 $frontEndSettings = Helper::getFormMeta($submission->form_id, 'front_end_entry_view', []);
760 if (Arr::get($frontEndSettings, 'status') === 'yes') {
761 $submission->entry_uid_link = site_url('?ff_entry=1&hash=' . $submission->_entry_uid_hash);
762 }
763 }
764
765 private function enrichWithUser($submission)
766 {
767 if (!$submission->user_id) {
768 return;
769 }
770
771 $user = get_user_by('ID', $submission->user_id);
772 if (!$user) {
773 return;
774 }
775
776 $userDisplayName = trim($user->first_name . ' ' . $user->last_name);
777 if (!$userDisplayName) {
778 $userDisplayName = $user->display_name;
779 }
780
781 $submission->user = [
782 'ID' => $user->ID,
783 'name' => $userDisplayName,
784 'permalink' => get_edit_user_link($user->ID),
785 ];
786 }
787 }
788