PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.2.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.2.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 / includes / Core / Integration / Integrations.php

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

339 lines 11.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 *
5 * @package BitForms
6 */
7
8 namespace BitCode\BitForm\Core\Integration;
9
10 use BitCode\BitForm\Core\Database\FormEntryModel;
11 use BitCode\BitForm\Core\Database\FormModel;
12 use BitCode\BitForm\Core\Util\ApiResponse;
13 use BitCode\BitForm\Core\Util\Log;
14 use BitCode\BitForm\Core\Util\SmartTags;
15 use BitCode\BitForm\Core\Util\Utilities;
16 /**
17 * Provides details of available integration and helps to
18 * execute available integrations
19 */
20
21 use FilesystemIterator;
22
23 final class Integrations
24 {
25 public $integrations = [];
26 private static $_instance = null;
27
28 /**
29 * Undocumented function
30 */
31 public static function getInstance()
32 {
33 if (null === self::$_instance) {
34 self::$_instance = new Integrations();
35 }
36 return self::$_instance;
37 }
38
39 /**
40 * Undocumented function
41 *
42 * @return array
43 */
44 public function getAllIntegrations()
45 {
46 return $this->allIntegrations();
47 }
48
49 /**
50 * Undocumented function
51 *
52 * @return array
53 */
54 protected function allIntegrations()
55 {
56 $dirs = new FilesystemIterator(__DIR__);
57 foreach ($dirs as $dirInfo) {
58 if ($dirInfo->isDir()) {
59 $integrationsBaseName = basename($dirInfo);
60 if (
61 file_exists(__DIR__ . '/' . $integrationsBaseName)
62 && file_exists(__DIR__ . '/' . $integrationsBaseName . '/' . $integrationsBaseName . 'Handler.php')
63 ) {
64 $integrations[] = $integrationsBaseName;
65 }
66 }
67 }
68 return $integrations;
69 }
70
71 /**
72 * Checks a Integration Exists or not
73 *
74 * @param string $name Name of Integration
75 * @return boolean | string
76 */
77 protected static function isExists($name)
78 {
79 $path = Utilities::getRealPath(__DIR__, $name);
80 if (!empty($path) && $fileName = Utilities::getRealPath(__DIR__ . "/{$path}", "{$name}Handler.php")) {
81 $className = Utilities::getFileNameExceptExtension($fileName);
82 return __NAMESPACE__ . "\\{$path}\\{$className}";
83 }
84
85 if (!defined('BITFORMPRO_PLUGIN_DIR_PATH')) {
86 return false;
87 }
88
89 $proPath = BITFORMPRO_PLUGIN_DIR_PATH . '/includes/Integration';
90 $proNamespace = 'BitCode\\BitFormPro\\Integration';
91 $path = Utilities::getRealPath($proPath, $name);
92 if (!empty($path) && $fileName = Utilities::getRealPath("{$proPath}/{$path}", "{$name}Handler.php")) {
93 $className = Utilities::getFileNameExceptExtension($fileName);
94 return "{$proNamespace}\\{$path}\\{$className}";
95 }
96
97 return false;
98 }
99
100 /**
101 * This function helps to get single integration information
102 *
103 * @return bool setIntegration()
104 */
105 public function getIntegration($integrationBaseName)
106 {
107 return $this->setIntegration($integrationBaseName);
108 }
109
110 public function registerAjax()
111 {
112 $dirs = new FilesystemIterator(__DIR__);
113 foreach ($dirs as $dirInfo) {
114 if ($dirInfo->isDir()) {
115 $integrationBaseName = basename($dirInfo);
116 if (
117 file_exists(__DIR__ . '/' . $integrationBaseName)
118 && file_exists(__DIR__ . '/' . $integrationBaseName . '/' . $integrationBaseName . 'Handler.php')
119 ) {
120 $integration = __NAMESPACE__ . "\\{$integrationBaseName}\\{$integrationBaseName}Handler";
121 if (method_exists($integration, 'registerAjax')) {
122 $integration::registerAjax();
123 // (new $integration(0, 0))->registerAjax();
124 }
125 /* $handler = new $integration($integrationID, $formID);
126 $handler->execute($integrationHandler, $integrationDetails, $fieldValues); */
127 }
128 }
129 }
130 }
131
132 protected static function entryDeleted($formId, $entryId)
133 {
134 $formModel = new FormModel();
135 $formContent = $formModel->get(
136 [
137 'id',
138 'form_content',
139 ],
140 [
141 'id' => $formId,
142 ]
143 );
144 if (!is_wp_error($formContent)) {
145 $content = \json_decode($formContent[0]->form_content);
146 if (isset($content->additional->enabled->submission)) {
147 global $wpdb;
148 $prefix = $wpdb->prefix;
149 $formEntryModel = new FormEntryModel();
150 $formEntryModel->bulkDelete(
151 [
152 "`{$prefix}bitforms_form_entries`.`id`" => $entryId,
153 "`{$prefix}bitforms_form_entries`.`form_id`" => $formId,
154 ]
155 );
156 }
157 }
158 }
159
160 public static function specialTagFields($fieldMap)
161 {
162 $specialTagFieldValue = [];
163
164 foreach ($fieldMap as $value) {
165 $triggerValue = $value->formField;
166 $specialTagFieldValue[$value->formField] = SmartTags::getSmartTagValue($triggerValue);
167 }
168 return $specialTagFieldValue;
169 }
170
171 /**
172 * This function helps to execute Integration
173 *
174 * @param array $integrations List of integration to execute.
175 * Element will be json string like {"id":1}
176 * @param array $fieldValues Values of submitted fields
177 * @param integer $formID ID of current form
178 *
179 * @return void Nothing to return
180 */
181 public static function executeIntegrations($integrations, $fieldValues, $formID, $logID = null, $entryID = 0)
182 {
183 $integrationHandler = new IntegrationHandler($formID);
184 $logResponse = new ApiResponse();
185 $intThatNeedNoFileHandling = ['ACF', 'MetaBox', 'Pods']; //these takes raw file and upload it
186 $baseFieldValues = $fieldValues;
187 $entryDetails = [
188 'formId' => $formID,
189 'entryId' => $entryID,
190 'fieldValues' => $fieldValues
191 ];
192 if (is_array($integrations)) {
193 foreach ($integrations as $integrationIDStr) {
194 if (!is_string($integrationIDStr)) {
195 return;
196 }
197 $currentFieldValues = $baseFieldValues;
198 $integrationID = intval(Utilities::jsonObj($integrationIDStr)->id ?? 0, 10);
199 if (!empty($integrationID) && is_int($integrationID)) {
200 $integrationResult
201 = $integrationHandler->getAIntegration($integrationID);
202 $integrationDetails = is_wp_error($integrationResult) ? null : $integrationResult[0];
203 // Honor enable/disable: a disabled integration is never executed.
204 if (!is_null($integrationDetails) && isset($integrationDetails->status) && empty($integrationDetails->status)) {
205 continue;
206 }
207 $integrationName = is_null($integrationDetails) ? null : ucfirst(str_replace(' ', '', $integrationDetails->integration_type));
208 if ('Brevo(SendinBlue)' === $integrationName) {
209 $integrationName = 'SendinBlue';
210 }
211 if (!is_null($integrationName) && static::isExists($integrationName)) {
212 if (!in_array($integrationName, $intThatNeedNoFileHandling)) {
213 $currentFieldValues = IntegrationHandler::handleFileUrl($currentFieldValues, $formID, $entryID);
214 }
215 $integration = static::isExists($integrationName);
216 $handler = new $integration($integrationID, $formID);
217 $integDetails = is_string($integrationDetails->integration_details) ? json_decode($integrationDetails->integration_details) : $integrationDetails->integration_details;
218 if (isset($integDetails->field_map)) {
219 $sptagData = self::specialTagFields($integDetails->field_map);
220 $currentFieldValues = $currentFieldValues + $sptagData;
221 }
222 // fresh time budget per handler: a chain of slow integrations (30s HTTP
223 // timeout each) must not be killed by max_execution_time mid-loop
224 if (\function_exists('set_time_limit') && false === strpos((string) ini_get('disable_functions'), 'set_time_limit')) {
225 set_time_limit(60);
226 }
227 try {
228 $handler->execute($integrationHandler, $integrationDetails, $currentFieldValues, $entryID, $logID);
229 } catch (\Throwable $executionError) {
230 // one failing integration must not abort the remaining ones
231 Log::debug_log('[+] Integration execution threw: ' . $executionError->getMessage());
232 $logResponse->apiResponse(
233 $logID,
234 $integrationID,
235 ['type' => 'record', 'type_name' => $integrationName ?: 'Integration'],
236 'errors',
237 $executionError->getMessage(),
238 $entryDetails
239 );
240 }
241 } else {
242 do_action('bitform_integration_run_failure', $integrationID, $formID);
243
244 $errorMsg = apply_filters('bitform_filter_integration_run_failure_message', __('Integration execution failed', 'bit-form'), $integrationID, $formID);
245
246 Log::debug_log('[+] Integration execution failed: ' . $errorMsg);
247
248 $logResponse->apiResponse(
249 $logID,
250 $integrationID,
251 ['type' => 'record', 'type_name' => $integrationName || 'Integration'],
252 'errors',
253 $errorMsg,
254 $entryDetails
255 );
256 }
257 }
258 }
259 }
260 }
261
262 public static function integrationExecutionHelper($integrations, $fieldValue, $formID, $entryID, $logID)
263 {
264 if (empty($integrations) || empty($formID)) {
265 return;
266 }
267 $trnasientData = get_transient("bitform_trigger_transient_{$entryID}");
268 $trnasientData = is_string($trnasientData) ? json_decode($trnasientData) : $trnasientData;
269 if (!empty($trnasientData['fields'])) {
270 $fieldValue = array_merge($fieldValue, $trnasientData['fields']);
271 }
272 foreach ($integrations as $key => $value) {
273 self::executeIntegrations($value, $fieldValue, $formID, $logID, $entryID);
274 }
275 self::entryDeleted($formID, $entryID);
276 }
277
278 /**
279 * This function helps to save connected integration app
280 *
281 * @return wp_error | mixed
282 */
283 public function saveConnectedIntegrationApp($appConfig)
284 {
285 // error_log('[+] saveConnectedIntegrationApp: ' . print_r($appConfig, true));
286 $connectionName = $appConfig->name;
287 $connectionType = $appConfig->type;
288 // $connectionDetails = wp_json_encode($appConfig);
289
290 if (empty($appConfig->details)) {
291 unset($appConfig->name, $appConfig->id);
292
293 $connectionDetails = !is_string($appConfig) ?
294 wp_json_encode($appConfig) : $appConfig;
295 } else {
296 $connectionDetails = !is_string($appConfig->details) ?
297 wp_json_encode($appConfig->details) : $appConfig->details;
298 }
299 $connectionCategory = 'connected_integration_apps';
300
301 $integrationHandler = new IntegrationHandler(0);
302
303 return $integrationHandler->saveIntegration($connectionName, $connectionType, $connectionDetails, $connectionCategory);
304 }
305
306 // get connectd integration app
307 public function getConnectedIntegrationApp($integration_type = null)
308 {
309 $connectionCategory = 'connected_integration_apps';
310
311 $integrationHandler = new IntegrationHandler(0);
312 $allConnectedIntegApps = $integrationHandler->getAllIntegration($connectionCategory, $integration_type);
313
314 if (!is_wp_error($allConnectedIntegApps)) {
315 foreach ($allConnectedIntegApps as $integrationkey => $integrationValue) {
316 $integrationData = [
317 'id' => $integrationValue->id,
318 'name' => $integrationValue->integration_name,
319 'type' => $integrationValue->integration_type,
320 ];
321 $allConnectedIntegApps[$integrationkey]->integration_details = wp_json_encode(array_merge(
322 $integrationData,
323 is_string($integrationValue->integration_details) ?
324 (array) json_decode($integrationValue->integration_details) :
325 $integrationValue->integration_details
326 ));
327 }
328 }
329 return $allConnectedIntegApps;
330 }
331
332 public function deleteConnectedApp($appId)
333 {
334 $integrationHandler = new IntegrationHandler(0);
335
336 return $integrationHandler->deleteIntegration($appId);
337 }
338 }
339