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

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

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