PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.10.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.10.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 2.10.2 All 137 releases
bit-form / v1 / includes / Core / Integration / IntegrationHandler.php

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

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