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

IntegrationHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.0, at includes/Core/Integration/IntegrationHandler.php

371 lines 14.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace BitCode\BitForm\Core\Integration;
4
5 use BitCode\BitForm\Admin\Form\AdminFormManager;
6 use BitCode\BitForm\Admin\Form\Helpers;
7 use BitCode\BitForm\Core\Database\FormEntryLogModel;
8 use BitCode\BitForm\Core\Database\FormEntryModel;
9 use BitCode\BitForm\Core\Database\IntegrationModel;
10 use BitCode\BitForm\Core\Util\FieldValueHandler;
11 use BitCode\BitForm\Core\Util\MailNotifier;
12 use BitCode\BitForm\Frontend\Form\FrontendFormManager;
13
14 final class IntegrationHandler {
15 private static $_formID;
16 private static $_integrationModel;
17 private $_user_details;
18
19 /**
20 * Constructor of Integration Handler
21 *
22 * @param Integer $formID If Integration is accessible globally then
23 * $formID will be 0 and category app
24 * @param Array $user_details Details of user accessing data
25 * @return void
26 */
27 public function __construct($formID, $user_details = null) {
28 static::$_formID = $formID;
29 static::$_integrationModel = new IntegrationModel();
30 $this->_user_details = $user_details;
31 }
32
33 public function getAIntegration($integrationID, $integrationCategory = null, $integrationType = null) {
34 $conditions = [
35 'form_id' => static::$_formID,
36 'id' => $integrationID,
37 ];
38 if (!is_null($integrationType)) {
39 $conditions = array_merge($conditions, ['integration_type' => $integrationType]);
40 }
41 if (!is_null($integrationCategory)) {
42 $conditions = array_merge($conditions, ['category' => $integrationCategory]);
43 }
44 return static::$_integrationModel->get(
45 [
46 'id',
47 'integration_name',
48 'integration_type',
49 'integration_details',
50 'form_id',
51 ],
52 $conditions
53 );
54 }
55
56 public function getAllIntegration($integrationCategory = null, $integrationType = null, $status = null, $id = null) {
57 $conditions = [
58 'form_id' => static::$_formID,
59 ];
60 if (!is_null($integrationType)) {
61 $conditions = array_merge($conditions, ['integration_type' => $integrationType]);
62 }
63
64 if (!is_null($integrationCategory)) {
65 $conditions = array_merge($conditions, ['category' => $integrationCategory]);
66 }
67 if (!is_null($status)) {
68 $conditions = array_merge($conditions, ['status' => 1]);
69 }
70 if (!is_null($id)) {
71 $conditions = array_merge($conditions, ['id' => $id]);
72 }
73 return static::$_integrationModel->get(
74 [
75 'id',
76 'form_id',
77 'integration_name',
78 'integration_type',
79 'integration_details',
80 'status',
81 ],
82 $conditions
83 );
84 }
85
86 public function getIntegrationWithoutFormId($integrationCategory = null, $integrationType = null, $status = null, $id = null) {
87 $conditions = [];
88 if (!is_null($integrationType)) {
89 $conditions = array_merge($conditions, ['integration_type' => $integrationType]);
90 }
91
92 if (!is_null($integrationCategory)) {
93 $conditions = array_merge($conditions, ['category' => $integrationCategory]);
94 }
95 if (!is_null($status)) {
96 $conditions = array_merge($conditions, ['status' => 1]);
97 }
98 if (!is_null($id)) {
99 $conditions = array_merge($conditions, ['id' => $id]);
100 }
101 return static::$_integrationModel->get(
102 [
103 'id',
104 'form_id',
105 'integration_name',
106 'integration_type',
107 'integration_details',
108 'status',
109 ],
110 $conditions
111 );
112 }
113
114 public function saveIntegration($integrationName, $integrationType, $integrationDetails, $integrationCategory, $status = null) {
115 if (null === $status) {
116 $status = 1;
117 }
118 return static::$_integrationModel->insert(
119 [
120 'integration_name' => $integrationName,
121 'integration_type' => $integrationType,
122 'integration_details' => $integrationDetails,
123 'category' => $integrationCategory,
124 'form_id' => static::$_formID,
125 'user_id' => $this->_user_details['id'],
126 'user_ip' => $this->_user_details['ip'],
127 'status' => $status,
128 'created_at' => $this->_user_details['time'],
129 'updated_at' => $this->_user_details['time'],
130 ]
131 );
132 }
133
134 public function updateIntegration($integrationID, $integrationName, $integrationType, $integrationDetails, $integrationCategory, $status = null) {
135 if (null === $status) {
136 $status = 1;
137 }
138 return static::$_integrationModel->update(
139 [
140 'integration_name' => $integrationName,
141 'integration_type' => $integrationType,
142 'integration_details' => $integrationDetails,
143 'category' => $integrationCategory,
144 'form_id' => static::$_formID,
145 'user_id' => $this->_user_details['id'],
146 'user_ip' => $this->_user_details['ip'],
147 'status' => $status,
148 'updated_at' => $this->_user_details['time'],
149 ],
150 [
151 'id' => $integrationID,
152 ]
153 );
154 }
155
156 public function duplicateAllInAForm($oldFormId) {
157 $integCols = ['integration_name', 'integration_type', 'integration_details', 'category', 'form_id', 'user_id', 'user_ip', 'status', 'created_at', 'updated_at'];
158 $integDupData = [
159 'integration_name',
160 'integration_type',
161 'integration_details',
162 'category',
163 static::$_formID,
164 $this->_user_details['id'],
165 $this->_user_details['ip'],
166 'status',
167 $this->_user_details['time'],
168 $this->_user_details['time'],
169 ];
170 return static::$_integrationModel->duplicate($integCols, $integDupData, ['form_id' => $oldFormId]);
171 }
172
173 public function deleteIntegration($integrationID) {
174 return static::$_integrationModel->delete(
175 [
176 'id' => $integrationID,
177 'form_id' => static::$_formID,
178 ]
179 );
180 }
181
182 public static function replaceFieldWithValue($dataToReplaceField, $fieldValues) {
183 if (empty($dataToReplaceField)) {
184 return false;
185 }
186 if (is_string($dataToReplaceField)) {
187 $dataToReplaceField = static::replaceFieldWithValueHelper($dataToReplaceField, $fieldValues);
188 } elseif (is_array($dataToReplaceField)) {
189 foreach ($dataToReplaceField as $field => $value) {
190 if (is_array($value) && 1 === count($value)) {
191 $dataToReplaceField[$field] = static::replaceFieldWithValueHelper($value[0], $fieldValues);
192 } elseif (is_array($value)) {
193 $dataToReplaceField[$field] = static::replaceFieldWithValue($value, $fieldValues);
194 } else {
195 $dataToReplaceField[$field] = static::replaceFieldWithValueHelper($value, $fieldValues);
196 }
197 }
198 }
199 return $dataToReplaceField;
200 }
201
202 private static function replaceFieldWithValueHelper($stringToReplaceField, $fieldValues) {
203 if (empty($stringToReplaceField)) {
204 return $stringToReplaceField;
205 }
206 $fieldPattern = '/\${\w[^ ${}]*}/';
207 preg_match_all($fieldPattern, $stringToReplaceField, $matchedField);
208 $uniqueFieldsInStr = array_unique($matchedField[0]);
209 foreach ($uniqueFieldsInStr as $key => $value) {
210 $fieldName = substr($value, 2, strlen($value) - 3);
211 if (!empty($fieldValues[$fieldName])) {
212 $stringToReplaceField = is_string($fieldValues[$fieldName]) ? str_replace($value, $fieldValues[$fieldName], $stringToReplaceField) :
213 wp_json_encode($fieldValues[$fieldName]);
214 }
215 }
216 return $stringToReplaceField;
217 }
218
219 public static function updatedHiddenFieldValue($formID) {
220 $hiddenFields = [];
221 $frontendFormManger = new FrontendFormManager($formID);
222
223 if ($frontendFormManger->isHoneypotActive()) {
224 $str = '_bitform' . '_' . $formID . '_' . time() . '_';
225 $honpotToken = Helpers::honeypotEncryptedToken($str);
226 $hiddenFields[] = [
227 'name' => 'b_h_t',
228 'value' => $honpotToken
229 ];
230 }
231 $csrfTokens = Helpers::csrfEecrypted();
232 $hiddenFields[] = [
233 'name' => 't_identy',
234 'value' => $csrfTokens['t_identy'],
235 ];
236 $hiddenFields[] = [
237 'name' => 'csrf',
238 'value' => $csrfTokens['csrf']
239 ];
240 return $hiddenFields;
241 }
242
243 public static function maybeSetCronForIntegration($workFlowReturnedData, $opType) {
244 $responseData = [];
245 $entryId = $workFlowReturnedData['triggerData']['entryID'];
246 $responseData['entry_id'] = $entryId;
247 if (isset($workFlowReturnedData['message'])) {
248 $formID = $workFlowReturnedData['triggerData']['formID'];
249 $responseData['message'] = $workFlowReturnedData['message'];
250 $responseData['hidden_fields'] = self::updatedHiddenFieldValue($formID);
251 $responseData['msg_id'] = isset($workFlowReturnedData['msg_id']) ? $workFlowReturnedData['msg_id'] : 0;
252 if (isset($workFlowReturnedData['msg_duration'])) {
253 $responseData['msg_duration'] = $workFlowReturnedData['msg_duration'];
254 }
255 }
256 if (isset($workFlowReturnedData['redirectPage'])) {
257 $responseData['redirectPage'] = $workFlowReturnedData['redirectPage'];
258 }
259 if ('update' === $opType && isset($workFlowReturnedData['updatedData'])) {
260 $responseData['updatedData'] = $workFlowReturnedData['updatedData'];
261 }
262 if (!isset($workFlowReturnedData['triggerData'])) {
263 return $responseData;
264 }
265
266 $triggerData = $workFlowReturnedData['triggerData'];
267
268 if (function_exists('fastcgi_finish_request') || !wp_doing_ajax()) {
269 if (!headers_sent()) {
270 header('Connection: close');
271 $contentType = wp_doing_ajax() || defined('REST_REQUEST') ? 'application/json' : 'text/html';
272 header('Content-Type: ' . $contentType . '; charset=' . get_option('blog_charset'));
273 status_header(200);
274 $response = [
275 'success' => true,
276 'data' => $responseData,
277 ];
278 }
279 ob_start();
280 echo wp_doing_ajax() || defined('REST_REQUEST') ? wp_json_encode($response) : $workFlowReturnedData['message'];
281 ob_end_flush();
282 flush();
283 session_write_close();
284
285 if (isset($workFlowReturnedData['integrationRun']) && !$workFlowReturnedData['integrationRun']) {
286 $entryModel = new FormEntryModel();
287 $updatedStatus = $entryModel->update(
288 [
289 'status' => 2,
290 ],
291 [
292 'form_id' => $triggerData['formID'],
293 'id' => $triggerData['entryID'],
294 ]
295 );
296
297 if (!is_wp_error($updatedStatus)) {
298 if ($workFlowReturnedData['dflt_template']) {
299 $triggerData['fields'] = $workFlowReturnedData['fields'];
300 do_action('bf_double_optin_confirmation', $workFlowReturnedData['integrationDetails'], $triggerData);
301 } elseif (isset($triggerData['dblOptin'])) {
302 foreach ($triggerData['dblOptin'] as $value) {
303 MailNotifier::notify($value, $triggerData['formID'], $triggerData['fields'], $triggerData['entryID'], true, $triggerData['logID']);
304 }
305 }
306 }
307 if (function_exists('fastcgi_finish_request')) {
308 fastcgi_finish_request();
309 }
310
311 if (defined('REST_REQUEST') || wp_doing_ajax()) {
312 die;
313 }
314 return $workFlowReturnedData;
315 }
316
317 if (isset($triggerData['mail'])) {
318 $formManager = new AdminFormManager($triggerData['formID']);
319 $formContent = $formManager->getFormContent();
320 $submitted_fields = $formContent->fields;
321 $fieldValueForMail = FieldValueHandler::formatFieldValueForMail($submitted_fields, $workFlowReturnedData['fields']);
322 foreach ($triggerData['mail'] as $value) {
323 MailNotifier::notify($value, $triggerData['formID'], $fieldValueForMail, $triggerData['entryID']);
324 }
325 }
326 do_action('bitforms_exec_integrations', $triggerData['integrations'], $workFlowReturnedData['fields'], $triggerData['formID'], $triggerData['entryID'], $triggerData['logID']);
327
328 if (function_exists('fastcgi_finish_request')) {
329 fastcgi_finish_request();
330 }
331
332 if (defined('REST_REQUEST') || wp_doing_ajax()) {
333 die;
334 }
335 return $workFlowReturnedData;
336 }
337
338 $entryID = $triggerData['entryID'];
339 if (isset($workFlowReturnedData['cron']) && $workFlowReturnedData['cron'] && !isset($triggerData['mail']) && isset($workFlowReturnedData['integrationRun']) && $workFlowReturnedData['integrationRun']) {
340 $eventScheuled = wp_schedule_single_event(time(), 'bitforms_exec_integrations', [$triggerData['integrations'], $workFlowReturnedData['fields'], $triggerData['formID'], $triggerData['entryID'], $triggerData['logID']]);
341 $scheduleTime = wp_next_scheduled('bitforms_exec_integrations', [$triggerData['integrations'], $workFlowReturnedData['fields'], $triggerData['formID'], $triggerData['entryID'], $triggerData['logID']]);
342 $responseData['cron'] = get_site_url(null, "/wp-cron.php?doing_wp_cron&{$scheduleTime}");
343 } elseif (!empty($triggerData['integrations']) || !empty($triggerData['mail']) || isset($workFlowReturnedData['integrationRun']) && !$workFlowReturnedData['integrationRun']) {
344 $triggerData['fields'] = $workFlowReturnedData['fields'];
345 if (!$workFlowReturnedData['integrationRun'] && isset($workFlowReturnedData['integrationDetails'])) {
346 $triggerData['dbl_opt_donf'] = $workFlowReturnedData['integrationDetails'];
347 $triggerData['dbl_opt_dflt_template'] = $workFlowReturnedData['dflt_template'];
348 $triggerData['integrationRun'] = $workFlowReturnedData['integrationRun'];
349 }
350 set_transient("bitform_trigger_transient_{$entryID}", $triggerData, HOUR_IN_SECONDS);
351 $entryLog = new FormEntryLogModel();
352 $queueuEntry = $entryLog->log_history_insert(
353 [
354 'log_id' => $triggerData['logID'],
355 'integration_id' => 0,
356 'api_type' => wp_json_encode(['type' => 'trigger', 'type_name' => 'Workflow', 'on' => $opType]),
357 'response_type' => 'queued',
358 'response_obj' => json_encode(['status' => 'queued']),
359 'created_at' => current_time('mysql'),
360 ]
361 );
362 $responseData['cronNotOk'] = [
363 $triggerData['entryID'],
364 $triggerData['logID'],
365 $queueuEntry,
366 ];
367 }
368 return $responseData;
369 }
370 }
371