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

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

469 lines 18.4 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\Admin;
4
5 if (!defined('ABSPATH')) {
6 exit;
7 }
8
9 /**
10 * The admin menu and page handler class
11 */
12
13 use BitCode\BitForm\Core\Form\FormHandler;
14 use BitCode\BitForm\Core\Integration\IntegrationHandler;
15 use BitCode\BitForm\Core\Integration\Integrations;
16 use BitCode\BitForm\Core\Util\DateTimeHelper;
17 use BitCode\BitForm\Core\Util\FileDownloadProvider;
18 use BitCode\BitForm\Core\Util\IpTool;
19 use BitCode\BitForm\Core\Util\Utilities;
20 use WP_Admin_Bar;
21
22 class Admin_Bar
23 {
24 private static $fonts_url = [
25 // 'https://fonts.googleapis.com/css2?family=Outfit:wght@100;300;400;500;600;700&display=swap&family=Roboto:wght@300;400;500&display=swap',
26 'https://fonts.googleapis.com/css2?family=DM+Sans:wght@100;200;300;400;500;600;700&display=swap',
27 'https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap',
28 ];
29
30 public function register()
31 {
32 add_action('in_admin_header', [$this, 'AdminNotices']);
33 add_action('admin_menu', [$this, 'AdminMenu']);
34 add_action('admin_enqueue_scripts', [$this, 'AdminAssets']);
35 add_filter('style_loader_tag', [$this, 'linkTagFilter'], 0, 3);
36 add_filter('script_loader_tag', [$this, 'scriptTagFilter'], 0, 3);
37 add_action('admin_bar_menu', [$this, 'AdminTopMenu'], 999);
38 add_action('admin_enqueue_scripts', [$this, 'bitforms_enqueue_admin_styles']);
39 }
40
41 /**
42 * Register the admin menu
43 *
44 * @return void
45 */
46 public function AdminMenu()
47 {
48 global $submenu;
49
50 $capability = apply_filters('bitforms_form_access_capability', 'manage_options');
51 $menuTitle = Utilities::isProLicensed() ? 'Bit Form Pro' : 'Bit Form';
52 add_menu_page(
53 __('Bit Form - Most advanced form builder and entries management plugin', 'bit-form'),
54 $menuTitle,
55 $capability,
56 'bitform',
57 [$this, 'RootPage'],
58 'data:image/svg+xml;base64,' . base64_encode('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 163 163"><path fill="#fff" d="M106 0H57A57 57 0 000 57v49a57 57 0 0057 57h49a57 57 0 0057-57V57a57 57 0 00-57-57zM51 60v3l-1 59v12c0 5-3 8-8 6-2-1-3-4-3-6v-21-55a29 29 0 011-4 5 5 0 015-4h33a4 4 0 004-2c2-3 8-2 10-1a9 9 0 015 9 9 9 0 01-7 8c-3 1-6 0-9-3a3 3 0 00-1-1H51zm73 74c-6 5-12 6-20 6H72a8 8 0 01-4-1 5 5 0 01-2-6 5 5 0 015-3h35c11-1 20-10 21-20 0-11-8-20-18-23a6 6 0 00-1 0H78h-1v14l1 2h18a4 4 0 003-1c4-4 8-3 11-1 4 2 5 7 3 12-2 4-9 6-13 2a6 6 0 00-5-1H71c-3 0-5-2-5-6V82c0-4 1-5 5-6h17a21 21 0 0021-24c-1-9-8-16-16-18a25 25 0 00-6 0H46c-4 0-7-3-7-6s3-5 7-5h42a33 33 0 0132 23c2 11 0 20-6 29l-1 2 5 2c11 4 17 12 19 23 3 12-2 24-13 32z"/></svg>'),
59 56
60 );
61 if (current_user_can($capability)) {
62 $entriesCount = '';
63 // if (self::countUnreadEntries()) {
64 // $entriesCount = ' <span class="update-plugins">' . self::countUnreadEntries() . '</span>';
65 // }
66
67 $submenu['bitform'][] = [__('All Forms', 'bit-form') . $entriesCount, $capability, 'admin.php?page=bitform#/'];
68 $submenu['bitform'][] = [__('Form Templates', 'bit-form') . '<span class="bf-template-new-badge">New</span>', $capability, 'admin.php?page=bitform#/form-templates'];
69 $submenu['bitform'][] = [__('App Settings', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/general'];
70 $submenu['bitform'][] = [__('Integrations', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/integrations'];
71 $submenu['bitform'][] = [__('SMTP', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/smtp'];
72 $submenu['bitform'][] = [__('PDF Setting', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/pdf'];
73 $submenu['bitform'][] = [__('CPT', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/cpt'];
74 $submenu['bitform'][] = [__('Bit Form API', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/api'];
75 $submenu['bitform'][] = [__('Payments', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/payments'];
76 $submenu['bitform'][] = [__('Doc & Support', 'bit-form'), $capability, 'admin.php?page=bitform#/doc-support'];
77 if (!Utilities::isPro()) {
78 $submenu['bitform'][] = ['<span class="bf-pro-btn">' . __('Get 74% OFF', 'bit-form') . '</span>', $capability, 'https://bit-form.com/#pricing', '_blank'];
79 }
80 }
81 }
82
83 public function AdminTopMenu(WP_Admin_Bar $wp_admin_bar)
84 {
85 if (!(current_user_can('manage_options') || current_user_can('manage_bitform'))) {
86 return;
87 }
88 $indicator = '';
89 // if (self::countUnreadEntries()) {
90 // $indicator = ' <div class="wp-core-ui wp-ui-notification bf-indicator-badge">' . self::countUnreadEntries() . '</div>';
91 // }
92
93 $wp_admin_bar->add_node([
94 'id' => 'bitform',
95 'title' => 'Bit Form' . $indicator,
96 'href' => admin_url('admin.php?page=bitform'),
97 'meta' => [
98 'class' => 'bitform-admin-bar',
99 ],
100 ]);
101 $wp_admin_bar->add_node([
102 'id' => 'bitform-all-forms',
103 'parent' => 'bitform',
104 'title' => __('All Forms', 'bit-form') . $indicator,
105 'href' => admin_url('admin.php?page=bitform#/'),
106 ]);
107 $wp_admin_bar->add_node([
108 'id' => 'bitform-form-templates',
109 'parent' => 'bitform',
110 'title' => __('Form Templates', 'bit-form'),
111 'href' => admin_url('admin.php?page=bitform#/form-templates'),
112 ]);
113 $wp_admin_bar->add_node([
114 'id' => 'bitform-app-settings',
115 'parent' => 'bitform',
116 'title' => __('App Settings', 'bit-form'),
117 'href' => admin_url('admin.php?page=bitform#/app-settings/general'),
118 ]);
119 $wp_admin_bar->add_node([
120 'id' => 'bitform-smtp',
121 'parent' => 'bitform',
122 'title' => __('SMTP', 'bit-form'),
123 'href' => admin_url('admin.php?page=bitform#/app-settings/smtp'),
124 ]);
125 $wp_admin_bar->add_node([
126 'id' => 'bitform-pdf-setting',
127 'parent' => 'bitform',
128 'title' => __('PDF Setting', 'bit-form'),
129 'href' => admin_url('admin.php?page=bitform#/app-settings/pdf'),
130 ]);
131 $wp_admin_bar->add_node([
132 'id' => 'bitform-cpt',
133 'parent' => 'bitform',
134 'title' => __('CPT', 'bit-form'),
135 'href' => admin_url('admin.php?page=bitform#/app-settings/cpt'),
136 ]);
137 $wp_admin_bar->add_node([
138 'id' => 'bitform-api',
139 'parent' => 'bitform',
140 'title' => __('Bit Form API', 'bit-form'),
141 'href' => admin_url('admin.php?page=bitform#/app-settings/api'),
142 ]);
143 $wp_admin_bar->add_node([
144 'id' => 'bitform-payments',
145 'parent' => 'bitform',
146 'title' => __('Payments', 'bit-form'),
147 'href' => admin_url('admin.php?page=bitform#/app-settings/payments'),
148 ]);
149 }
150
151 public function getAllPages()
152 {
153 $pages = get_pages(['post_status' => 'publish', 'sort_column' => 'post_date', 'sort_order' => 'desc']);
154 $allPages = [];
155 foreach ($pages as $pageKey => $pageDetails) {
156 $allPages[$pageKey]['title'] = $pageDetails->post_title;
157 $allPages[$pageKey]['url'] = get_page_link($pageDetails->ID);
158 }
159 return $allPages;
160 }
161
162 /**
163 * Load the asset libraries
164 *
165 * @return void
166 */
167 public function AdminAssets($current_screen)
168 {
169 if (false === strpos($current_screen, 'bitform')) {
170 return;
171 }
172 $parsed_url = wp_parse_url(get_admin_url());
173 $site_url = $parsed_url['scheme'] . '://' . $parsed_url['host'];
174 $site_url .= empty($parsed_url['port']) ? null : ':' . $parsed_url['port'];
175 $base_path_admin = str_replace($site_url, '', get_admin_url());
176 // loading google fonts
177 wp_enqueue_style('googleapis-BITFORM-PRECONNECT', 'https://fonts.googleapis.com', [], BITFORMS_VERSION, false);
178 wp_enqueue_style('gstatic-BITFORM-PRECONNECT-CROSSORIGIN', 'https://fonts.gstatic.com', [], BITFORMS_VERSION, false);
179 foreach (self::$fonts_url as $i => $font_url) {
180 wp_enqueue_style('bf-font-' . $i, $font_url, [], BITFORMS_VERSION);
181 }
182
183 if (defined('BITAPPS_DEV') && BITAPPS_DEV) {
184 // Vite dev server scripts; null version intentional (dev mode, no cache busting needed).
185 wp_enqueue_script('vite-client-helper-BITFORM-MODULE', BIT_DEV_URL . '/config/devHotModule.js', [], null);
186 wp_enqueue_script('vite-client-BITFORM-MODULE', BIT_DEV_URL . '/@vite/client', [], null);
187 wp_enqueue_script('index-BITFORM-MODULE', BIT_DEV_URL . '/main.jsx', [], null);
188 }
189
190 if (!defined('BITAPPS_DEV') || (defined('BITAPPS_DEV') && !BITAPPS_DEV)) {
191 $build_hash = file_get_contents(BITFORMS_PLUGIN_DIR_PATH . '/build-hash.txt');
192 wp_enqueue_script('index-BITFORM-MODULE', BITFORMS_ASSET_URI . "/main-{$build_hash}.js", [], null);
193 wp_enqueue_style('bf-css', BITFORMS_ASSET_URI . "/main-{$build_hash}.css", [], $build_hash);
194 }
195
196 // if (defined('BITAPPS_DEV') && BITAPPS_DEV) {
197 // wp_enqueue_script(
198 // 'bitforms-vendors',
199 // BITFORMS_ASSET_JS_URI . '/vendors-main.js',
200 // null,
201 // BITFORMS_VERSION,
202 // true
203 // );
204 // wp_enqueue_script(
205 // 'bitforms-runtime',
206 // BITFORMS_ASSET_JS_URI . '/runtime.js',
207 // null,
208 // BITFORMS_VERSION,
209 // true
210 // );
211 // wp_enqueue_script(
212 // 'bitforms-file',
213 // BITFORMS_ASSET_JS_URI . '/bitforms-file.js',
214 // ['bitforms-vendors', 'bitforms-runtime'],
215 // BITFORMS_VERSION,
216 // true
217 // );
218 // }
219
220 // if (wp_script_is('wp-i18n')) {
221 // error_log('wp_script' . wp_script_is('wp-i18n'));
222 // $deps = ['bitforms-vendors', 'bitforms-runtime', 'bitforms-file', 'wp-i18n'];
223 // } else {
224 // $deps = ['bitforms-vendors', 'bitforms-runtime', 'bitforms-file'];
225 // }
226 // if (!defined('BITAPPS_DEV')) {
227 // wp_enqueue_script(
228 // 'bitforms-admin-script',
229 // BITFORMS_ASSET_JS_URI . '/index.js',
230 // $deps,
231 // BITFORMS_VERSION,
232 // true
233 // );
234 // }
235
236 wp_enqueue_script('tinymce_js', includes_url('js/tinymce/') . 'wp-tinymce.php', [], get_bloginfo('version'), true);
237
238 if (!wp_script_is('media-upload')) {
239 wp_enqueue_media();
240 }
241
242 // $plugin_path = BITFORMS_ASSET_URI;
243
244 echo "<meta name='theme-color' content='#13233c' />";
245
246 // if (defined('BITAPPS_DEV') && !BITAPPS_DEV) {
247 // wp_enqueue_style(
248 // 'bitforms-styles',
249 // BITFORMS_ASSET_URI . '/css/bitforms.css',
250 // null,
251 // BITFORMS_VERSION,
252 // 'screen'
253 // );
254
255 // wp_enqueue_style(
256 // 'bitforms-components-styles',
257 // BITFORMS_ASSET_URI . '/css/components.css',
258 // null,
259 // BITFORMS_VERSION,
260 // 'screen'
261 // );
262 // }
263
264 $formHandler = FormHandler::getInstance();
265 $all_forms = $formHandler->admin->getAllForm();
266 $urlQuery = wp_parse_url(FileDownloadProvider::getBaseDownloadURL(), PHP_URL_QUERY);
267 $baseDLURL = FileDownloadProvider::getBaseDownloadURL();
268 $baseDLURL = empty($urlQuery) ? $baseDLURL . '?' : $baseDLURL . '&';
269 $ipTool = new IpTool();
270 $user_details = $ipTool->getUserDetail();
271 $integrationHandler = new IntegrationHandler(0, $user_details);
272 $allFormIntegrations = $integrationHandler->getAllIntegration('app');
273
274 $integraions = Integrations::getInstance();
275 $connectedIntegrationApps = $integraions->getConnectedIntegrationApp();
276
277 $allFormSettings = [];
278 if (!is_wp_error($allFormIntegrations)) {
279 $integCount = [];
280 foreach ($allFormIntegrations as $integration) {
281 $type = $integration->integration_type;
282 if (!is_null($type)) {
283 if (!isset($integCount[$type])) {
284 $integCount[$type] = 1;
285 } else {
286 $integCount[$type] += 1;
287 }
288 }
289 }
290 foreach ($allFormIntegrations as $integration) {
291 $type = $integration->integration_type;
292 if (!is_null($type)) {
293 $integrationDetails = json_decode($integration->integration_details);
294
295 if (!is_object($integrationDetails) || is_null($integrationDetails)) {
296 $integrationDetails = new \stdClass();
297 }
298 $integrationDetails->id = $integration->id;
299 if ($integCount[$type] > 1) {
300 if (!isset($allFormSettings[$type])) {
301 $allFormSettings[$type] = [];
302 }
303 array_push($allFormSettings[$type], $integrationDetails);
304 } else {
305 $allFormSettings[$type] = $integrationDetails;
306 }
307 }
308 }
309 }
310
311 if (!is_wp_error($connectedIntegrationApps)) {
312 $allFormSettings['connectedIntegrationApps'] = $connectedIntegrationApps;
313 }
314
315 $appSettings = get_option('bitform_app_settings', (object)[]);
316 $bits = [
317 'configs' => ['bf_separator' => BITFORMS_BF_SEPARATOR],
318 'nonce' => wp_create_nonce('bitforms_save'),
319 'isPro' => false,
320 'siteURL' => site_url(),
321 'assetsURL' => BITFORMS_ASSET_URI,
322 'baseURL' => $base_path_admin . 'admin.php?page=bitform#',
323 'baseDLURL' => $baseDLURL,
324 'styleURL' => BITFORMS_UPLOAD_BASE_URL . '/form-styles',
325 'iconURL' => BITFORMS_UPLOAD_BASE_URL . '/icons',
326 'ajaxURL' => admin_url('admin-ajax.php'),
327 'allForms' => is_wp_error($all_forms) ? null : $all_forms,
328 'allPages' => is_wp_error($this->getAllPages()) ? [] : $this->getAllPages(),
329 'allFormSettings' => count($allFormSettings) > 0 ? $allFormSettings : (object)[],
330 'appSettings' => $appSettings,
331 'dateFormat' => get_option('date_format'),
332 'timeFormat' => get_option('time_format'),
333 'timeZone' => DateTimeHelper::wp_timezone_string(),
334 'googleRedirectURL' => get_rest_url() . 'bitform/v1/google',
335 'oneDriveRedirectURL' => get_rest_url() . 'bitform/v1/oneDrive',
336 'zohoRedirectURL' => get_rest_url() . 'bitform/v1/zoho',
337 'oAuthRedirectURL' => get_rest_url() . 'bitform/v1/oauth-redirect',
338 'downloadedPdfFonts' => is_array(get_option('bitforms_pdf_fonts')) ? get_option('bitforms_pdf_fonts') : [],
339 'permission' => empty(get_option('bitforms_allow_tracking')) ? false : true,
340 'templatePath' => BITFORMS_ROOT_URI . '/static/templates',
341 'serverInfo' => ['php_version' => phpversion(), 'engine' => isset($_SERVER['SERVER_SOFTWARE']) ? sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE'])) : '', 'wp_version' => get_bloginfo('version'), 'loaded_extensions' => get_loaded_extensions()],
342 ];
343
344 $isMigratingToV2 = get_option('bitforms_migrating_to_v2', false);
345 if ($isMigratingToV2) {
346 $bits['isMigratingToV2'] = $isMigratingToV2;
347 }
348
349 if (defined('BITFORMS_VERSION')) {
350 $bits['version'] = BITFORMS_VERSION;
351 }
352
353 $changelogVersion = get_option('bitforms_changelog_version', '0.0.0');
354 $bits['changelogVersion'] = $changelogVersion;
355
356 $hideAnnouncementModal = (bool) get_option('bitforms_hide_announcement', false);
357 $bits['hideAnnouncementModal'] = $hideAnnouncementModal;
358
359 $hideCashbackModal = (bool) get_option('bitforms_hide_cashback', false);
360 $bits['hideCashbackModal'] = $hideCashbackModal;
361
362 global $wpdb;
363 // Direct query: table name interpolation only (no user input). $wpdb->prepare() cannot parameterize schema-check queries.
364 $hasV1FormTable = $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}bitforms_form_v1'");
365 if ($hasV1FormTable) {
366 $bits['canRollbackToV1'] = true;
367 }
368
369 $bitforms = apply_filters(
370 'bitforms_localized_script',
371 $bits
372 );
373
374 $allowBitFormTranslation = apply_filters('bitforms_filter_allow_translation', true);
375 if ($allowBitFormTranslation && 'en_US' !== get_user_locale() && file_exists(BITFORMS_PLUGIN_DIR_PATH . '/languages/generatedString.php')) {
376 include_once BITFORMS_PLUGIN_DIR_PATH . '/languages/generatedString.php';
377 $bitforms['translations'] = $bitforms_i18n_strings;
378
379 // Apply a filter to allow user/custom translations to modify the $bitforms translations
380 $bitforms['translations'] = apply_filters('bitform_filter_translations', $bitforms['translations']);
381 }
382 wp_localize_script('index-BITFORM-MODULE', 'bits', $bitforms);
383 // !BIT_DEV && wp_localize_script('bitforms-admin-script', 'bits', $bitforms);
384 // echo !BIT_DEV ? '' : "<script>console.log(window.bits=JSON.parse('" . str_replace("'", '', wp_json_encode($bitforms)) . "'))</script>";
385 // if (\function_exists('wp_set_script_translations'))
386 // wp_set_script_translations('bitforms-admin-script', 'bitform', BITFORMS_PLUGIN_DIR_PATH . 'languages');
387 }
388
389 public function bitforms_enqueue_admin_styles()
390 {
391 wp_enqueue_style(
392 'bitforms-admin-styles',
393 BITFORMS_ROOT_URI . '/resources/admin.css',
394 [],
395 BITFORMS_VERSION,
396 'all'
397 );
398 }
399
400 /**
401 * Bitforms apps-root id provider
402 * @return void
403 */
404 public function RootPage()
405 {
406 require_once BITFORMS_PLUGIN_DIR_PATH . '/views/view-root.php';
407 }
408
409 public function AdminNotices()
410 {
411 global $plugin_page;
412 $plugin_page = null === $plugin_page ? '' : $plugin_page;
413 if (false === strpos($plugin_page, 'bitform')) {
414 return;
415 }
416 remove_all_actions('admin_notices');
417 remove_all_actions('all_admin_notices');
418 }
419
420 /**
421 * Modify style tags
422 *
423 * @param string $html link tag
424 *
425 * @return string new link tag
426 */
427 public function linkTagFilter($html, $handle, $href)
428 {
429 $newTag = $html;
430 if (preg_match('/BITFORM-PRECONNECT/', $handle)) {
431 $newTag = preg_replace('/rel=("|\')stylesheet("|\')/', 'rel="preconnect"', $newTag);
432 }
433 if (preg_match('/BITFORM-PRELOAD/', $handle)) {
434 $newTag = preg_replace('/rel=("|\')stylesheet("|\')/', 'rel="preload"', $newTag);
435 }
436 if (preg_match('/BITFORM-CROSSORIGIN/', $handle)) {
437 $newTag = preg_replace('/<link /', '<link crossorigin ', $newTag);
438 }
439 if (preg_match('/BITFORM-SCRIPT/', $handle)) {
440 $newTag = preg_replace('/<link /', '<link as="script" ', $newTag);
441 }
442 return $newTag;
443 }
444
445 /**
446 * Modify script tags
447 *
448 * @param string $html script tag
449 *
450 * @return string new script tag
451 */
452 public function scriptTagFilter($html, $handle, $href)
453 {
454 $newTag = $html;
455 if (preg_match('/BITFORM-MODULE/', $handle)) {
456 $newTag = preg_replace('/<script /', '<script type="module" ', $newTag);
457 }
458 return $newTag;
459 }
460
461 private static function countUnreadEntries()
462 {
463 global $wpdb;
464 // Direct query: table name interpolation only (no user input). status = 1 is a hardcoded literal.
465 $unreadEntries = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}bitforms_form_entries WHERE status = 1");
466 return $unreadEntries;
467 }
468 }
469