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