PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.13
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.13
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 / Admin / Form / AdminFormHandler.php

AdminFormHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.21.13, at includes/Admin/Form/AdminFormHandler.php

2,876 lines 106.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Handle Form Create,Update,delete Operation
5 *
6 */
7
8 namespace BitCode\BitForm\Admin\Form;
9
10 use BitCode\BitForm\Admin\Form\Template\TemplateProvider;
11 use BitCode\BitForm\Core\Database\EmailTemplateModel;
12 use BitCode\BitForm\Core\Database\FormEntryLogModel;
13 use BitCode\BitForm\Core\Database\FormEntryMetaModel;
14 use BitCode\BitForm\Core\Database\FormEntryModel;
15 use BitCode\BitForm\Core\Database\FormModel;
16 use BitCode\BitForm\Core\Database\IntegrationModel;
17 use BitCode\BitForm\Core\Database\PdfTemplateModel;
18 use BitCode\BitForm\Core\Database\ReportsModel;
19 use BitCode\BitForm\Core\Database\SuccessMessageModel;
20 use BitCode\BitForm\Core\Database\WorkFlowModel;
21 use BitCode\BitForm\Core\Integration\IntegrationHandler;
22 use BitCode\BitForm\Core\Messages\EmailTemplateHandler;
23 use BitCode\BitForm\Core\Messages\PdfTemplateHandler;
24 use BitCode\BitForm\Core\Messages\SuccessMessageHandler;
25 use BitCode\BitForm\Core\Migration\MigrationHelper;
26 use BitCode\BitForm\Core\Util\FileHandler;
27 use BitCode\BitForm\Core\Util\FormDuplicateHelper;
28 use BitCode\BitForm\Core\Util\HttpHelper;
29 use BitCode\BitForm\Core\Util\IpTool;
30 use BitCode\BitForm\Core\Util\Log;
31 use BitCode\BitForm\Core\Util\Utilities;
32 use BitCode\BitForm\Core\WorkFlow\WorkFlow;
33 use BitCode\BitForm\Core\WorkFlow\WorkFlowHandler;
34 use WP_Error;
35
36 class AdminFormHandler
37 {
38 private static $formModel;
39 private static $ipTool;
40
41 public function __construct()
42 {
43 static::$formModel = new FormModel();
44 static::$ipTool = new IpTool();
45 }
46
47 public function getTemplate($Request, $post)
48 {
49 $templateName = null;
50 $newFormId = null;
51 if (isset($post->template)) {
52 $templateName = $post->template;
53 $newFormId = $post->newFormId;
54 }
55
56 $templateProvider = new TemplateProvider();
57 $form_content_raw = $templateProvider->getTemplate($templateName, $newFormId);
58 if (!$form_content_raw) {
59 return new WP_Error('template_empty', __('Template not found, by this name: ', 'bit-form') . $templateName);
60 } else {
61 return wp_json_encode(
62 [
63 'id' => 0,
64 'form_content' => $form_content_raw,
65 ]
66 );
67 }
68 }
69
70 public function saveStyleSheet($styles, $sheetName)
71 {
72 $this->createFormStylesDirIfNotExists();
73
74 if (
75 file_exists(BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles')
76 && wp_is_writable(BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles')
77 ) {
78 $filePath = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles' . DIRECTORY_SEPARATOR . $sheetName;
79 return FileHandler::writeFile($filePath, $styles);
80 }
81 return false;
82 }
83
84 public function saveLayoutStyleSheet($layout, $sheetName, $lay_row_height = 43)
85 {
86 $md_width = 600;
87 $sm_width = 400;
88 $lg_styles = '';
89 $md_styles = '';
90 $sm_styles = '';
91 for ($i = 0; $i < count($layout->lg); $i++) {
92 $fld = $layout->lg[$i];
93
94 if ($fld->w < 10) {
95 $lay_row_height = 43;
96 } else {
97 $lay_row_height = 2;
98 }
99
100 $class = $fld->i;
101 $lg_g_r_s = $fld->y + 1;
102 $lg_g_c_s = $fld->x + 1;
103 $lg_g_r_e = 1 !== $fld->y ? $fld->h + ($fld->y + 1) : 1;
104 $lg_g_c_e = ($fld->x + 1) + $fld->w;
105 $lg_g_r_span = $lg_g_r_e - $lg_g_r_s;
106 $lg_g_c_span = $lg_g_c_e - $lg_g_c_s;
107 $lg_min_height = $fld->h * $lay_row_height . 'px;';
108
109 $lg_styles .= ".$class { grid-area: $lg_g_r_s / $lg_g_c_s / $lg_g_r_e / $lg_g_c_e ; -ms-grid-row: $lg_g_r_s; -ms-grid-row-span: $lg_g_r_span; -ms-grid-column: $lg_g_c_s; -ms-grid-column-span: $lg_g_c_span; min-height: $lg_min_height; }";
110
111 $fld = $layout->md[$i];
112
113 $class = $fld->i;
114 $md_g_r_s = $fld->y + 1;
115 $md_g_c_s = $fld->x + 1;
116 $md_g_r_e = 1 !== $fld->y ? $fld->h + ($fld->y + 1) : 1;
117 $md_g_c_e = ($fld->x + 1) + $fld->w;
118 $md_g_r_span = $lg_g_r_e - $md_g_r_s;
119 $md_g_c_span = $lg_g_c_e - $md_g_c_s;
120 $md_min_height = $fld->h * $lay_row_height . 'px;';
121
122 $md_styles .= ".$class { grid-area: $md_g_r_s / $md_g_c_s / $md_g_r_e / $md_g_c_e ; -ms-grid-row: $md_g_r_s; -ms-grid-row-span: $md_g_r_span; -ms-grid-column: $md_g_c_s; -ms-grid-column-span: $md_g_c_span; min-height: $md_min_height; }";
123
124 $fld = $layout->sm[$i];
125
126 $class = $fld->i;
127 $sm_g_r_s = $fld->y + 1;
128 $sm_g_c_s = $fld->x + 1;
129 $sm_g_r_e = 1 !== $fld->y ? $fld->h + ($fld->y + 1) : 1;
130 $sm_g_c_e = ($fld->x + 1) + $fld->w;
131 $sm_g_r_span = $sm_g_r_e - $sm_g_r_s;
132 $sm_g_c_span = $sm_g_c_e - $sm_g_c_s;
133 $sm_min_height = $fld->h * $lay_row_height . 'px;';
134
135 $sm_styles .= ".$class { grid-area: $sm_g_r_s / $sm_g_c_s / $sm_g_r_e / $sm_g_c_e ; -ms-grid-row: $sm_g_r_s; -ms-grid-row-span: $sm_g_r_span; -ms-grid-column: $sm_g_c_s; -ms-grid-column-span: $sm_g_c_span; min-height: $sm_min_height; }";
136 }
137 $formStyle = "._frm-g{
138 display: grid;
139 display: -ms-grid;
140 grid-template-columns: repeat( 6 , minmax( 30px , 1fr ));
141 -ms-grid-columns: minmax( 30px , 1fr ) minmax( 30px , 1fr ) minmax( 30px , 1fr ) minmax( 30px , 1fr ) minmax( 30px , 1fr ) minmax( 30px , 1fr );
142 }
143 {$lg_styles}
144 @media only screen and (max-width:{$md_width}px) {
145 ._frm-g {grid-template-columns: repeat( 4 , minmax( 30px , 1fr ));-ms-grid-columns: minmax( 30px , 1fr ) minmax( 30px , 1fr ) minmax( 30px , 1fr ) minmax( 30px , 1fr );}
146 {$md_styles}
147 }
148 @media only screen and (max-width:{$sm_width}px) {
149 ._frm-g {grid-template-columns: repeat( 2 , minmax( 30px , 1fr ));-ms-grid-columns: minmax( 30px , 1fr ) minmax( 30px , 1fr );}
150 {$sm_styles}
151 }";
152
153 $this->createFormStylesDirIfNotExists();
154
155 if (
156 file_exists(BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles')
157 && wp_is_writable(BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles')
158 ) {
159 $filePath = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles' . DIRECTORY_SEPARATOR . $sheetName;
160 return FileHandler::writeFile($filePath, $formStyle);
161 }
162 return false;
163 }
164
165 public function createFormStylesDirIfNotExists()
166 {
167 if (!file_exists(BITFORMS_UPLOAD_DIR)) {
168 wp_mkdir_p(BITFORMS_UPLOAD_DIR);
169 }
170 if (!file_exists(BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles')) {
171 wp_mkdir_p(BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles');
172 }
173 }
174
175 private function pdfFontDownload($fontName)
176 {
177 if (class_exists('\BitCode\BitFormPro\Admin\AppSetting\Pdf')) {
178 \BitCode\BitFormPro\Admin\AppSetting\Pdf::getInstance()->fontsDownload($fontName);
179 }
180 return false;
181 }
182
183 public function createNewForm($Request, $post)
184 {
185 // wp_send_json_success($post);
186 // exit;
187 if (!isset($post->form_id) || '' === $post->form_id) {
188 return new WP_Error('empty_form', __('Error Occurred, Please Reload', 'bit-form'));
189 }
190
191 $formManager = new AdminFormManager($post->form_id);
192 if ($formManager->isExist()) {
193 return new WP_Error('empty_form', __('Error Occurred, Please Reload', 'bit-form'));
194 }
195
196 if (!class_exists('BitCode\\BitFormPro\\Plugin')) {
197 if (!empty($workFlows) && count($workFlows) > 2) {
198 return new WP_Error(
199 'free_limit',
200 __('You are allowed to add maximum 2 workflows ', 'bit-form')
201 );
202 }
203 }
204
205 if (isset($post->formStyle) && $post->formStyle) {
206 $sheetName = 'bitform-' . $post->form_id . '.css';
207 $this->saveStyleSheet($post->formStyle, $sheetName);
208 }
209
210 if (isset($post->layoutChanged) && $post->layoutChanged) {
211 $sheetName = 'bitform-layout-' . $post->form_id . '.css';
212 $rowHeight = (int) $post->rowHeight;
213 $this->saveLayoutStyleSheet($post->layout, $sheetName, $rowHeight);
214 }
215
216 $fields = wp_unslash($post->fields);
217 $fields = Helpers::replaceFieldsDefaultErrorMsg($fields);
218 // $fields = $post->fields;
219 $layout = wp_unslash($post->layout);
220 $nestedLayout = isset($post->nestedLayouts) ? wp_unslash($post->nestedLayouts) : (object) [];
221 $formInfo = wp_unslash($post->formInfo);
222 $form_name = wp_unslash($post->form_name);
223 $form_name = strlen($form_name) > 50 ? substr($form_name, 0, 50) : $form_name;
224 $formSettings = (object) wp_unslash($post->formSettings);
225 $atomic_class_map = isset($post->atomicClassMap) ? wp_unslash($post->atomicClassMap) : [];
226 $breakpointSize = wp_unslash($post->breakpointSize);
227 $style = $post->style;
228 $themeVars = $post->themeVars;
229 $themeColors = $post->themeColors;
230 $staticStyles = $post->staticStyles;
231 $workFlows = wp_unslash($post->workFlows);
232 $additional = wp_unslash($post->additional);
233 $reports = !empty($post->reports) ? $post->reports : (object) [];
234 $builderSettings = (object) isset($post->builderSettings) ? wp_unslash($post->builderSettings) : [];
235
236 $mailTem = $formSettings->mailTem;
237 $pdfTem = $formSettings->pdfTem;
238 $integrations = $formSettings->integrations;
239 $formPermissions = $formSettings->formPermissions;
240
241 $user_details = static::$ipTool->getUserDetail();
242 if (empty($fields) || empty($layout)) {
243 return new WP_Error(
244 'empty_form',
245 __('Can not save empty form.', 'bit-form')
246 );
247 }
248 if (strlen($form_name) > 50) {
249 return new WP_Error(
250 'empty_form',
251 __('Form Name Should Be Within 50 Characters', 'bit-form')
252 );
253 }
254 $form_content = [
255 'fields' => $fields,
256 'layout' => $layout,
257 'nestedLayout' => $nestedLayout,
258 'formInfo' => $formInfo,
259 ];
260
261 /* if (!empty($formSettings->submitBtn)) {
262 $form_content = array_merge($form_content, array('buttons' => $formSettings->submitBtn));
263 } */
264 if (!empty($formSettings->theme)) {
265 $form_content = array_merge($form_content, ['theme' => $formSettings->theme]);
266 }
267
268 if (!empty($formSettings->formPermissions)) {
269 $form_content = array_merge($form_content, ['formPermissions' => $formSettings->formPermissions]);
270 }
271
272 if (!empty($additional)) {
273 $form_content = array_merge($form_content, ['additional' => $additional]);
274 }
275 if (!empty($workFlows)) {
276 $workflows = is_string($workFlows) ? json_decode($workFlows) : $workFlows;
277 $workFlowExist = [];
278 foreach ($workflows as $index => $workFlow) {
279 if (in_array($workFlow->action_type, ['always', 'onload'])) {
280 $workFlowExist['onload'] = true;
281 }
282 if ('oninput' === $workFlow->action_type || ('always' === $workFlow->action_type && 'cond' === $workFlow->action_behaviour)) {
283 $workFlowExist['oninput'] = true;
284 }
285 }
286 $form_content = array_merge($form_content, ['workFlowExist' => $workFlowExist]);
287 }
288 $form_content = \wp_json_encode($form_content);
289
290 $builder_helper_state = (object) [
291 'style' => $style,
292 'staticStyles' => $staticStyles,
293 'breakpointSize' => $breakpointSize,
294 'themeVars' => $themeVars,
295 'themeColors' => $themeColors,
296 'builderSettings' => $builderSettings
297 ];
298 $atomic_class_map = \wp_json_encode($atomic_class_map);
299 $fdata = [
300 'id' => $post->form_id,
301 'form_content' => $form_content,
302 'builder_helper_state' => \wp_json_encode($builder_helper_state),
303 'atomic_class_map' => $atomic_class_map,
304 'generated_script_page_ids' => \wp_json_encode((object) []),
305 'user_id' => $user_details['id'],
306 'user_ip' => $user_details['ip'],
307 'user_device' => $user_details['device'],
308 'status' => 1,
309 'form_name' => $form_name,
310 'created_at' => $user_details['time'],
311 'updated_at' => $user_details['time'],
312 ];
313
314 $save_status = static::$formModel->insert($fdata);
315
316 if (is_wp_error($save_status)) {
317 return $save_status;
318 } elseif (!$save_status) {
319 return false;
320 } else {
321 FileHandler::createIndexFile(BITFORMS_UPLOAD_DIR . "/$save_status");
322 $formID = $save_status;
323 $integartionIDForWorkflow = [];
324 // Confiramtion Message [start]
325 if (!empty($formSettings->confirmation->type->successMsg)) {
326 $successMessages = $formSettings->confirmation->type->successMsg;
327 $successMessageHandler = new SuccessMessageHandler($formID, $user_details);
328 foreach ($successMessages as $messageKey => $messageDetail) {
329 $savedID = $successMessageHandler->saveMessage($messageDetail);
330 if ($savedID) {
331 $msgIdx = empty($messageDetail->id) ? $messageKey : wp_json_encode(['id' => $messageDetail->id]);
332 $integartionIDForWorkflow['successMsg'][$msgIdx] = $savedID;
333 $messageDetail->id = $savedID;
334 $style = $this->updateSuccessMessageClassName($style, $messageKey, $savedID);
335 $atomic_class_map = $this->updateSuccessMessageClassName($atomic_class_map, $messageKey, $savedID);
336 }
337 }
338 $builder_helper_state = (object) [
339 'style' => $style,
340 'breakpointSize' => $breakpointSize,
341 'themeVars' => $themeVars,
342 'themeColors' => $themeColors,
343 'builderSettings' => $builderSettings
344 ];
345 $update_status = static::$formModel->update(
346 [
347 'builder_helper_state' => \wp_json_encode($builder_helper_state),
348 'atomic_class_map' => $atomic_class_map,
349 ],
350 [
351 'id' => $formID,
352 ]
353 );
354 if (is_wp_error($update_status)) {
355 return $update_status;
356 }
357 unset($formSettings->confirmation->type->successMsg);
358 }
359 // return $formSettings;
360 // Confiramtion Message [end] */
361 // Email Template [start]
362 if (!empty($mailTem)) {
363 $emailTemplateHandler
364 = new EmailTemplateHandler($formID, $user_details);
365 foreach ($mailTem as $templateKey => $templateDetail) {
366 $savedID = $emailTemplateHandler->saveTemplate($templateDetail);
367 if ($savedID) {
368 $tempIdx = empty($templateDetail->id) ? $templateKey : wp_json_encode(['id' => $templateDetail->id]);
369 $integartionIDForWorkflow['mailNotify'][$tempIdx] = $savedID;
370 }
371 }
372 }
373 // Email Template [end] */
374
375 // PDF Template [start]
376 if (!empty($pdfTem)) {
377 $pdfTemplateHandler = new PdfTemplateHandler($formID);
378 $workFlowString = '';
379 if (!empty($workFlows)) {
380 $workFlowString = wp_json_encode($workFlows);
381 }
382 foreach ($pdfTem as $templateDetail) {
383 $savedID = $pdfTemplateHandler->save($templateDetail);
384
385 $pdfSetting = $templateDetail->setting;
386
387 if (isset($pdfSetting->font->name) && !empty($pdfSetting->font->name)) {
388 $this->pdfFontDownload($pdfSetting->font->name);
389 }
390 if (!empty($workFlowString)) {
391 $workFlowString = str_replace('"pdfId":"{\"id\":\"' . $templateDetail->id . '\"}"', '"pdfId":"{\"id\":\"' . $savedID . '\"}"', $workFlowString);
392 }
393 }
394 if (!empty($workFlowString) && !empty($workFlows)) {
395 $workFlows = json_decode($workFlowString);
396 }
397 }
398 // PDF Template [end] */
399 //Integration [start] */
400 $integrationHandler = new IntegrationHandler($formID, $user_details);
401 if (!empty($formSettings->confirmation->type)) {
402 $allIntegrations = $formSettings->confirmation->type;
403 foreach ($allIntegrations as $integrationType => $integrationGroup) {
404 foreach ($integrationGroup as $singleIntegrationKey => $singleIntegrationDetail) {
405 if (empty($singleIntegrationDetail->details)) {
406 $integrationName = $singleIntegrationDetail->title;
407 unset($singleIntegrationDetail->title, $singleIntegrationDetail->id);
408
409 $integrationDetails = !is_string($singleIntegrationDetail) ?
410 wp_json_encode($singleIntegrationDetail) : $singleIntegrationDetail;
411 } else {
412 $integrationName = $singleIntegrationDetail->title;
413 $integrationDetails = !is_string($singleIntegrationDetail->details) ?
414 wp_json_encode($singleIntegrationDetail->details) : $singleIntegrationDetail->details;
415 }
416 $savedID = $integrationHandler->saveIntegration($integrationName, $integrationType, $integrationDetails, 'form');
417 $integIdx = empty($singleIntegrationDetail->id) ? $savedID : wp_json_encode(['id' => $singleIntegrationDetail->id]);
418 $integartionIDForWorkflow[$integrationType][$integIdx] = $savedID;
419 }
420 }
421 }
422 if (isset($formSettings->formAbandonment)) {
423 $formAbandonment = $formSettings->formAbandonment;
424
425 $integrationName = 'formAbandonment';
426 $integrationType = 'formAbandonment';
427 $abandonmentIntegDetails = wp_json_encode($formAbandonment);
428 $integrationHandler->saveIntegration($integrationName, $integrationType, $abandonmentIntegDetails, 'formAbandonment');
429 }
430 if (!empty($integrations)) {
431 foreach ($integrations as $singleIntegrationKey => $singleIntegrationDetail) {
432 $integrationName = $singleIntegrationDetail->name;
433 unset($singleIntegrationDetail->name);
434 $integrationType = $singleIntegrationDetail->type;
435 unset($singleIntegrationDetail->type);
436 $singleIntegrationDetailID = empty($singleIntegrationDetail->id) ? null : $singleIntegrationDetail->id;
437 unset($singleIntegrationDetail->id);
438 if (empty($singleIntegrationDetail->details)) {
439 $integrationDetails = !is_string($singleIntegrationDetail) ?
440 wp_json_encode($singleIntegrationDetail) : $singleIntegrationDetail;
441 } else {
442 $integrationDetails = !is_string($singleIntegrationDetail->details) ?
443 wp_json_encode($singleIntegrationDetail->details) : $singleIntegrationDetail->details;
444 }
445 $savedID = $integrationHandler->saveIntegration($integrationName, $integrationType, $integrationDetails, 'form');
446 $integIdx = empty($singleIntegrationDetailID) ? $singleIntegrationKey : wp_json_encode(['id' => $singleIntegrationDetailID]);
447 $integartionIDForWorkflow['integ'][$integIdx] = $savedID;
448 }
449 }
450 //Integrations [end]
451 //wrokFlows [start]
452 if (!empty($workFlows)) {
453 $workFlowHandler = new WorkFlowHandler($formID, $user_details);
454
455 foreach ($workFlows as $index => $workFlow) {
456 $savedID = $workFlowHandler->saveworkFlow($workFlow, $integartionIDForWorkflow, $index);
457 $newData['workflow'] = 1;
458 }
459
460 // $workflowCount = count($workFlows);
461 // while ($workflowCount) {
462 // $workFlow = $workFlows[--$workflowCount];
463 // $savedID = $workFlowHandler->saveworkFlow($workFlow, $integartionIDForWorkflow);
464 // $newData['workflow'] = 1;
465 // }
466 }
467 //wrokFlows [end]
468 $details = [
469 'report_name' => __('All Entries', 'bit-form'),
470 'hiddenColumns' => ['__user_id', '__user_ip', '__referer', '__user_device', '__created_at', '__updated_at'],
471 'pageSize' => 10,
472 'sortBy' => [],
473 'filters' => [],
474 'globalFilter' => '',
475 'order' => []
476 ];
477 $defaultReport = [
478 'type' => 'table',
479 'category' => 'form',
480 'context' => $formID,
481 'details' => wp_json_encode($details),
482 'isDefault' => (bool) 1,
483 'user_id' => $user_details['id'],
484 'user_ip' => $user_details['ip'],
485 'user_device' => $user_details['device'],
486 'created_at' => $user_details['time'],
487 'updated_at' => $user_details['time'],
488 ];
489 $reportsModel = new ReportsModel();
490 $saveReportId = $reportsModel->insert($defaultReport);
491
492 // }
493 $updated_data = $this->getAForm(['id' => $save_status], null);
494 if (!is_wp_error($saveReportId) && isset($updated_data['form_content'])) {
495 $updated_data['form_content']['report_id'] = $saveReportId;
496 $updated_data['form_content']['is_default'] = 1;
497 }
498 $updated_data['message'] = __('Form Saved successfully', 'bit-form');
499
500 return $updated_data;
501 }
502 }
503
504 public function updateForm($Request, $post)
505 {
506 // return ['checked dta'=>$post];
507 $formId = $post->id;
508 // get the builder_helper_state from the form
509 $builder_helper_state = self::$formModel->get(['builder_helper_state'], ['id' => $formId]);
510 $builder_helper_state = (!is_wp_error($builder_helper_state) && 1 === count($builder_helper_state) && isset($builder_helper_state[0]->builder_helper_state)) ? $builder_helper_state[0]->builder_helper_state : '{}';
511 $builder_helper_state = json_decode($builder_helper_state);
512 if (property_exists($post, 'breakpointSize')) {
513 $builder_helper_state->breakpointSize = $post->breakpointSize;
514 }
515 if (property_exists($post, 'style')) {
516 $builder_helper_state->style = $post->style;
517 }
518 if (property_exists($post, 'staticStyles')) {
519 $builder_helper_state->staticStyles = $post->staticStyles;
520 }
521 if (property_exists($post, 'themeVars')) {
522 $builder_helper_state->themeVars = $post->themeVars;
523 }
524 if (property_exists($post, 'themeColors')) {
525 $builder_helper_state->themeColors = $post->themeColors;
526 }
527 if (property_exists($post, 'builderSettings')) {
528 $builder_helper_state->builderSettings = $post->builderSettings;
529 }
530 if (property_exists($post, 'atomicClassMap')) {
531 $atomic_class_map = \wp_json_encode((object) $post->atomicClassMap);
532 }
533
534 if (property_exists($post, 'fields') && null !== $post->fields && property_exists($post, 'layout') && $post->layout) {
535 $fields = wp_unslash($post->fields);
536 $fields = Helpers::replaceFieldsDefaultErrorMsg($fields);
537 $layout = wp_unslash($post->layout);
538 $nestedLayout = wp_unslash($post->nestedLayouts);
539 $formInfo = wp_unslash($post->formInfo);
540 $formID = wp_unslash($post->id);
541 $form_name = wp_unslash($post->form_name);
542 $formSettings = wp_unslash($post->formSettings);
543 $workFlows = wp_unslash($post->workFlows);
544 $additional = wp_unslash($post->additional);
545 $reports = wp_unslash($post->currentReport);
546 }
547
548 $mailTem = $formSettings->mailTem;
549 $pdfTem = isset($formSettings->pdfTem) ? $formSettings->pdfTem : [];
550 $integrations = $formSettings->integrations;
551
552 $user_details = static::$ipTool->getUserDetail();
553
554 if (empty($fields) || empty($layout) || is_null($formID)) {
555 return new WP_Error('empty_form', 'Can not update empty form.');
556 }
557
558 if (!class_exists('BitCode\\BitFormPro\\Plugin')) {
559 if (count($workFlows) > 2) {
560 return new WP_Error(
561 'free_limit',
562 __('You are allowed to add maximum 2 workflows ', 'bit-form')
563 );
564 }
565 }
566
567 $form_content = [
568 'fields' => $fields,
569 'layout' => $layout,
570 'nestedLayout' => $nestedLayout,
571 'formInfo' => $formInfo,
572 ];
573
574 if (isset($post->report_id)) {
575 $form_content['report_id'] = wp_unslash($post->report_id);
576 }
577
578 /* if (!empty($formSettings->submitBtn)) {
579 $form_content = array_merge($form_content, array('buttons' => $formSettings->submitBtn));
580 } */
581 if (!empty($formSettings->theme)) {
582 $form_content = array_merge($form_content, ['theme' => $formSettings->theme]);
583 }
584
585 if (!empty($formSettings->formPermissions)) {
586 $form_content = array_merge($form_content, ['formPermissions' => $formSettings->formPermissions]);
587 }
588 if (!empty($additional)) {
589 $form_content = array_merge($form_content, ['additional' => $additional]);
590 }
591 $integartionIDForWorkflow = [];
592 $newData['settingConfiramation'] = 0;
593 $newData['integation'] = 0;
594 $newData['mailTemplate'] = 0;
595 $newData['workflow'] = 0;
596 $newData['reports'] = 0;
597 $newData['pdfTemplate'] = 0;
598 // Confiramtion Message [start]
599 if (!empty($formSettings->confirmation->type->successMsg)) {
600 $successMessages = $formSettings->confirmation->type->successMsg;
601 $successMessageHandler
602 = new SuccessMessageHandler($formID, $user_details);
603 foreach ($successMessages as $messageKey => $messageDetail) {
604 if (empty($messageDetail->id)) {
605 $savedID = $successMessageHandler->saveMessage($messageDetail);
606 if ($savedID) {
607 $newData['settingConfiramation'] = 1;
608 $integartionIDForWorkflow['successMsg'][$messageKey] = $savedID;
609 $messageDetail->id = $savedID;
610 $builder_helper_state->style = $this->updateSuccessMessageClassName($builder_helper_state->style, $messageKey, $savedID);
611 if (isset($atomic_class_map)) {
612 $atomic_class_map = $this->updateSuccessMessageClassName($atomic_class_map, $messageKey, $savedID);
613 }
614 }
615 } else {
616 $successMessageHandler->updateMessage($messageDetail);
617 }
618 }
619 unset($formSettings->confirmation->type->successMsg);
620 }
621 // return $formSettings;
622 // Confirmation Message [end] */
623 // Email Template [start]
624 if (!empty($mailTem)) {
625 $emailTemplateHandler
626 = new EmailTemplateHandler($formID, $user_details);
627 foreach ($mailTem as $templateKey => $templateDetail) {
628 if (empty($templateDetail->id)) {
629 $savedID = $emailTemplateHandler->saveTemplate($templateDetail);
630 if (is_wp_error($savedID) && 'result_empty' === $savedID->get_error_code()) {
631 $newData['mailTemplate'] = 2;
632 } else {
633 $newData['mailTemplate'] = 1;
634 $integartionIDForWorkflow['mailTem'][$templateKey] = $savedID;
635 }
636 } else {
637 $emailTemplateHandler->updateTemplate($templateDetail);
638 }
639 }
640 }
641 // return $formSettings;
642 // Email Template [end] */
643 if (!empty($pdfTem)) {
644 $pdfTemplateHandler = new PdfTemplateHandler($formID);
645
646 foreach ($pdfTem as $templateKey => $templateDetail) {
647 if (isset($templateDetail->setting->font->name)) {
648 $this->pdfFontDownload($templateDetail->setting->font->name);
649 }
650
651 $savedID = $pdfTemplateHandler->saveOrUpdate($templateDetail);
652 if (is_wp_error($savedID) && 'result_empty' === $savedID->get_error_code()) {
653 $newData['pdfTemplate'] = 2;
654 } else {
655 $newData['pdfTemplate'] = 1;
656 $integartionIDForWorkflow['pdfTem'][$templateKey] = $savedID;
657 }
658 }
659 }
660 //Integration [start] */
661 $integrationHandler = new IntegrationHandler($formID, $user_details);
662 if (!empty($formSettings->confirmation->type)) {
663 $allIntegrations = $formSettings->confirmation->type;
664 foreach ($allIntegrations as $integrationType => $integrationGroup) {
665 foreach ($integrationGroup as $singleIntegrationKey => $singleIntegrationDetail) {
666 if (empty($singleIntegrationDetail->details)) {
667 $integrationName = $singleIntegrationDetail->title;
668 unset($singleIntegrationDetail->title);
669 $singleIntegrationDetailID = empty($singleIntegrationDetail->id) ? null : $singleIntegrationDetail->id;
670 unset($singleIntegrationDetail->id);
671 $integrationDetails = !is_string($singleIntegrationDetail) ?
672 wp_json_encode($singleIntegrationDetail) : $singleIntegrationDetail;
673 } else {
674 $singleIntegrationDetailID = empty($singleIntegrationDetail->id) ? null : $singleIntegrationDetail->id;
675 unset($singleIntegrationDetail->id);
676 $integrationName = $singleIntegrationDetail->title;
677 $integrationDetails = !is_string($singleIntegrationDetail->details) ?
678 wp_json_encode($singleIntegrationDetail->details) : $singleIntegrationDetail->details;
679 }
680 if (empty($singleIntegrationDetailID)) {
681 $savedID = $integrationHandler->saveIntegration($integrationName, $integrationType, $integrationDetails, 'form');
682 $newData['settingConfiramation'] = 1;
683 $integartionIDForWorkflow[$integrationType][$singleIntegrationKey] = $savedID;
684 } else {
685 $integrationHandler->updateIntegration($singleIntegrationDetailID, $integrationName, $integrationType, $integrationDetails, 'form');
686 }
687 }
688 }
689 }
690 if (!empty($integrations)) {
691 foreach ($integrations as $singleIntegrationKey => $singleIntegrationDetail) {
692 $integrationName = $singleIntegrationDetail->name;
693 unset($singleIntegrationDetail->name);
694 $integrationType = $singleIntegrationDetail->type;
695 unset($singleIntegrationDetail->type);
696 $singleIntegrationDetailID = empty($singleIntegrationDetail->id) ? null : $singleIntegrationDetail->id;
697 unset($singleIntegrationDetail->id);
698 if (empty($singleIntegrationDetail->details)) {
699 $integrationDetails = !is_string($singleIntegrationDetail) ?
700 wp_json_encode($singleIntegrationDetail) : $singleIntegrationDetail;
701 } else {
702 $integrationDetails = !is_string($singleIntegrationDetail->details) ?
703 wp_json_encode($singleIntegrationDetail->details) : $singleIntegrationDetail->details;
704 }
705 if (empty($singleIntegrationDetailID)) {
706 $savedID = $integrationHandler->saveIntegration($integrationName, $integrationType, $integrationDetails, 'form');
707 $integartionIDForWorkflow[$integrationType][$singleIntegrationKey] = $savedID;
708 if (is_wp_error($savedID) && 'result_empty' !== $savedID->get_error_code()) {
709 $newData['integation'] = 2;
710 } else {
711 $newData['integation'] = 1;
712 }
713 } else {
714 $integrationHandler->updateIntegration($singleIntegrationDetailID, $integrationName, $integrationType, $integrationDetails, 'form');
715 }
716 }
717 }
718 //Integrations [end]
719 //workFlows [start] */
720 $workFlowExist = [];
721 if (!empty($workFlows)) {
722 $workFlowHandler = new WorkFlowHandler($formID, $user_details);
723 // foreach ($workFlows as $workFlowIndex => $workFlow) {
724 $workflows = is_string($workFlows) ? json_decode($workFlows) : $workFlows;
725
726 foreach ($workflows as $index => $workFlow) {
727 if (in_array($workFlow->action_type, ['always', 'onload'])) {
728 $workFlowExist['onload'] = true;
729 }
730 if ('oninput' === $workFlow->action_type || ('always' === $workFlow->action_type && 'cond' === $workFlow->action_behaviour)) {
731 $workFlowExist['oninput'] = true;
732 }
733 // $integartionIDForWorkflow = apply_filters('bitform_filter_integration_id', $workFlow, $formID, $index);
734 if (empty($workFlow->id)) {
735 $savedID = $workFlowHandler->saveworkFlow($workFlow, $integartionIDForWorkflow, $index);
736 if (is_wp_error($savedID) && 'result_empty' !== $savedID->get_error_code()) {
737 $newData['workflow'] = 2;
738 } else {
739 $newData['workflow'] = 1;
740 }
741 } else {
742 $newData = $workFlowHandler->updateworkFlow($workFlow->id, $workFlow, $integartionIDForWorkflow, $index, $newData);
743 }
744 }
745 }
746 $form_content = array_merge($form_content, ['workFlowExist' => $workFlowExist]);
747 //wrokFlows [end]
748 //reports [start] */
749 if (!empty($reports)) {
750 $reportsModel = new ReportsModel();
751 $fieldNames = [];
752 foreach ($fields as $key => $field) {
753 if (!empty($field->lbl)) {
754 // $name = preg_replace('/[\`\~\!\@\#\$\'\.\s\?\+\-\*\&\|\/\\\!]/', '_', $field->lbl);
755 $fieldNames["$key"] = $field->lbl;
756 }
757 }
758
759 $fieldNames['__user_id'] = __('User', 'bit-form');
760 $fieldNames['__user_ip'] = __('IP address', 'bit-form');
761 // $fieldNames['__user_location'] = __('');
762 $fieldNames['__referer'] = __('Refer URL', 'bit-form');
763 $fieldNames['__user_device'] = __('Device', 'bit-form');
764 $fieldNames['__created_at'] = __('Created Time', 'bit-form');
765 $fieldNames['__updated_at'] = __('Modified Time', 'bit-form');
766
767 $reportIsDefault = null;
768 if (isset($form_content['report_id'])) {
769 $validDateReport = $reportsModel->validateReportFields($reports, $fieldNames);
770 if (isset($reports->isDefault)) {
771 $reportIsDefault = $reports->isDefault;
772 } else {
773 $reportIsDefault = 0;
774 }
775
776 $reportsModel->update(
777 [
778 'type' => 'table',
779 'category' => 'form',
780 'context' => $formID,
781 'details' => is_string($validDateReport) ? $validDateReport : wp_json_encode($validDateReport),
782 'isDefault' => (int) $reportIsDefault,
783 'user_id' => $user_details['id'],
784 'user_ip' => $user_details['ip'],
785 'user_device' => $user_details['device'],
786 'updated_at' => $user_details['time'],
787 ],
788 [
789 'id' => $form_content['report_id'],
790 ]
791 );
792 }
793 }
794 //reports [end]
795 //form abandonment [start]
796 if (!empty($formSettings->formAbandonment)) {
797 $formAbandonment = $formSettings->formAbandonment;
798 // search for existing form abandonment in integration table
799 $abandonmentInteg = $integrationHandler->getAllIntegration('formAbandonment', 'formAbandonment');
800 if (!is_wp_error($abandonmentInteg) && !empty($abandonmentInteg)) {
801 $abandonmentInteg = $abandonmentInteg[0];
802 }
803 if (isset($abandonmentInteg->id)) {
804 $abandonmentIntegID = $abandonmentInteg->id;
805 $abandonmentIntegDetails = wp_json_encode($formAbandonment);
806 $integrationHandler->updateIntegration($abandonmentIntegID, 'formAbandonment', 'formAbandonment', $abandonmentIntegDetails, 'formAbandonment');
807 } else {
808 $abandonmentIntegDetails = wp_json_encode($formAbandonment);
809 $integrationHandler->saveIntegration('formAbandonment', 'formAbandonment', $abandonmentIntegDetails, 'formAbandonment');
810 }
811 }
812 //form abandonment [end]
813 $form_content = wp_json_encode($form_content);
814 $updateData = [
815 'form_name' => $form_name,
816 'form_content' => $form_content,
817 'user_id' => $user_details['id'],
818 'user_ip' => $user_details['ip'],
819 'builder_helper_state' => \wp_json_encode((object) $builder_helper_state),
820 'generated_script_page_ids' => \wp_json_encode((object) []),
821 'user_device' => $user_details['device'],
822 'updated_at' => $user_details['time'],
823 ];
824 if (isset($atomic_class_map)) {
825 $updateData['atomic_class_map'] = $atomic_class_map;
826 }
827 $formUpdateVersion = get_option('bit-form_form_update_version');
828 if (!$formUpdateVersion) {
829 $formUpdateVersion = 1;
830 } else {
831 $formUpdateVersion = (int) $formUpdateVersion + 1;
832 }
833 update_option('bit-form_form_update_version', $formUpdateVersion);
834
835 $update_status = static::$formModel->update(
836 $updateData,
837 [
838 'id' => $formID,
839 ]
840 );
841 if (is_wp_error($update_status)) {
842 return $update_status;
843 } elseif (!$update_status) {
844 return new WP_Error('empty_form', __('Form update failed.', 'bit-form'));
845 } else {
846 if (isset($post->deletedFldKey) && is_array($post->deletedFldKey)) {
847 $this->setEmptyMetaValue($post->deletedFldKey);
848 unset($post->deletedFldKey);
849 }
850
851 $updated_data = $this->getAForm(['id' => $formID], null);
852
853 if (0 === $newData['settingConfiramation'] && 0 === $newData['mailTemplate'] && 0 === $newData['integation'] && 0 === $newData['pdfTemplate']) {
854 unset($updated_data['formSettings']);
855 }
856 if (0 === $newData['integation']) {
857 unset($updated_data['integrations']);
858 } elseif (2 === $newData['integation']) {
859 $errorIN = '';
860 $errorIN .= empty($errorIN) ? 'integation' : ', integation';
861 }
862 if (0 === $newData['mailTemplate']) {
863 unset($updated_data['mailTem']);
864 } elseif (2 === $newData['mailTemplate']) {
865 $errorIN .= empty($errorIN) ? 'mailTemplate' : ', mailTemplate';
866 }
867 if (0 === $newData['pdfTemplate']) {
868 unset($updated_data['pdfTem']);
869 } elseif (2 === $newData['pdfTemplate']) {
870 $errorIN .= empty($errorIN) ? 'pdfTemplate' : ', pdfTemplate';
871 }
872 if (0 === $newData['workflow']) {
873 unset($updated_data['workFlows']);
874 } elseif (2 === $newData['workflow']) {
875 $errorIN .= empty($errorIN) ? 'workflow' : ', workflow';
876 }
877 if (2 === $newData['reports']) {
878 $errorIN .= empty($errorIN) ? 'reports' : ', reports';
879 }
880 if (!empty($errorIN)) {
881 /* translators: %s: comma-separated list of areas where error occurred */
882 $updated_data['message'] = sprintf(__('Error Occured in saving %s', 'bit-form'), $errorIN);
883 return new WP_Error('Form update Error.', $updated_data);
884 }
885 if (null !== $reportIsDefault) {
886 $updated_data['form_content']['is_default'] = $reportIsDefault;
887 }
888 $updated_data['message'] = __('Form updated successfully.', 'bit-form');
889 return $updated_data;
890 }
891 }
892
893 public function setEmptyMetaValue($fieldkeys)
894 {
895 global $wpdb;
896 $placeholders = implode(',', array_fill(0, \count($fieldkeys), '%s'));
897 $sql = $wpdb->prepare(
898 "UPDATE `{$wpdb->prefix}bitforms_form_entrymeta` SET meta_value = %s WHERE meta_key IN ($placeholders)",
899 '',
900 ...$fieldkeys
901 );
902 $wpdb->query($sql); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
903 }
904
905 public function changeFormStatus($Request, $post)
906 {
907 if (isset($Request['status']) && $Request['id']) {
908 $status = wp_unslash($Request['status']);
909 $id = wp_unslash($Request['id']);
910 } else {
911 $status = wp_unslash($post->status);
912 $id = wp_unslash($post->id);
913 }
914 $user_details = static::$ipTool->getUserDetail();
915 // return $post->fields;
916 $status = 'true' === $status || true === $status ? true : false;
917 if (!is_bool($status) || is_null($id)) {
918 // echo $status;
919 return new WP_Error('status_change', __('Form status change failed.', 'bit-form'));
920 }
921 $update_status = static::$formModel->update(
922 [
923 'user_id' => $user_details['id'],
924 'user_ip' => $user_details['ip'],
925 'user_device' => $user_details['device'],
926 'status' => $status ? 1 : 0,
927 'updated_at' => $user_details['time'],
928 ],
929 [
930 'id' => $id,
931 ]
932 );
933 if (is_wp_error($update_status)) {
934 return $update_status;
935 } elseif (!$update_status) {
936 return false;
937 } else {
938 return __('Form status changed successfully', 'bit-form');
939 }
940 }
941
942 public function changeBulkFormStatus($Request, $post)
943 {
944 if (isset($Request['status']) && $Request['formID']) {
945 $status = wp_unslash($Request['status']);
946 $formID = wp_unslash($Request['formID']);
947 } else {
948 $status = wp_unslash($post->status);
949 $formID = wp_unslash($post->formID);
950 }
951 $user_details = static::$ipTool->getUserDetail();
952 // return $post->fields;
953 $status = 'true' === $status || true === $status ? true : false;
954 if (!is_bool($status) || is_null($formID) || !is_array($formID)) {
955 // echo $status;
956 return new WP_Error('status_change', __('Form status change failed.', 'bit-form'));
957 }
958 $update_status = static::$formModel->bulkUpdate(
959 [
960 'user_id' => $user_details['id'],
961 'user_ip' => $user_details['ip'],
962 'user_device' => $user_details['device'],
963 'status' => $status ? 1 : 0,
964 'updated_at' => $user_details['time'],
965 ],
966 [
967 'id' => $formID,
968 ]
969 );
970 if (is_wp_error($update_status)) {
971 return $update_status;
972 } elseif (!$update_status) {
973 return false;
974 } else {
975 return __('Form status changed successfully', 'bit-form');
976 }
977 }
978
979 public function getAllForm()
980 {
981 global $wpdb;
982
983 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
984 $allForms = $wpdb->get_results("SELECT forms.id,forms.entries as fm_entries,forms.form_name,forms.status,forms.views,forms.created_at,COUNT(entries.id) as entries FROM `{$wpdb->prefix}bitforms_form` as forms LEFT JOIN `{$wpdb->prefix}bitforms_form_entries` as entries ON forms.id = entries.form_id GROUP BY forms.id");
985
986 if (is_wp_error($allForms)) {
987 return $allForms;
988 } elseif (!$allForms) {
989 return [];
990 } else {
991 return $allForms;
992 }
993 }
994
995 public function getAForm($Request, $post)
996 {
997 if (isset($Request['id'])) {
998 $formID = wp_unslash($Request['id']);
999 } else {
1000 $formID = wp_unslash($post->id);
1001 }
1002 // return $post->fields;
1003 if (is_null($formID)) {
1004 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1005 }
1006 $formManager = new AdminFormManager($formID);
1007 if (!$formManager->isExist()) {
1008 return new WP_Error('not_exists', __('Form is not exists.', 'bit-form'));
1009 }
1010 $form_content = $formManager->getFormContent();
1011 $helper_states = $formManager->getFormHelperStates();
1012 if ($formManager->isExist()) {
1013 $form_content_arr = [
1014 'layout' => $form_content->layout,
1015 'nestedLayout' => !empty($form_content->nestedLayout) ? $form_content->nestedLayout : (object) [],
1016 'formInfo' => !empty($form_content->formInfo) ? $form_content->formInfo : (object) ['formName' => $formManager->getFormName()],
1017 'fields' => $form_content->fields,
1018 'form_name' => $formManager->getFormName(),
1019 'workFlowExist' => $form_content->workFlowExist,
1020 'report_id' => isset($form_content->report_id) ? $form_content->report_id : null
1021 ];
1022 $successMessageHandler
1023 = new SuccessMessageHandler($formID);
1024 $successMessages = $successMessageHandler->getAllMessage();
1025 if (!is_wp_error($successMessages)) {
1026 foreach ($successMessages as $sucessMessagekey => $sucessMessagevalue) {
1027 $sucessMessagevalue->message_config = json_decode($sucessMessagevalue->message_config);
1028 $allConfirmation['type']['successMsg'][$sucessMessagekey] =
1029 [
1030 'id' => $sucessMessagevalue->id,
1031 'title' => $sucessMessagevalue->message_title,
1032 'msg' => $sucessMessagevalue->message_content,
1033 'config' => $sucessMessagevalue->message_config,
1034 ];
1035 }
1036 }
1037 $emailTemplateHandler
1038 = new EmailTemplateHandler($formID);
1039 $emailTemplates = $emailTemplateHandler->getAllTemplate();
1040 if (!is_wp_error($emailTemplates)) {
1041 foreach ($emailTemplates as $emailTemplatekey => $emailTemplatevalue) {
1042 $mailTem[] =
1043 [
1044 'id' => $emailTemplatevalue->id,
1045 'title' => $emailTemplatevalue->title,
1046 'sub' => $emailTemplatevalue->sub,
1047 'body' => $emailTemplatevalue->body,
1048 ];
1049 }
1050 }
1051 // get all pdf template
1052 $pdfTemplateHandler = new PdfTemplateHandler($formID);
1053 $pdfTemplates = $pdfTemplateHandler->getAll();
1054
1055 if (!is_wp_error($pdfTemplates)) {
1056 foreach ($pdfTemplates as $value) {
1057 $pdfTem[] =
1058 [
1059 'id' => $value->id,
1060 'title' => $value->title,
1061 'setting' => json_decode($value->setting),
1062 'body' => $value->body,
1063 ];
1064 }
1065 }
1066
1067 $integrationHandler = new IntegrationHandler($formID);
1068 $formIntegrations = $integrationHandler->getAllIntegration('form');
1069 if (!is_wp_error($formIntegrations)) {
1070 foreach ($formIntegrations as $integrationkey => $integrationValue) {
1071 if ('redirectPage' === $integrationValue->integration_type || 'webHooks' === $integrationValue->integration_type) {
1072 $integrationData = [
1073 'id' => $integrationValue->id,
1074 'title' => $integrationValue->integration_name,
1075 ];
1076 if (!empty($integrationValue->integration_details)) {
1077 $integration_details = (array) json_decode($integrationValue->integration_details);
1078 $integrationData = array_merge($integration_details, $integrationData);
1079 } else {
1080 $integration_details = [
1081 'url' => '',
1082 ];
1083 $integrationData = array_merge($integrationData, $integration_details);
1084 }
1085 $allConfirmation['type'][$integrationValue->integration_type][]
1086 = $integrationData;
1087 } else {
1088 $integrationData = [
1089 'id' => $integrationValue->id,
1090 'name' => $integrationValue->integration_name,
1091 'type' => $integrationValue->integration_type,
1092 ];
1093 $integrations[] = array_merge(
1094 $integrationData,
1095 is_string($integrationValue->integration_details) ?
1096 (array) json_decode($integrationValue->integration_details) :
1097 $integrationValue->integration_details
1098 );
1099 }
1100 }
1101 }
1102
1103 // get form abandonment integration if exist
1104 $formAbandonmentInteg = $integrationHandler->getAllIntegration('formAbandonment', 'formAbandonment');
1105 if (!is_wp_error($formAbandonmentInteg) && !empty($formAbandonmentInteg)) {
1106 $formAbandonmentInteg = $formAbandonmentInteg[0];
1107 if (!empty($formAbandonmentInteg->integration_details)) {
1108 $formAbandonment = json_decode($formAbandonmentInteg->integration_details);
1109 } else {
1110 $formAbandonment = (object) [];
1111 }
1112 } else {
1113 $formAbandonment = (object) [];
1114 }
1115
1116 $settingsContent = [
1117 'formName' => $formManager->getFormName(),
1118 'theme' => isset($form_content->theme) ? $form_content->theme : 'default',
1119 'formPermissions' => isset($form_content->formPermissions) ? $form_content->formPermissions : (object) [],
1120 // 'submitBtn' => $form_content->buttons,
1121 ];
1122
1123 if (!empty($allConfirmation)) {
1124 $confirmation = [
1125 'confirmation' => $allConfirmation,
1126 ];
1127 } else {
1128 $confirmation = [
1129 'confirmation' => ['type' => []],
1130 ];
1131 }
1132 $settingsContent = array_merge($settingsContent, $confirmation);
1133 if (!empty($integrations)) {
1134 $settingsContent = array_merge(
1135 $settingsContent,
1136 [
1137 'integrations' => $integrations,
1138 ]
1139 );
1140 } else {
1141 $settingsContent = array_merge(
1142 $settingsContent,
1143 [
1144 'integrations' => []
1145 ]
1146 );
1147 }
1148
1149 if (!empty($mailTem)) {
1150 $settingsContent = array_merge(
1151 $settingsContent,
1152 [
1153 'mailTem' => $mailTem,
1154 ]
1155 );
1156 } else {
1157 $settingsContent = array_merge(
1158 $settingsContent,
1159 [
1160 'mailTem' => []
1161 ]
1162 );
1163 }
1164
1165 if (!empty($pdfTem)) {
1166 $settingsContent = array_merge(
1167 $settingsContent,
1168 [
1169 'pdfTem' => $pdfTem,
1170 ]
1171 );
1172 } else {
1173 $settingsContent = array_merge(
1174 $settingsContent,
1175 [
1176 'pdfTem' => [],
1177 ]
1178 );
1179 }
1180
1181 if (!empty($formAbandonment)) {
1182 $settingsContent = array_merge(
1183 $settingsContent,
1184 [
1185 'formAbandonment' => $formAbandonment,
1186 ]
1187 );
1188 } else {
1189 $settingsContent = array_merge(
1190 $settingsContent,
1191 [
1192 'formAbandonment' => (object) [],
1193 ]
1194 );
1195 }
1196 $formSettings = [
1197 'formSettings' => $settingsContent,
1198 ];
1199 $data = [
1200 'id' => $formID,
1201 'form_name' => $formManager->getFormName(),
1202 'form_content' => $form_content_arr,
1203 'breakpointSize' => $helper_states->breakpointSize,
1204 'style' => $helper_states->style,
1205 'themeVars' => $helper_states->themeVars,
1206 'themeColors' => $helper_states->themeColors,
1207 'builderSettings' => $helper_states->builderSettings,
1208 'additional' => empty($form_content->additional) ? [
1209 'enabled' => [
1210 'blocked_ip' => false,
1211 'restrict_form' => false,
1212 'onePerIp' => false,
1213 ],
1214 'settings' => [
1215 'restrict_form' => [
1216 'day' => [],
1217 'date' => [
1218 'from' => null,
1219 'to' => null,
1220 ],
1221 'time' => [
1222 'from' => null,
1223 'to' => null,
1224 ],
1225 ],
1226 'entry_limit' => null,
1227 'blocked_ip' => [],
1228 ],
1229 ] : $form_content->additional,
1230 'created_at' => $formManager->getFormMetaData()['created_at'],
1231 'views' => $formManager->getFormMetaData()['views'],
1232 'entries' => $formManager->getFormMetaData()['entries'],
1233 'status' => $formManager->getFormMetaData()['status'],
1234 ];
1235 $data = array_merge($data, $formSettings);
1236 $workFlowHandler = new WorkFlowHandler($formID);
1237 $workFlows = ['workFlows' => $workFlowHandler->getAllworkFlow()];
1238 $data = array_merge($data, $workFlows);
1239 $reportsModel = new ReportsModel();
1240 $returnedReportData = $reportsModel->get(
1241 [
1242 'id',
1243 'details',
1244 'isDefault',
1245 'type',
1246 ],
1247 [
1248 'category' => 'form',
1249 'context' => $formID,
1250 ]
1251 );
1252
1253 if (!is_wp_error($returnedReportData)) {
1254 $fieldNames = [];
1255 foreach ($formManager->getFieldLabel() as $key => $field) {
1256 $fieldNames[$field['key']] = isset($field->lbl) ? $field->lbl : '';
1257 }
1258 if ($formManager->isGCLIDEnabled()) {
1259 $fieldNames['GCLID'] = 'GCLID';
1260 }
1261 foreach ($returnedReportData as $reportKey => $reportData) {
1262 $reportDetails = $reportsModel->validateReportFields($reportData, $fieldNames);
1263 if (!empty($reportDetails) && is_string($reportDetails)) {
1264 $returnedReportData[$reportKey]->details = json_decode($reportDetails);
1265 } elseif (!empty($reportDetails)) {
1266 $returnedReportData[$reportKey]->details = $reportDetails;
1267 } else {
1268 $returnedReportData[$reportKey]->details = [];
1269 }
1270 if ('1' === (string) $reportData->isDefault) {
1271 $returnedReportData[$reportKey]->details->report_name = __('All Entries', 'bit-form');
1272 }
1273 }
1274 $reports = ['reports' => $returnedReportData];
1275 $data = array_merge($data, $reports);
1276 }
1277
1278 $formFields = $formManager->getFieldLabel();
1279 $data = array_merge($data, ['Labels' => $formFields]);
1280
1281 return $data;
1282 }
1283 }
1284
1285 public function getAFormV1($Request, $post)
1286 {
1287 if (isset($Request['id'])) {
1288 $formID = wp_unslash($Request['id']);
1289 } else {
1290 $formID = wp_unslash($post->id);
1291 }
1292 // return $post->fields;
1293 if (is_null($formID)) {
1294 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1295 }
1296 $formManager = new AdminFormManager($formID);
1297 if (!$formManager->isExist()) {
1298 return new WP_Error('not_exists', __('Form is not exists.', 'bit-form'));
1299 }
1300 $form_content = $formManager->getFormContent();
1301 if ($formManager->isExist()) {
1302 $form_content_arr = [
1303 'layout' => $form_content->layout,
1304 'fields' => $form_content->fields,
1305 'form_name' => $formManager->getFormName(),
1306 'workFlowExist' => $form_content->workFlowExist,
1307 'report_id' => isset($form_content->report_id) ? $form_content->report_id : null
1308 ];
1309 $successMessageHandler
1310 = new SuccessMessageHandler($formID);
1311 $successMessages = $successMessageHandler->getAllMessage();
1312 if (!is_wp_error($successMessages)) {
1313 foreach ($successMessages as $sucessMessagekey => $sucessMessagevalue) {
1314 $allConfirmation['type']['successMsg'][$sucessMessagekey] =
1315 [
1316 'id' => $sucessMessagevalue->id,
1317 'title' => $sucessMessagevalue->message_title,
1318 'msg' => $sucessMessagevalue->message_content,
1319 ];
1320 }
1321 }
1322 $emailTemplateHandler
1323 = new EmailTemplateHandler($formID);
1324 $emailTemplates = $emailTemplateHandler->getAllTemplate();
1325 if (!is_wp_error($emailTemplates)) {
1326 foreach ($emailTemplates as $emailTemplatekey => $emailTemplatevalue) {
1327 $mailTem[] =
1328 [
1329 'id' => $emailTemplatevalue->id,
1330 'title' => $emailTemplatevalue->title,
1331 'sub' => $emailTemplatevalue->sub,
1332 'body' => $emailTemplatevalue->body,
1333 ];
1334 }
1335 }
1336 $integrationHandler = new IntegrationHandler($formID);
1337 $formIntegrations = $integrationHandler->getAllIntegration('form');
1338 if (!is_wp_error($formIntegrations)) {
1339 foreach ($formIntegrations as $integrationkey => $integrationValue) {
1340 if ('redirectPage' === $integrationValue->integration_type || 'webHooks' === $integrationValue->integration_type) {
1341 $integrationData = [
1342 'id' => $integrationValue->id,
1343 'title' => $integrationValue->integration_name,
1344 ];
1345 if (!empty($integrationValue->integration_details)) {
1346 // var_dump(json_decode($integrationValue->integration_details));
1347 $integration_details = (array) json_decode($integrationValue->integration_details);
1348 $integrationData = array_merge($integration_details, $integrationData);
1349 } else {
1350 $integration_details = [
1351 'url' => '',
1352 ];
1353 $integrationData = array_merge($integrationData, $integration_details);
1354 }
1355 $allConfirmation['type'][$integrationValue->integration_type][]
1356 = $integrationData;
1357 } else {
1358 $integrationData = [
1359 'id' => $integrationValue->id,
1360 'name' => $integrationValue->integration_name,
1361 'type' => $integrationValue->integration_type,
1362 ];
1363 $integrations[] = array_merge(
1364 $integrationData,
1365 is_string($integrationValue->integration_details) ?
1366 (array) json_decode($integrationValue->integration_details) :
1367 $integrationValue->integration_details
1368 );
1369 }
1370 }
1371 }
1372 $settingsContent = [
1373 'formName' => $formManager->getFormName(),
1374 'theme' => $form_content->theme,
1375 // 'submitBtn' => $form_content->buttons,
1376 ];
1377
1378 if (!empty($allConfirmation)) {
1379 $confirmation = [
1380 'confirmation' => $allConfirmation,
1381 ];
1382 } else {
1383 $confirmation = [
1384 'confirmation' => ['type' => []],
1385 ];
1386 }
1387 $settingsContent = array_merge($settingsContent, $confirmation);
1388 if (!empty($integrations)) {
1389 $settingsContent = array_merge(
1390 $settingsContent,
1391 [
1392 'integrations' => $integrations,
1393 ]
1394 );
1395 } else {
1396 $settingsContent = array_merge(
1397 $settingsContent,
1398 [
1399 'integrations' => []
1400 ]
1401 );
1402 }
1403 if (!empty($mailTem)) {
1404 $settingsContent = array_merge(
1405 $settingsContent,
1406 [
1407 'mailTem' => $mailTem,
1408 ]
1409 );
1410 } else {
1411 $settingsContent = array_merge(
1412 $settingsContent,
1413 [
1414 'mailTem' => []
1415 ]
1416 );
1417 }
1418 $formSettings = [
1419 'formSettings' => $settingsContent,
1420 ];
1421 $data = [
1422 'id' => $formID,
1423 'form_name' => $formManager->getFormName(),
1424 'form_content' => $form_content_arr,
1425 'additional' => empty($form_content->additional) ? [
1426 'enabled' => [
1427 'blocked_ip' => false,
1428 'restrict_form' => false,
1429 'onePerIp' => false,
1430 ],
1431 'settings' => [
1432 'restrict_form' => [
1433 'day' => [],
1434 'date' => [
1435 'from' => null,
1436 'to' => null,
1437 ],
1438 'time' => [
1439 'from' => null,
1440 'to' => null,
1441 ],
1442 ],
1443 'entry_limit' => null,
1444 'blocked_ip' => [],
1445 ],
1446 ] : $form_content->additional,
1447 'created_at' => $formManager->getFormMetaData()['created_at'],
1448 'views' => $formManager->getFormMetaData()['views'],
1449 'entries' => $formManager->getFormMetaData()['entries'],
1450 'status' => $formManager->getFormMetaData()['status'],
1451 ];
1452 $data = array_merge($data, $formSettings);
1453 $workFlowHandler = new WorkFlowHandler($formID);
1454 $workFlows = ['workFlows' => $workFlowHandler->getAllworkFlowV1()];
1455 $data = array_merge($data, $workFlows);
1456 $reportsModel = new ReportsModel();
1457 $returnedReportData = $reportsModel->get(
1458 [
1459 'id',
1460 'details',
1461 'isDefault',
1462 'type',
1463 ],
1464 [
1465 'category' => 'form',
1466 'context' => $formID,
1467 ]
1468 );
1469
1470 if (!is_wp_error($returnedReportData)) {
1471 $fieldNames = [];
1472 foreach ($formManager->getFieldLabel() as $key => $field) {
1473 $fieldNames[$field['key']] = isset($field->lbl) ? $field->lbl : '';
1474 }
1475 if ($formManager->isGCLIDEnabled()) {
1476 $fieldNames['GCLID'] = 'GCLID';
1477 }
1478 foreach ($returnedReportData as $reportKey => $reportData) {
1479 $reportDetails = $reportsModel->validateReportFields($reportData, $fieldNames);
1480 if (!empty($reportDetails) && is_string($reportDetails)) {
1481 $returnedReportData[$reportKey]->details = json_decode($reportDetails);
1482 } elseif (!empty($reportDetails)) {
1483 $returnedReportData[$reportKey]->details = $reportDetails;
1484 } else {
1485 $returnedReportData[$reportKey]->details = [];
1486 }
1487 if ('1' === (string) $reportData->isDefault) {
1488 $returnedReportData[$reportKey]->details->report_name = __('All Entries', 'bit-form');
1489 }
1490 }
1491 $reports = ['reports' => $returnedReportData];
1492 $data = array_merge($data, $reports);
1493 }
1494
1495 $formFields = $formManager->getFieldLabel();
1496 $data = array_merge($data, ['Labels' => $formFields]);
1497
1498 return $data;
1499 }
1500 }
1501
1502 public function deleteAForm($Request, $post)
1503 {
1504 if (isset($Request['id'])) {
1505 $formID = wp_unslash($Request['id']);
1506 } else {
1507 $formID = wp_unslash($post->id);
1508 }
1509 if (is_null($formID)) {
1510 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1511 }
1512
1513 if (!filter_var($formID, FILTER_VALIDATE_INT)) {
1514 return new WP_Error('invalid_form', __('Form id is invalid.', 'bit-form'));
1515 }
1516
1517 $delete_status = static::$formModel->delete(
1518 [
1519 'id' => $formID,
1520 ]
1521 );
1522
1523 $successMessageModel = new SuccessMessageModel();
1524 $deleteMsgStatus = $successMessageModel->delete(['form_id' => $formID]);
1525
1526 $emailTemplateModel = new EmailTemplateModel();
1527 $deleteTemplateStatus = $emailTemplateModel->delete(['form_id' => $formID]);
1528
1529 $pdfTemplateModel = new PdfTemplateModel();
1530 $deletePdfTemplateStatus = $pdfTemplateModel->delete(['form_id' => $formID]);
1531
1532 $integrationModel = new IntegrationModel();
1533 $deleteIntegrationStatus = $integrationModel->delete(['form_id' => $formID]);
1534
1535 $workFlowModel = new WorkFlowModel();
1536 $deleteworkFlowStatus = $workFlowModel->delete(['form_id' => $formID]);
1537
1538 $reportsModel = new ReportsModel();
1539 $deleteReportStatus = $reportsModel->delete(['context' => $formID]);
1540
1541 $formEntryModel = new FormEntryModel();
1542 $returnedEntries = $formEntryModel->get('id', ['form_id' => $formID]);
1543 $entries = [];
1544
1545 // checked namespace exist
1546 if (class_exists('\BitCode\BitFormPro\Admin\BfTable\Table')) {
1547 \BitCode\BitFormPro\Admin\BfTable\Table::deleteTableByFormId($formID);
1548 }
1549
1550 $fileHandler = new FileHandler();
1551 if (file_exists(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID)) {
1552 $fileHandler->rmrf(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID);
1553 }
1554 if (file_exists(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID)) {
1555 $fileHandler->rmrf(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID);
1556 }
1557 $formStylePath = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles';
1558
1559 $formCssPath = $formStylePath . DIRECTORY_SEPARATOR . 'bitform-' . $formID . '.css';
1560 FileHandler::deleteIsFileExists($formCssPath);
1561
1562 $layoutCssPath = $formStylePath . DIRECTORY_SEPARATOR . 'bitform-layout-' . $formID . '.css';
1563 FileHandler::deleteIsFileExists($layoutCssPath);
1564
1565 $customCssPath = $formStylePath . DIRECTORY_SEPARATOR . 'bitform-custom-' . $formID . '.css';
1566 FileHandler::deleteIsFileExists($customCssPath);
1567
1568 $customJSPath = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-scripts' . DIRECTORY_SEPARATOR . 'bitform-custom-' . $formID . '.js';
1569 FileHandler::deleteIsFileExists($customJSPath);
1570
1571 $conversationCssPath = $formStylePath . DIRECTORY_SEPARATOR . 'bitform-conversational-' . $formID . '.css';
1572 FileHandler::deleteIsFileExists($conversationCssPath);
1573
1574 return is_wp_error($delete_status) ? $delete_status : __('Form deleted successfully.', 'bit-form');
1575 }
1576
1577 public function deleteBlukForm($Request, $post)
1578 {
1579 if (isset($Request['formID'])) {
1580 $formID = wp_unslash($Request['formID']);
1581 } else {
1582 $formID = wp_unslash($post->formID);
1583 }
1584
1585 if (is_null($formID) || !is_array($formID)) {
1586 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1587 }
1588
1589 if (!Helpers::checkIsIntArr($formID)) {
1590 return new WP_Error('invalid_form', __('Form id is invalid', 'bit-form'));
1591 }
1592
1593 $cssPath = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles' . DIRECTORY_SEPARATOR;
1594 foreach ($formID as $id) {
1595 $formCssPath = $cssPath . 'bitform-' . $id . '.css';
1596 FileHandler::deleteIsFileExists($formCssPath);
1597
1598 $layoutPath = $cssPath . 'bitform-layout-' . $id . '.css';
1599 FileHandler::deleteIsFileExists($layoutPath);
1600
1601 $bitformCustomPath = $cssPath . 'bitform-' . $id . '-formid' . '.css';
1602 FileHandler::deleteIsFileExists($bitformCustomPath);
1603 }
1604 $delete_status = static::$formModel->bulkDelete(
1605 [
1606 'id' => $formID,
1607 ]
1608 );
1609
1610 if (is_wp_error($delete_status)) {
1611 wp_send_json_error($delete_status->get_error_message(), 400);
1612 }
1613
1614 $successMessageModel
1615 = new SuccessMessageModel();
1616 $deleteMsgStatus = $successMessageModel->bulkDelete(['form_id' => $formID]);
1617
1618 $emailTemplateModel = new EmailTemplateModel();
1619 $deleteTemplateStatus = $emailTemplateModel->bulkDelete(['form_id' => $formID]);
1620
1621 $pdfTemplateModel = new PdfTemplateModel();
1622 $deletePdfTemplateStatus = $pdfTemplateModel->bulkDelete(['form_id' => $formID]);
1623
1624 $integrationModel = new IntegrationModel();
1625 $deleteIntegrationStatus = $integrationModel->bulkDelete(['form_id' => $formID]);
1626
1627 $workFlowModel = new WorkFlowModel();
1628 $deleteworkFlowStatus = $workFlowModel->bulkDelete(['form_id' => $formID]);
1629
1630 $reportsModel = new ReportsModel();
1631 $deleteReportStatus = $reportsModel->bulkDelete(['context' => $formID]);
1632
1633 $formEntryModel = new FormEntryModel();
1634 $returnedEntries = $formEntryModel->get('id', ['form_id' => $formID]);
1635
1636 if (class_exists('\BitCode\BitFormPro\Admin\BfTable\Table')) {
1637 \BitCode\BitFormPro\Admin\BfTable\Table::deleteTableByBulkFormId($formID);
1638 }
1639
1640 $entries = [];
1641 foreach ($returnedEntries as $entryKey => $entryInfo) {
1642 if (!empty($entryInfo->id)) {
1643 $entries[] = $entryInfo->id;
1644 }
1645 }
1646 global $wpdb;
1647 $prefix = $wpdb->prefix;
1648 if (count($entries) > 0) {
1649 $deleteEntriesStatus = $formEntryModel->bulkDelete(
1650 [
1651 "`{$prefix}bitforms_form_entries`.`id`" => $entries,
1652 "`{$prefix}bitforms_form_entries`.`form_id`" => $formID,
1653 ]
1654 );
1655 }
1656
1657 // delete entry log and details;
1658 $wpdb->query($wpdb->prepare(
1659 "DELETE em, e FROM `{$prefix}bitforms_form_log_details` AS em JOIN `{$prefix}bitforms_form_entry_log` AS e ON em.log_id = e.id WHERE e.form_id = %d",
1660 $formID
1661 ));
1662
1663 $fileHandler = new FileHandler();
1664 foreach ($formID as $fId) {
1665 if (file_exists(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $fId)) {
1666 $fileHandler->rmrf(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $fId);
1667 }
1668 }
1669
1670 return is_wp_error($delete_status) ? $delete_status : __('Forms deleted successfully.', 'bit-form');
1671 }
1672
1673 public function genarateNewLayoutNField($layout, $fields, $oldId, $newId)
1674 {
1675 $newField = (object) [];
1676 foreach ($layout->lg as $ind => $itm) {
1677 $fld_tmp = $fields->{$layout->lg[$ind]->i};
1678 $layout->lg[$ind]->i = str_replace("bf$oldId-", "bf$newId-", $layout->lg[$ind]->i);
1679 $layout->md[$ind]->i = str_replace("bf$oldId-", "bf$newId-", $layout->md[$ind]->i);
1680 $layout->sm[$ind]->i = str_replace("bf$oldId-", "bf$newId-", $layout->sm[$ind]->i);
1681 $newField->{$layout->lg[$ind]->i} = $fld_tmp;
1682 }
1683 return ['layout' => $layout, 'fields' => $newField];
1684 }
1685
1686 public function duplicateAForm($Request, $post)
1687 {
1688 $oldFormId = intval($post->id);
1689 $newFormId = intval($post->newFormId);
1690 if ($oldFormId < 1) {
1691 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1692 }
1693
1694 $formManager = new AdminFormManager($oldFormId);
1695 if (!$formManager->isExist()) {
1696 return new WP_Error('empty_form', __('Form does not exists.', 'bit-form'));
1697 }
1698
1699 $duplicatedForm = $this->getAForm($Request, $post);
1700 $duplicatedForm['form_name'] = 'Duplicate of ' . $duplicatedForm['form_name'];
1701 $formData = FormDuplicateHelper::createReplica($duplicatedForm, $oldFormId, $newFormId);
1702
1703 /* echo wp_json_encode($formData);
1704 \wp_die(); */
1705 $duplicateResponse = $this->createNewForm(null, $formData);
1706
1707 if (!is_wp_error($duplicateResponse) || (is_wp_error($duplicateResponse) && 'result_empty' === $duplicateResponse->get_error_code())) {
1708 // duplicate stylesheet
1709 $style_dir = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles' . DIRECTORY_SEPARATOR;
1710 // layout style copy
1711 $styleStr = FileHandler::readFile($style_dir . 'bitform-layout-' . $oldFormId . '.css');
1712 $newStyle = str_replace(".bf$oldFormId-", ".bf$newFormId-", $styleStr);
1713 FileHandler::writeFile($style_dir . "bitform-layout-$newFormId.css", $newStyle);
1714 // style copy
1715 $styleStr = FileHandler::readFile($style_dir . 'bitform-' . $oldFormId . '.css');
1716 $newStyle = str_replace("-$oldFormId", "-$newFormId", $styleStr);
1717 FileHandler::writeFile($style_dir . "bitform-$newFormId.css", $newStyle);
1718 $duplicatedForm = $this->getAForm(null, (object) ['id' => $newFormId]);
1719 $duplicatedForm['message'] = __('Form duplicated successfully', 'bit-form');
1720 return $duplicatedForm;
1721 }
1722 return $duplicateResponse;
1723 }
1724
1725 public function importAForm($post)
1726 {
1727 $oldFormId = !empty($post->formDetail->form_id) ? $post->formDetail->form_id : null;
1728 $newFormId = intval($post->newFormId);
1729 if (!$oldFormId || empty($post->formDetail->fields) || empty($post->formDetail->layout)) {
1730 return new WP_Error('invalid_form', __('Please import a valid json.', 'bit-form'));
1731 }
1732 $importtedForm = (array) $post->formDetail;
1733 $importtedForm['form_content']['fields'] = $importtedForm['fields'];
1734 $importtedForm['form_content']['layout'] = $importtedForm['layout'];
1735 $importtedForm['form_content']['nestedLayout'] = $importtedForm['nestedLayouts'];
1736 $importtedForm['form_content']['formInfo'] = $importtedForm['formInfo'];
1737 unset($importtedForm['fields'], $importtedForm['layout'], $importtedForm['nestedLayout'], $importtedForm['formInfo']);
1738 $formData = FormDuplicateHelper::createReplica((array) $importtedForm, $oldFormId, $newFormId);
1739
1740 if (!empty($importtedForm['rowHeight'])) {
1741 $formData->rowHeight = $importtedForm['rowHeight'];
1742 }
1743
1744 if (!empty($importtedForm['formStyle'])) {
1745 $formData->formStyle = str_replace("-$oldFormId", "-$newFormId", $importtedForm['formStyle']);
1746 $formData->layoutChanged = '-';
1747 }
1748 $importResponse = $this->createNewForm(null, $formData);
1749
1750 $customCode = [];
1751 // add custom js
1752 if (!empty($formData->customCode->customJs)) {
1753 $customJsPath = 'form-scripts';
1754 $fileName = 'bitform-custom-' . $newFormId . '.js';
1755 $customCode['JavaScript'] = $formData->customCode->customJs;
1756 Helpers::saveFile($customJsPath, $fileName, $formData->customCode->customJs, 'w');
1757 }
1758 // add custom css
1759 if (!empty($formData->customCode->customCss)) {
1760 $customCssPath = 'form-styles';
1761 $fileName = 'bitform-custom-' . $newFormId . '.css';
1762 $customCode['CSS'] = $formData->customCode->customCss;
1763 Helpers::saveFile($customCssPath, $fileName, $formData->customCode->customCss, 'w');
1764 }
1765 if (!is_wp_error($importResponse)) {
1766 $importResponse['customCode'] = $customCode;
1767 }
1768 if (!is_wp_error($importResponse) || (is_wp_error($importResponse) && 'result_empty' === $importResponse->get_error_code())) {
1769 $responseData = $this->getAForm(null, (object) ['id' => $newFormId]);
1770 $responseData['customCode'] = $customCode;
1771 $responseData['message'] = __('Form imported successfully.', 'bit-form');
1772 return $responseData;
1773 }
1774 return $importResponse;
1775 }
1776
1777 // public function exportAForm($Request) {
1778 // $oldFormId = intval($Request['id']);
1779 // if ($oldFormId < 1) {
1780 // return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1781 // }
1782 // $formManager = new AdminFormManager($oldFormId);
1783 // if (!$formManager->isExist()) {
1784 // return new WP_Error('empty_form', __('Form does not exists.', 'bit-form'));
1785 // }
1786
1787 // $newFormId = $oldFormId;
1788 // $duplicatedForm = $this->getAForm($Request, (object)['id' => $oldFormId]);
1789 // $formData = FormDuplicateHelper::createReplica($duplicatedForm, $oldFormId, $newFormId);
1790
1791 // $style_dir = BITFORMS_CONTENT_DIR . DIRECTORY_SEPARATOR . 'form-styles' . DIRECTORY_SEPARATOR;
1792 // $mainFormStyle = fopen($style_dir . 'bitform-' . $oldFormId . '.css', 'r');
1793 // $styleStr = fread($mainFormStyle, filesize($style_dir . 'bitform-' . $oldFormId . '.css'));
1794
1795 // $formData->formStyle = str_replace("-$oldFormId", "-$newFormId", $styleStr);
1796 // $formData->layoutChanged = '-';
1797 // $formData->rowHeight = FormDuplicateHelper::calcRowHeight($styleStr, $oldFormId);
1798
1799 // $formJson = wp_json_encode($formData);
1800 // header('Content-Type: application/force-download');
1801 // header('Content-Type: application/octet-stream');
1802 // header('Content-Type: application/download');
1803 // header('Content-Disposition: attachment; filename="bitform_export_' . $oldFormId . '.json"');
1804 // header('Content-Description: File Transfer');
1805 // header('Expires: 0');
1806 // header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
1807 // header('Pragma: public');
1808 // header('Content-Length: ' . strlen($formJson));
1809 // header('Content-Transfer-Encoding: binary ');
1810 // flush();
1811 // echo $formJson;
1812 // die();
1813 // }
1814
1815 public function exportAForm($Request, $post)
1816 {
1817 $oldFormId = intval($post->id);
1818 if ($oldFormId < 1) {
1819 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1820 }
1821 $formManager = new AdminFormManager($oldFormId);
1822 if (!$formManager->isExist()) {
1823 return new WP_Error('empty_form', __('Form does not exists.', 'bit-form'));
1824 }
1825
1826 $newFormId = $oldFormId;
1827 $duplicatedForm = $this->getAForm($Request, (object) ['id' => $oldFormId]);
1828 $formData = FormDuplicateHelper::createReplica($duplicatedForm, $oldFormId, $newFormId);
1829 // for custom css
1830 $customCssPath = 'form-styles/bitform-custom-' . $newFormId . '.css';
1831 $cssPath = Helpers::generatePathDirOrFile($customCssPath);
1832 $customCssContain = Helpers::fileRead($cssPath);
1833 $formData->customCode = [];
1834 if ('' !== $customCssContain) {
1835 $formData->customCode['customCss'] = $customCssContain;
1836 }
1837 // for custom js
1838 $customJsPath = 'form-scripts/bitform-custom-' . $newFormId . '.js';
1839 $jsPath = Helpers::generatePathDirOrFile($customJsPath);
1840 $customJsContain = Helpers::fileRead($jsPath);
1841 if ('' !== $customJsContain) {
1842 $formData->customCode['customJs'] = $customJsContain;
1843 }
1844 return $formData;
1845 }
1846
1847 public function getFormEntryLabelAndCount($Request, $post)
1848 {
1849 if (isset($Request['id'])) {
1850 $id = wp_unslash($Request['id']);
1851 } else {
1852 $id = wp_unslash($post->id);
1853 }
1854 if (is_null($id)) {
1855 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1856 }
1857 $formManager = new AdminFormManager($id);
1858 if (!$formManager->isExist()) {
1859 return new WP_Error('empty_form', __('Form does not exists.', 'bit-form'));
1860 }
1861 $formFields = $formManager->getFieldLabel();
1862 $formEntry = new FormEntryModel();
1863 $count = $formEntry->count(
1864 [
1865 'form_id' => $id,
1866 ]
1867 );
1868 $reportsModel = new ReportsModel();
1869 $returnedReportData = $reportsModel->get(
1870 [
1871 'id',
1872 'details',
1873 'isDefault',
1874 'type',
1875 ],
1876 [
1877 'category' => 'form',
1878 'context' => $id,
1879 ]
1880 );
1881 $labels = [];
1882 if (!is_wp_error($returnedReportData)) {
1883 $fieldNames = [];
1884 foreach ($formFields as $field) {
1885 $fieldNames[$field['key']] = $field['name'];
1886 $labels[$field['key']] = $field;
1887 }
1888 foreach ($returnedReportData as $reportKey => $reportData) {
1889 $reportDetails = $reportsModel->validateReportFields($reportData, $fieldNames);
1890 if (!empty($reportDetails) && is_string($reportDetails)) {
1891 $returnedReportData[$reportKey]->details = json_decode($reportDetails);
1892 } elseif (!empty($reportDetails)) {
1893 $returnedReportData[$reportKey]->details = $reportDetails;
1894 }
1895 }
1896 $response['reports'] = empty($returnedReportData) ? [] : $returnedReportData;
1897 }
1898
1899 $response['count'] = intval($count[0]->count);
1900 $response['Labels'] = $formFields;
1901 $response['fieldDetails'] = $labels;
1902 return $response;
1903 }
1904
1905 public function getFormEntry($Request, $post)
1906 {
1907 if (isset($Request['id'])) {
1908 $id = wp_unslash($Request['id']);
1909 $offset = isset($Request['offset']) ?
1910 wp_unslash($Request['offset']) : 0;
1911 $pageSize = isset($Request['pageSize']) ?
1912 wp_unslash($Request['pageSize']) : 10;
1913 $queryCondition = isset($Request['queryCondition']) ? wp_unslash($Request['queryCondition']) : ['form_id' => $id];
1914 } else {
1915 $id = wp_unslash($post->id);
1916 $conditions = isset($post->conditions) ? wp_unslash($post->conditions) : [];
1917 $dateBetweenFilter = isset($post->entriesFilterByDate) ? wp_unslash($post->entriesFilterByDate) : [];
1918 $offset = isset($post->offset) ? wp_unslash($post->offset) : 0;
1919 $sortBy = isset($post->sortBy) ? wp_unslash($post->sortBy) : null;
1920 $filters = isset($post->filters) ? wp_unslash($post->filters) : null;
1921 $globalFilter = isset($post->globalFilter) ? wp_unslash($post->globalFilter) : null;
1922 $pageSize = isset($post->pageSize) ?
1923 wp_unslash($post->pageSize) : 10;
1924 $queryCondition = isset($post->queryCondition) ? wp_unslash($post->queryCondition) : ['form_id' => $id];
1925 }
1926 if (is_null($id)) {
1927 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
1928 }
1929 $formManager = new AdminFormManager($id);
1930 if (!$formManager->isExist()) {
1931 return new WP_Error('empty_form', __('Form does not exists', 'bit-form'));
1932 }
1933 $formEntry = new FormEntryModel();
1934 $entries = $formEntry->get(
1935 'id',
1936 $queryCondition,
1937 null,
1938 null,
1939 'created_at',
1940 'DESC'
1941 );
1942 if (is_wp_error($entries)) {
1943 if ('result_empty' === $entries->get_error_code()) {
1944 return [
1945 'count' => 0,
1946 'entries' => [],
1947 ];
1948 }
1949 return $entries;
1950 }
1951 $filter['field'] = $filters;
1952 $filter['global'] = $globalFilter;
1953
1954 $formFields = $formManager->getFieldLabel(true);
1955 $fieldDetails = $formManager->getFields();
1956
1957 $entryMeta = new FormEntryMetaModel();
1958 $formEntries = $entryMeta->getEntryMeta($formFields, $entries, $pageSize, $offset, $filter, $sortBy, $conditions, $dateBetweenFilter);
1959 $customFieldHandler = new CustomFieldHandler();
1960 $formEntries = $customFieldHandler->updatedEntries($formEntries, $fieldDetails);
1961 return $formEntries;
1962 }
1963
1964 public function getSingleEntry($formId, $entryId)
1965 {
1966 $formManager = new AdminFormManager($formId);
1967 if (!$formManager->isExist()) {
1968 return new WP_Error('empty_form', __('Form does not exists', 'bit-form'));
1969 }
1970
1971 $formFields = $formManager->getFieldLabel(true);
1972 $fieldDetails = $formManager->getFields();
1973 $entryMeta = new FormEntryMetaModel();
1974 // $formEntry = new FormEntryModel();
1975
1976 $entries = $entryMeta->getSingleEntryMeta($formFields, $entryId);
1977
1978 if (!is_wp_error($entries)) {
1979 return $entries[0];
1980 }
1981 return new WP_Error('entry_not_fonud', __('Entry Not Found!', 'bit-form'));
1982
1983 // $customFieldHandler = new CustomFieldHandler();
1984 // $formEntries = $customFieldHandler->updatedEntries($formEntries, $fieldDetails);
1985 // return $formEntries;
1986 }
1987
1988 public function getEntriesForReport($Request, $post)
1989 {
1990 if (isset($Request['id'])) {
1991 $id = wp_unslash($Request['id']);
1992 $offset = isset($Request['offset']) ?
1993 wp_unslash($Request['offset']) : null;
1994 $pageSize = isset($Request['pageSize']) ?
1995 wp_unslash($Request['pageSize']) : null;
1996 } else {
1997 $id = wp_unslash($post->id);
1998 $conditions = isset($post->conditions) ? wp_unslash($post->conditions) : [];
1999 $dateBetweenFilter = isset($post->entriesFilterByDate) ? wp_unslash($post->entriesFilterByDate) : [];
2000 $offset = isset($post->offset) ? wp_unslash($post->offset) : null;
2001 $sortBy = isset($post->sortBy) ? wp_unslash($post->sortBy) : null;
2002 $filters = isset($post->filters) ? wp_unslash($post->filters) : null;
2003 $globalFilter = isset($post->globalFilter) ? wp_unslash($post->globalFilter) : null;
2004 $pageSize = isset($post->pageSize) ?
2005 wp_unslash($post->pageSize) : null;
2006 }
2007 if (is_null($id)) {
2008 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
2009 }
2010 $formManager = new AdminFormManager($id);
2011 if (!$formManager->isExist()) {
2012 return new WP_Error('empty_form', __('Form does not exists', 'bit-form'));
2013 }
2014
2015 $formEntry = new FormEntryModel();
2016 $entries = $formEntry->get(
2017 'id',
2018 [
2019 'form_id' => $id,
2020 ],
2021 null,
2022 null,
2023 'created_at',
2024 'DESC'
2025 );
2026 if (is_wp_error($entries)) {
2027 if ('result_empty' === $entries->get_error_code()) {
2028 return [
2029 'count' => 0,
2030 'entries' => [],
2031 ];
2032 }
2033 return $entries;
2034 }
2035 $filter['field'] = $filters;
2036 $filter['global'] = $globalFilter;
2037
2038 $formFields = $formManager->getFieldLabel(true);
2039 $fieldDetails = $formManager->getFields();
2040
2041 $entryMeta = new FormEntryMetaModel();
2042 $formEntries = $entryMeta->getEntryMeta($formFields, $entries, $pageSize, $offset, $filter, $sortBy, $conditions, $dateBetweenFilter);
2043 $customFieldHandler = new CustomFieldHandler();
2044 $formEntries = $customFieldHandler->updatedEntries($formEntries, $fieldDetails);
2045 $formEntries['entries'] = Helpers::filterNullEntries($formEntries['entries']);
2046 return $formEntries;
2047 }
2048
2049 public function getExportEntry($post)
2050 {
2051 $formId = wp_unslash($post->formId);
2052 $fileFormate = isset($post->fileFormate) ? wp_unslash($post->fileFormate) : null;
2053 $limit = isset($post->limit) ? wp_unslash($post->limit) : null;
2054 $entryCondition = isset($post->filter) ? wp_unslash($post->filter) : null;
2055 $sortBy = isset($post->sort) ? wp_unslash($post->sort) : 'ASC';
2056 $sortByField = isset($post->sortField) ? wp_unslash($post->sortField) : 'bitforms_form_entry_id';
2057 $formFields = json_decode($post->selectedField);
2058 if (is_null($formId)) {
2059 return new WP_Error('empty_form', __('Form id is empty.', 'bit-form'));
2060 }
2061 $formManager = new AdminFormManager($formId);
2062 $fieldLabels = $formManager->getFieldLabel(true);
2063 if (!$formManager->isExist()) {
2064 return new WP_Error('empty_form', __('Form does not exists', 'bit-form'));
2065 }
2066
2067 $formEntry = new FormEntryModel();
2068 $entries = $formEntry->get(
2069 'id',
2070 [
2071 'form_id' => $formId,
2072 ],
2073 null,
2074 null,
2075 'created_at',
2076 'DESC'
2077 );
2078 if (is_wp_error($entries)) {
2079 if ('result_empty' === $entries->get_error_code()) {
2080 return [
2081 'count' => 0,
2082 'entries' => [],
2083 ];
2084 }
2085 return $entries;
2086 }
2087 $entryMeta = new FormEntryMetaModel();
2088 $filter = [];
2089 $formEntries = $entryMeta->getExportEntry($formFields, $entries, $formId, $fieldLabels, $limit, $sortBy, $sortByField, $offset, $entryCondition);
2090 return $formEntries;
2091 }
2092
2093 public function deleteBlukFormEntries($Request, $post)
2094 {
2095 if (isset($Request['formID'])) {
2096 $formID = wp_unslash($Request['formID']);
2097 $entries = wp_unslash($Request['entries']);
2098 } else {
2099 $formID = wp_unslash($post->formID);
2100 $entries = wp_unslash($post->entries);
2101 }
2102 if (is_null($formID) || !is_array($entries) || 0 === count($entries)) {
2103 return new WP_Error('empty_form', __('Invalid Form ID or Entries ID.', 'bit-form'));
2104 }
2105
2106 if (!filter_var($formID, FILTER_VALIDATE_INT)) {
2107 return new WP_Error('invalid_form', __('Form id is invalid.', 'bit-form'));
2108 }
2109
2110 if (!Helpers::checkIsIntArr($entries)) {
2111 return new WP_Error('invalid_entries', __('Entries id is invalid', 'bit-form'));
2112 }
2113
2114 $formManager = new AdminFormManager($formID);
2115 if (!$formManager->isExist()) {
2116 return new WP_Error('empty_form', __('Form does not exist.', 'bit-form'));
2117 }
2118 $workFlowRunHelper = new WorkFlow($formID);
2119
2120 $workFlowreturnedOnDelete = $workFlowRunHelper->executeOnDelete(
2121 $formManager,
2122 $formID,
2123 $entries
2124 );
2125
2126 if (isset($workFlowreturnedOnDelete['entries'])) {
2127 if (0 === count($workFlowreturnedOnDelete['entries'])) {
2128 return ['message' => __('Entry Deletetion prevented by workflow', 'bit-form')];
2129 } elseif (count($workFlowreturnedOnDelete['entries']) === count($entries)) {
2130 $message = __('Entry Deleted successfully', 'bit-form');
2131 } else {
2132 $result['prevented'] = array_diff($entries, $workFlowreturnedOnDelete['entries']);
2133 $entries = $workFlowreturnedOnDelete['entries'];
2134 $message = __('Entry Deleted successfully, Some prevented by workflow', 'bit-form');
2135 }
2136 } else {
2137 $message = __('Entry Deleted successfully', 'bit-form');
2138 }
2139 global $wpdb;
2140 $prefix = $wpdb->prefix;
2141 $formEntryModel = new FormEntryModel();
2142 $delete_status = $formEntryModel->bulkDelete(
2143 [
2144 "`{$prefix}bitforms_form_entries`.`id`" => $entries,
2145 "`{$prefix}bitforms_form_entries`.`form_id`" => $formID,
2146 ]
2147 );
2148 if (file_exists(BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID)) {
2149 $fileHandler = new FileHandler();
2150 foreach ($entries as $enrtyKey => $entryID) {
2151 $fileEntries = $fileHandler->getEntriesFileUploadDir($formID, $entryID);
2152 if (file_exists($fileEntries)) {
2153 $fileHandler->rmrf($fileEntries);
2154 }
2155 }
2156 }
2157 $count = $formEntryModel->count(
2158 [
2159 'form_id' => $formID,
2160 ]
2161 );
2162 $formManager->resetSubmissionCount(intval($count[0]->count));
2163 if (is_wp_error($delete_status)) {
2164 return new WP_Error('entry_not_exists', __('Form entry deletion failed.', 'bit-form'));
2165 }
2166 $result['message'] = $message;
2167 return $result;
2168 }
2169
2170 public function duplicateFormEntry($Request, $post)
2171 {
2172 if (isset($Request['formID'])) {
2173 $formID = wp_unslash($Request['formID']);
2174 $entries = wp_unslash($Request['entries']);
2175 } else {
2176 $formID = wp_unslash($post->formID);
2177 $entries = wp_unslash($post->entries);
2178 }
2179 if (is_null($formID) || !is_array($entries) || empty($entries)) {
2180 return new WP_Error('empty_form', __('Form id or entries id is invalid', 'bit-form'));
2181 }
2182
2183 if (!filter_var($formID, FILTER_VALIDATE_INT)) {
2184 return new WP_Error('invalid_form', __('Form id is invalid', 'bit-form'));
2185 }
2186
2187 if (!Helpers::checkIsIntArr($entries)) {
2188 return new WP_Error('invalid_entries', __('Entries id is invalid', 'bit-form'));
2189 }
2190
2191 $formManager = new AdminFormManager($formID);
2192 if (!$formManager->isExist()) {
2193 return new WP_Error('empty_form', __('Form does not exist', 'bit-form'));
2194 }
2195 $formEntryModel = new FormEntryModel();
2196 $entryMeta = new FormEntryMetaModel();
2197 $user_details = static::$ipTool->getUserDetail();
2198 $total_entries = count($entries);
2199 $duplicate_count = 0;
2200 $test = '';
2201 $fileHandler = new FileHandler();
2202 $result = [];
2203 foreach ($entries as $entryIndex => $entryID) {
2204 $duplicatedEntryId = $formEntryModel->insert(
2205 [
2206 'form_id' => $formID,
2207 'user_id' => $user_details['id'],
2208 'user_ip' => $user_details['ip'],
2209 'user_device' => $user_details['device'],
2210 'referer' => 'duplicate of #' . $entryID,
2211 'status' => 1,
2212 'created_at' => $user_details['time'],
2213 ]
2214 );
2215 if ($duplicatedEntryId) {
2216 $duplicate_status = $entryMeta->duplicateEntryMeta(
2217 [
2218 'duplicateID' => $duplicatedEntryId,
2219 'entryID' => $entryID,
2220 ]
2221 );
2222 if ($duplicate_status) {
2223 $result['details'][$entryID] = $duplicatedEntryId;
2224 $duplicate_count = $duplicate_count + 1;
2225 if (file_exists(FileHandler::getEntriesFileUploadDir($formID, $entryID))) {
2226 $fileHandler->cpyr(
2227 FileHandler::getEntriesFileUploadDir($formID, $entryID),
2228 FileHandler::getEntriesFileUploadDir($formID, $duplicatedEntryId)
2229 );
2230 }
2231 }
2232 }
2233 }
2234
2235 $count = $formEntryModel->count(
2236 [
2237 'form_id' => $formID,
2238 ]
2239 );
2240 $formManager->resetSubmissionCount(intval($count[0]->count));
2241 $result['message'] = 1 === count($entries) ? __('Entry Duplicated successfully', 'bit-form') : __('Entries Duplicated successfully', 'bit-form');
2242 return ($total_entries === $duplicate_count) ? $result : false;
2243 }
2244
2245 public function editFormEntry($Request, $post)
2246 {
2247 if (isset($Request['formID'])) {
2248 $formID = wp_unslash($Request['formID']);
2249 $entryID = wp_unslash($Request['entryID']);
2250 } else {
2251 $formID = wp_unslash($post->formID);
2252 $entryID = wp_unslash($post->entryID);
2253 }
2254 if (is_null($formID) || is_null($entryID)) {
2255 return new WP_Error('empty_form', __('Form id or entries id is invalid', 'bit-form'));
2256 }
2257
2258 $formManager = new AdminFormManager($formID);
2259 if (!$formManager->isExist()) {
2260 return new WP_Error('empty_form', __('Form does not exist', 'bit-form'));
2261 }
2262 $formEntryModel = new FormEntryModel();
2263 $entryMeta = new FormEntryMetaModel();
2264
2265 $formEntry = $formEntryModel->get(
2266 '*',
2267 [
2268 'form_id' => $formID,
2269 'id' => $entryID,
2270 ]
2271 );
2272
2273 if (!$formEntry) {
2274 return new WP_Error('empty_form', __('Form entries does not exist.', 'bit-form'));
2275 }
2276 $formEntryMeta = $entryMeta->get(
2277 [
2278 'meta_key',
2279 'meta_value',
2280 ],
2281 [
2282 'bitforms_form_entry_id' => $entryID,
2283 ]
2284 );
2285 $entries = [];
2286 foreach ($formEntryMeta as $key => $value) {
2287 $entries[$value->meta_key] = $value->meta_value;
2288 }
2289 $formContent = $formManager->getFormContent();
2290 $fieldsKey = $formManager->getFieldsKey();
2291 $form_fields = $formContent->fields;
2292 $layout = $formContent->layout;
2293 foreach ($form_fields as $key => $value) {
2294 // $field_name = preg_replace('/[\`\~\!\@\#\$\'\.\s\?\+\-\*\&\|\/\\!]/', '_', $value->lbl);
2295 if (isset($entries[$key])) {
2296 $form_fields->{$key}->val = $entries[$key];
2297 $form_fields->{$key}->name = $key;
2298 }
2299 }
2300 $workFlowRunHelper = new WorkFlow($formID);
2301 $workFlowreturnedOnLoad = $workFlowRunHelper->executeOnLoad(
2302 'edit',
2303 $form_fields
2304 );
2305 $workFlowreturnedOnUserInput = $workFlowRunHelper->executeOnUserInput(
2306 'edit',
2307 $form_fields
2308 );
2309 if (!empty($workFlowreturnedOnLoad['fields'])) {
2310 $form_fields = $workFlowreturnedOnLoad['fields'];
2311 }
2312 $formData = [
2313 'layout' => $layout,
2314 'fields' => $form_fields,
2315 'conditional' => !empty($workFlowreturnedOnUserInput['conditional']) ? $workFlowreturnedOnUserInput['conditional'] : false,
2316 'fieldToCheck' => !empty($workFlowreturnedOnUserInput['fieldToCheck']) ? $workFlowreturnedOnUserInput['fieldToCheck'] : false,
2317 'fieldToChange' => !empty($workFlowreturnedOnUserInput['fieldToChange']) ? $workFlowreturnedOnUserInput['fieldToChange'] : false,
2318 'fieldsKey' => $fieldsKey,
2319 ];
2320 return $formData;
2321 }
2322
2323 public function updateFormEntry($Request, $post)
2324 {
2325 if (isset($Request['formID'], $Request['entryID'])) {
2326 $formID = wp_unslash($Request['formID']);
2327 $entryID = wp_unslash($Request['entryID']);
2328 unset($Request['action'], $Request['formID'], $Request['entryID']);
2329 }
2330 $formManager = new AdminFormManager($formID);
2331 $formManager->fieldNameReplaceOfPost();
2332 // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce verified in AdminAjax.php before calling this method.
2333 $updatedValue = wp_unslash($_POST);
2334
2335 if (is_null($updatedValue) || !is_array($updatedValue)) {
2336 return new WP_Error('empty_data', __('Failed to update, Data is empty.', 'bit-form'));
2337 }
2338
2339 if (is_null($formID) || is_null($entryID)) {
2340 return new WP_Error('empty_data', __('Invalid Form ID or entries ID.', 'bit-form'));
2341 }
2342
2343 if (!$formManager->isExist()) {
2344 return new WP_Error('empty_data', __('Form does not exist.', 'bit-form'));
2345 }
2346 return $formManager->updateFormEntry($updatedValue, $formID, $entryID);
2347 }
2348
2349 public function getLogHistory($Request, $post)
2350 {
2351 if (isset($Request['formID'])) {
2352 $formID = wp_unslash($Request['formID']);
2353 $entryID = wp_unslash($Request['entryID']);
2354 } else {
2355 $formID = wp_unslash($post->formID);
2356 $entryID = wp_unslash($post->entryID);
2357 }
2358
2359 if (is_null($formID) || is_null($entryID)) {
2360 return new WP_Error('empty_form', __('Invalid Form ID or Entries ID.', 'bit-form'));
2361 }
2362
2363 $formManager = new AdminFormManager($formID);
2364 if (!$formManager->isExist()) {
2365 return new WP_Error('empty_form', __('Form does not exist.', 'bit-form'));
2366 }
2367 $formLogModel = new FormEntryLogModel();
2368
2369 $log_history = $formLogModel->geLogHistory($formID, $entryID);
2370 return $log_history;
2371 }
2372
2373 public function importDataStore($Request, $post)
2374 {
2375 if (isset($Request['formID'])) {
2376 $formID = wp_unslash($Request['formID']);
2377 } else {
2378 $formID = wp_unslash($post->formID);
2379 }
2380 if (is_null($formID)) {
2381 return new WP_Error('empty_form', __('Invalid Form id or entries id.', 'bit-form'));
2382 }
2383 }
2384
2385 public function getAllWPPages($Request, $post)
2386 {
2387 $pages = get_pages(['post_status' => 'publish', 'sort_column' => 'post_date', 'sort_order' => 'desc']);
2388 $allPages = [];
2389 foreach ($pages as $pageKey => $pageDetails) {
2390 // $allPages[$pageKey]['title'] = $pageDetails->post_title;
2391 // $allPages[$pageKey]['url'] = get_page_link($pageDetails->ID);
2392 $allPages[] = (object) [
2393 'title' => $pageDetails->post_title,
2394 'url' => get_page_link($pageDetails->ID)
2395 ];
2396 }
2397 return $allPages;
2398 }
2399
2400 public function deleteAIntegration($Request, $post)
2401 {
2402 if (isset($Request['formID']) && $Request['id']) {
2403 $formID = json_decode(wp_unslash($Request['formID']));
2404 $id = wp_unslash($Request['id']);
2405 } else {
2406 $formID = wp_unslash($post->formID);
2407 $id = wp_unslash($post->id);
2408 }
2409 if ($formID < 0 || empty($id)) {
2410 return new WP_Error('empty_form', 'Invalid Form ID or Integration ID.');
2411 }
2412
2413 $integrationHandler = new IntegrationHandler($formID);
2414 $delete_status = $integrationHandler->deleteIntegration($id);
2415 if (is_wp_error($delete_status)) {
2416 return $delete_status;
2417 }
2418
2419 return [
2420 'message' => __('Integration deleted', 'bit-form'),
2421 ];
2422 }
2423
2424 public function deleteSuccessMessage($Request, $post)
2425 {
2426 if (isset($Request['formID']) && $Request['id']) {
2427 $formID = json_decode(wp_unslash($Request['formID']));
2428 $id = wp_unslash($Request['id']);
2429 } else {
2430 $formID = wp_unslash($post->formID);
2431 $id = wp_unslash($post->id);
2432 }
2433 if (empty($formID) || empty($id)) {
2434 return new WP_Error('empty_form', 'Invalid Form ID or Message ID.');
2435 }
2436 $successMessageHandler
2437 = new SuccessMessageHandler($formID);
2438 $delete_status = $successMessageHandler->deleteMessage($id);
2439 if (is_wp_error($delete_status)) {
2440 return $delete_status;
2441 }
2442 return [
2443 'message' => __('Message deleted', 'bit-form'),
2444 ];
2445 }
2446
2447 public function deleteAWorkflow($Request, $post)
2448 {
2449 if (isset($Request['formID']) && $Request['id']) {
2450 $formID = json_decode(wp_unslash($Request['formID']));
2451 $id = wp_unslash($Request['id']);
2452 } else {
2453 $formID = wp_unslash($post->formID);
2454 $id = wp_unslash($post->id);
2455 }
2456 if (empty($formID) || empty($id)) {
2457 return new WP_Error('empty_form', 'Invalid Form ID or Workflow ID.');
2458 }
2459 $workFlowHandler = new WorkFlowHandler($formID);
2460 $delete_status = $workFlowHandler->deleteworkFlow($id);
2461 if (is_wp_error($delete_status)) {
2462 return $delete_status;
2463 }
2464 return [
2465 'message' => __('workflow deleted', 'bit-form'),
2466 ];
2467 }
2468
2469 public function deleteAMailTemplate($Request, $post)
2470 {
2471 if (isset($Request['formID']) && $Request['id']) {
2472 $formID = json_decode(wp_unslash($Request['formID']));
2473 $id = wp_unslash($Request['id']);
2474 } else {
2475 $formID = wp_unslash($post->formID);
2476 $id = wp_unslash($post->id);
2477 }
2478 if (empty($formID) || empty($id)) {
2479 return new WP_Error('empty_form', 'Invalid Form ID or Email Template ID.');
2480 }
2481 $emailTemplateHandler = new EmailTemplateHandler($formID);
2482 $delete_status = $emailTemplateHandler->deleteTemplate($id);
2483 if (is_wp_error($delete_status)) {
2484 return $delete_status;
2485 }
2486 return [
2487 'message' => __('Email Template deleted', 'bit-form'),
2488 ];
2489 }
2490
2491 public function duplicateAMailTemplate($Request, $post)
2492 {
2493 if (isset($Request['formID']) && $Request['id']) {
2494 $formID = json_decode(wp_unslash($Request['formID']));
2495 $id = wp_unslash($Request['id']);
2496 } else {
2497 $formID = wp_unslash($post->formID);
2498 $id = wp_unslash($post->id);
2499 }
2500 if (empty($formID) || empty($id)) {
2501 return new WP_Error('empty_form', 'Invalid Form ID or Email Template ID.');
2502 }
2503
2504 if (false === filter_var($id, FILTER_VALIDATE_INT)) {
2505 return new WP_Error('empty_form', 'Invalid Email Template ID.');
2506 }
2507
2508 if (false === filter_var($formID, FILTER_VALIDATE_INT)) {
2509 return new WP_Error('empty_form', 'Invalid Form ID.');
2510 }
2511
2512 $emailTemplateHandler = new EmailTemplateHandler($formID);
2513 $duplicate_status = $emailTemplateHandler->duplicateTemplate($id);
2514 if (is_wp_error($duplicate_status)) {
2515 return $duplicate_status;
2516 }
2517 return [
2518 'message' => __('Email Template duplicated', 'bit-form'),
2519 ];
2520 }
2521
2522 public function setAllFormsReport($Request, $post)
2523 {
2524 $reports = empty($post->reports) ? null : wp_unslash($post->reports);
2525 if (empty($reports)) {
2526 return new WP_Error('empty_report_prefs', 'Report data is Empty, nothing to save or update.');
2527 }
2528 if (!empty($reports)) {
2529 $reportsModel = new ReportsModel();
2530 $user_details = static::$ipTool->getUserDetail();
2531 foreach ($reports as $reportIndex => $report) {
2532 if (empty($report->id)) {
2533 $reportSaveSatus = $reportsModel->insert(
2534 [
2535 'type' => 'table',
2536 'category' => 'app',
2537 'context' => 'allForm',
2538 'details' => is_string($report->details) ? $report->details : wp_json_encode($report->details),
2539 'isDefault' => 1,
2540 'user_id' => $user_details['id'],
2541 'user_ip' => $user_details['ip'],
2542 'user_device' => $user_details['device'],
2543 'created_at' => $user_details['time'],
2544 'updated_at' => $user_details['time'],
2545 ]
2546 );
2547 $newData['reports'] = 1;
2548 } else {
2549 $reportSaveSatus = $reportsModel->update(
2550 [
2551 'type' => 'table',
2552 'category' => 'app',
2553 'context' => 'allForm',
2554 'details' => is_string($report->details) ? $report->details : wp_json_encode($report->details),
2555 'isDefault' => 1,
2556 'user_id' => $user_details['id'],
2557 'user_ip' => $user_details['ip'],
2558 'user_device' => $user_details['device'],
2559 'updated_at' => $user_details['time'],
2560 ],
2561 [
2562 'id' => $report->id,
2563 ]
2564 );
2565 }
2566 }
2567 }
2568 if (is_wp_error($reportSaveSatus)) {
2569 if ('result_empty' === $reportSaveSatus->get_error_code()) {
2570 return new WP_Error('empty_report_prefs', 'Nothing to save or update');
2571 }
2572 return new WP_Error('error_report_prefs', 'Error occured in saving reports');
2573 }
2574 $returnedReportData = $reportsModel->get(
2575 [
2576 'id',
2577 'details',
2578 'isDefault',
2579 'category',
2580 'context',
2581 ],
2582 [
2583 'category' => 'app',
2584 'context' => 'allForm',
2585 ]
2586 );
2587 if (!is_wp_error($returnedReportData)) {
2588 foreach ($returnedReportData as $reportKey => $reportData) {
2589 if (isset($reportData->details) && is_string($reportData->details)) {
2590 $returnedReportData[$reportKey]->details = json_decode($reportData->details);
2591 }
2592 }
2593 $reports = $returnedReportData;
2594 }
2595 return [
2596 'message' => __('Report preferrences saved successfully', 'bit-form'),
2597 'reports' => empty($reports) ? [] : $reports,
2598 ];
2599 }
2600
2601 public function savegReCaptcha($Request, $post)
2602 {
2603 $reCaptcha = $post->reCaptcha;
2604
2605 if (is_null($reCaptcha)) {
2606 return new WP_Error('empty_gcaptchdetails', __('g-ReCAPTCHA details is empty', 'bit-form'));
2607 }
2608 if (is_string($reCaptcha) && !empty(json_decode($reCaptcha)->id)) {
2609 $reCaptcha = json_decode($reCaptcha);
2610 $integrationID = $reCaptcha->id;
2611 unset($reCaptcha->id);
2612 } else {
2613 $integrationID = $reCaptcha->id;
2614 unset($reCaptcha->id);
2615 }
2616 $reCaptcha = wp_json_encode($reCaptcha);
2617
2618 // $integrationName = 'google reCaptcha';
2619 $integrationName = $post->integrationName;
2620
2621 // $integrationType = 'v2' === $post->version ? 'gReCaptcha' : 'gReCaptchaV3';
2622 $integrationType = $post->integrationType;
2623
2624 $integrationDetails = $reCaptcha;
2625 $user_details = static::$ipTool->getUserDetail();
2626 $integrationHandler = new IntegrationHandler(0, $user_details);
2627 $response = [];
2628 if (empty($integrationID)) {
2629 $captchaSaveStatus = $integrationHandler->saveIntegration($integrationName, $integrationType, $integrationDetails, 'app');
2630 $response['id'] = $captchaSaveStatus;
2631 $response['message'] = __('reCAPTCHA saved successfully', 'bit-form');
2632 } else {
2633 $captchaSaveStatus = $integrationHandler->updateIntegration($integrationID, $integrationName, $integrationType, $integrationDetails, 'app');
2634 $response['message'] = __('reCAPTCHA updated successfully', 'bit-form');
2635 }
2636
2637 if (is_wp_error($captchaSaveStatus)) {
2638 return $captchaSaveStatus;
2639 }
2640 return $response;
2641 }
2642
2643 public function savePaymentSetting($Request, $post)
2644 {
2645 if (isset($post->paySetting)) {
2646 $paySetting = $post->paySetting;
2647 }
2648 if (is_null($paySetting)) {
2649 return new WP_Error('empty_gcaptchdetails', __('Setting details is empty', 'bit-form'));
2650 }
2651 if (is_string($paySetting)) {
2652 $paySetting = json_decode($paySetting);
2653 }
2654
2655 $canSave = null;
2656 switch ($paySetting->type) {
2657 case 'PayPal':
2658 $canSave = $this->addWebhookToPaypal($paySetting);
2659 break;
2660 case 'Razorpay':
2661 $canSave = true;
2662 break;
2663 case 'Stripe':
2664 $canSave = $this->addWebhookToStripe($paySetting);
2665 break;
2666 case 'Mollie':
2667 $canSave = true;
2668 break;
2669 default:
2670 $canSave = null;
2671 }
2672 if (is_null($canSave)) {
2673 return new WP_Error('stripe', __('Please re-check your Client ID & Secret', 'bit-form'));
2674 }
2675 $integrationID = null;
2676 if (isset($paySetting->id)) {
2677 $integrationID = $paySetting->id;
2678 unset($paySetting->id);
2679 }
2680 $integrationName = $paySetting->name;
2681 $integrationType = 'payments';
2682 $paySetting = wp_json_encode($paySetting);
2683 $integrationDetails = $paySetting;
2684 $user_details = static::$ipTool->getUserDetail();
2685 $integrationHandler = new IntegrationHandler(0, $user_details);
2686 $response = [];
2687 if (empty($integrationID)) {
2688 $paymentSaveStatus = $integrationHandler->saveIntegration($integrationName, $integrationType, $integrationDetails, 'app');
2689 $response['id'] = $paymentSaveStatus;
2690 $response['message'] = __('Payment setting saved successfully', 'bit-form');
2691 } else {
2692 $paymentSaveStatus = $integrationHandler->updateIntegration($integrationID, $integrationName, $integrationType, $integrationDetails, 'app');
2693 $response['message'] = __('Payment setting updated successfully', 'bit-form');
2694 }
2695
2696 if (is_wp_error($paymentSaveStatus)) {
2697 return $paymentSaveStatus;
2698 }
2699 return $response;
2700 }
2701
2702 private function addWebhookToPaypal($paySetting)
2703 {
2704 $transaction_mode = $paySetting->mode;
2705 $clientId = $paySetting->clientID;
2706 $clientSecret = $paySetting->clientSecret;
2707 $base_url = 'sandbox' === $transaction_mode ? 'https://api-m.sandbox.paypal.com' : 'https://api.paypal.com';
2708 // get all webhooks
2709 $webhooks_url = $base_url . '/v1/notifications/webhooks';
2710 $webhooks_headers = [
2711 'Content-Type' => 'application/json',
2712 'Authorization' => 'Basic ' . base64_encode($clientId . ':' . $clientSecret)
2713 ];
2714 $webhook_url = get_rest_url() . 'bitform/v1/payments/paypal';
2715 // adding webhook
2716 $data = [
2717 'url' => $webhook_url,
2718 'event_types' => [
2719 [
2720 'name' => 'CHECKOUT.ORDER.APPROVED'
2721 ]
2722 ]
2723 ];
2724 $webhook_response = HttpHelper::post($webhooks_url, wp_json_encode($data), $webhooks_headers);
2725 if (is_wp_error($webhook_response) || $webhook_response->error) {
2726 return null;
2727 }
2728 return true;
2729 }
2730
2731 private function addWebhookToStripe($paySetting)
2732 {
2733 $clientSecret = $paySetting->clientSecret;
2734
2735 $create_webhook_url = 'https://api.stripe.com/v1/webhook_endpoints';
2736 $headers = [
2737 'Content-Type' => 'application/x-www-form-urlencoded',
2738 'Authorization' => "Bearer $clientSecret",
2739 ];
2740
2741 $webhook_url = get_rest_url() . 'bitform/v1/payments/stripe';
2742
2743 $apiResponse = HttpHelper::get($create_webhook_url, '', $headers);
2744
2745 if (isset($apiResponse->error)) {
2746 return null;
2747 }
2748 $webhookList = $apiResponse->data;
2749 $webhook_already_exist = false;
2750
2751 foreach ($webhookList as $webhook) {
2752 if ($webhook->url === $webhook_url) {
2753 $webhook_already_exist = true;
2754 break;
2755 }
2756 }
2757
2758 $data = [
2759 'enabled_events[]' => 'payment_intent.succeeded',
2760 'url' => $webhook_url,
2761 ];
2762
2763 if (!$webhook_already_exist) {
2764 $webhook_response = HttpHelper::post($create_webhook_url, $data, $headers);
2765 if (is_wp_error($webhook_response) || (isset($webhook_response->error) && $webhook_response->error)) {
2766 return null;
2767 }
2768 }
2769 return true;
2770 }
2771
2772 public function builerHelperState($formId)
2773 {
2774 $data = static::$formModel->get(
2775 ['id', 'builder_helper_state'],
2776 ['id' => $formId]
2777 );
2778
2779 if (!is_wp_error($data)) {
2780 foreach ($data as $key => $value) {
2781 if (isset($value->builder_helper_state) && is_string($value->builder_helper_state)) {
2782 $data[$key]->builder_helper_state = json_decode($value->builder_helper_state);
2783 }
2784 }
2785 }
2786
2787 return $data;
2788 }
2789
2790 public function updateGeneratedScriptPageIds()
2791 {
2792 $updateData = [
2793 'generated_script_page_ids' => \wp_json_encode((object) []),
2794 ];
2795 $update_status = static::$formModel->update(
2796 $updateData,
2797 [
2798 'status' => 1
2799 ]
2800 );
2801 if (is_wp_error($update_status)) {
2802 return $update_status;
2803 } elseif (!$update_status) {
2804 return new WP_Error('empty_form', __('Form update failed.', 'bit-form'));
2805 } else {
2806 return true;
2807 }
2808 }
2809
2810 public function replaceAllFormsErrorMessagesByGlobalMessages()
2811 {
2812 try {
2813 $formModel = new FormModel();
2814 $allForms = $formModel->get(['id', 'form_content']);
2815
2816 foreach ($allForms as $form) {
2817 // Decode form_content JSON to stdClass
2818 $formContent = \json_decode($form->form_content);
2819 $fields = $formContent->fields ?? null;
2820 // If decode fails, skip to next
2821 if (!$fields) {
2822 Log::debug_log("Form ID {$form->id}: invalid JSON in form_content");
2823 continue;
2824 }
2825
2826 // Replace default error messages using your helper
2827 $updatedFields = Helpers::replaceFieldsDefaultErrorMsg($fields);
2828
2829 $formContent->fields = $updatedFields;
2830 // Encode back to JSON
2831 $updatedContent = \json_encode($formContent);
2832
2833 if (false === $updatedContent) {
2834 Log::debug_log("Form ID {$form->id}: JSON encoding failed");
2835 continue;
2836 }
2837 // Update form content in DB
2838 $formModel->update(
2839 ['form_content' => $updatedContent], // data to update
2840 ['id' => $form->id] // condition for update
2841 );
2842 }
2843 } catch (\Exception $e) {
2844 Log::debug_log([
2845 'message' => 'Error in updateAllFormsErrorMessagesWithGlobalMessages',
2846 'error' => $e->getMessage(),
2847 ]);
2848 }
2849 }
2850
2851 public function updateSuccessMessageClassName($str, $msgIdx, $msgId)
2852 {
2853 $TEMP_CONF_ID = '_tmp_' . $msgIdx . '_conf_id';
2854 return str_replace($TEMP_CONF_ID, $msgId, $str);
2855 }
2856
2857 public function startMigrationProcess()
2858 {
2859 Utilities::duplicateDbTable('form', 'form_v1');
2860 Utilities::duplicateDbTable('workflows', 'workflows_v1');
2861 Utilities::duplicateDbTable('success_messages', 'success_messages_v1');
2862 MigrationHelper::duplicateV1StyleFiles();
2863 $all_forms = $this->getAllForm();
2864 $v1FormContents = [];
2865 $defaultStyleClass = MigrationHelper::getBitformDefaultStyleClass();
2866 foreach ($all_forms as $form) {
2867 $formContents = $this->getAFormV1(['id' => $form->id], ['id' => $form->id]);
2868 $v1FormContents[] = $formContents;
2869 FrontEndScriptGenerator::saveCssFile("{$form->id}", $defaultStyleClass);
2870 FrontEndScriptGenerator::saveCssFile("{$form->id}-formid", $defaultStyleClass);
2871 }
2872 set_transient('bitforms_v1_form_contents', $v1FormContents);
2873 update_option('bitforms_migrating_to_v2', true);
2874 }
2875 }
2876