PluginProbe
WP Data Access – App Builder for Tables, Forms, Dashboards, Charts & Maps / 5.5.87
WP Data Access – App Builder for Tables, Forms, Dashboards, Charts & Maps v5.5.87
5.5.87 5.5.85 5.5.84 5.5.83 5.5.82 5.5.81 5.5.80 5.5.79 5.5.77 5.5.76 5.5.75 5.5.73 5.5.72 5.5.22 5.5.23 5.5.29 5.5.3 5.5.31 5.5.32 5.5.34 5.5.35 5.5.36 5.5.37 5.5.4 5.5.40 All 162 releases
wp-data-access / includes / class-wp-data-access.php

class-wp-data-access.php in WP Data Access – App Builder for Tables, Forms, Dashboards, Charts & Maps 5.5.87, at includes/class-wp-data-access.php

615 lines 27.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Suppress "error - 0 - No summary was found for this file" on phpdoc generation
5 *
6 * @package plugin\includes
7 */
8 use WPDataAccess\Connection\WPDADB;
9 use WPDataAccess\Cookies\WPDA_Cookies;
10 use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Lists;
11 use WPDataAccess\Data_Tables\WPDA_Data_Tables;
12 use WPDataAccess\Plugin_Table_Models\WPDA_Table_Settings_Model;
13 use WPDataAccess\Utilities\WPDA_Export;
14 use WPDataAccess\WPDA;
15 use WPDataProjects\Utilities\WPDP_Export_Project;
16 use WPDataAccess\Backup\WPDA_Data_Export;
17 use WPDataAccess\Plugin_Table_Models\WPDA_CSV_Uploads_Model;
18 use WPDataRoles\WPDA_Roles;
19 use WPDataAccess\Utilities\WPDA_Autocomplete;
20 use WPDataAccess\Premium\WPDAPRO_Geo_Location\WPDAPRO_Geo_Location_WS;
21 use WPDataAccess\Premium\WPDAPRO_Geo_Location\WPDAPRO_Geo_Location;
22 use WPDataAccess\Dashboard\WPDA_Dashboard;
23 use WPDataAccess\Dashboard\WPDA_Widget_Code;
24 use WPDataAccess\Dashboard\WPDA_Widget_Publication;
25 use WPDataAccess\Dashboard\WPDA_Widget_Dbms;
26 use WPDataAccess\Dashboard\WPDA_Widget_Google_Chart;
27 use WPDataAccess\Premium\WPDAPRO_Dashboard\WPDAPRO_Widget_Project;
28 /**
29 * Class WP_Data_Access
30 *
31 * Core plugin class used to define:
32 * + admin specific functionality {@see WP_Data_Access_Admin}
33 * + public specific functionality {@see WP_Data_Access_Public}
34 * + internationalization {@see WP_Data_Access_I18n}
35 * + plugin activation and deactivation {@see WP_Data_Access_Loader}
36 *
37 * @author Peter Schulz
38 * @since 1.0.0
39 *
40 * @see WP_Data_Access_Admin
41 * @see WP_Data_Access_Public
42 * @see WP_Data_Access_I18n
43 * @see WP_Data_Access_Loader
44 */
45 // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- verified on page
46 class WP_Data_Access {
47 /**
48 * Reference to plugin loader
49 *
50 * @var WP_Data_Access_Loader
51 *
52 * @since 1.0.0
53 *
54 * @see WP_Data_Access_Loader
55 */
56 protected $loader;
57
58 /**
59 * Menu slug or null
60 *
61 * @var null
62 */
63 protected $page = null;
64
65 /**
66 * WP_Data_Access constructor
67 *
68 * Calls method the following methods to setup plugin:
69 * + {@see WP_Data_Access::load_dependencies()}
70 * + {@see WP_Data_Access::set_locale()}
71 * + {@see WP_Data_Access::define_admin_hooks()}
72 * + {@see WP_Data_Access::define_public_hooks()}
73 *
74 * @since 1.0.0
75 *
76 * @see WP_Data_Access::load_dependencies()
77 * @see WP_Data_Access::set_locale()
78 * @see WP_Data_Access::define_admin_hooks()
79 * @see WP_Data_Access::define_public_hooks()
80 */
81 public function __construct() {
82 if ( isset( $_REQUEST['page'] ) ) {
83 $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) );
84 }
85 $this->load_dependencies();
86 $this->set_locale();
87 $this->define_admin_hooks();
88 $this->define_public_hooks();
89 // WP Data Access REST API.
90 $this->api();
91 }
92
93 /**
94 * Add WP Data Access JSON REST API
95 *
96 * @return void
97 */
98 private function api() {
99 $api = new \WPDataAccess\API\WPDA_API();
100 $this->loader->add_action( 'init', $api, 'hide' );
101 $this->loader->add_action( 'rest_api_init', $api, 'init' );
102 }
103
104 /**
105 * Load required dependencies
106 *
107 * Loads required plugin files and initiates the plugin loader.
108 *
109 * @since 1.0.0
110 *
111 * @see WP_Data_Access_Loader
112 */
113 private function load_dependencies() {
114 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wp-data-access-loader.php';
115 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wp-data-access-i18n.php';
116 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-wp-data-access-admin.php';
117 require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-wp-data-access-public.php';
118 $this->loader = new WP_Data_Access_Loader();
119 }
120
121 /**
122 * Set locale for internationalization
123 *
124 * @since 1.0.0
125 *
126 * @see WP_Data_Access_I18n
127 */
128 private function set_locale() {
129 $wpda_i18n = new WP_Data_Access_I18n();
130 $this->loader->add_action( 'init', $wpda_i18n, 'load_plugin_textdomain' );
131 }
132
133 /**
134 * Add admin hooks
135 *
136 * Initiates {@see WP_Data_Access_Admin} (admin functionality) and {@see WPDA_Export} (export functionality).
137 * Adds the appropriate actions to the loader.
138 *
139 * @since 1.0.0
140 *
141 * @see WP_Data_Access_Admin
142 * @see WPDA_Export
143 */
144 private function define_admin_hooks() {
145 $plugin_admin = new WP_Data_Access_Admin();
146 if ( WPDA::is_plugin_page( $this->page ) ) {
147 // Handle plugin cookies.
148 $wpda_cookies = new WPDA_Cookies();
149 $this->loader->add_action( 'admin_init', $wpda_cookies, 'handle_plugin_cookies' );
150 }
151 // Admin menu.
152 $this->loader->add_action( 'admin_menu', $plugin_admin, 'add_menu_items' );
153 $this->loader->add_filter( 'submenu_file', $plugin_admin, 'wpda_submenu_filter' );
154 // Admin scripts.
155 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
156 $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
157 $this->loader->add_action( 'in_admin_header', $plugin_admin, 'user_admin_notices' );
158 $this->loader->add_action( 'admin_head', $plugin_admin, 'remove_icons' );
159 // Add settings page.
160 $this->loader->add_action( 'admin_menu', $this, 'wpdataaccess_register_settings_page' );
161 // Run unattended scheduled export
162 $this->loader->add_action( \WPDataAccess\Utilities\WPDA_Export_Scheduler::SCHEDULER_HOOK_NAME, \WPDataAccess\Utilities\WPDA_Export_Scheduler::class, 'run_scheduled_export' );
163 // Mail service.
164 $wpda_mail_server = \WPDataAccess\Utilities\WPDA_Mail::get_option();
165 if ( isset(
166 $wpda_mail_server['host'],
167 $wpda_mail_server['port'],
168 $wpda_mail_server['authenticate'],
169 $wpda_mail_server['encryption'],
170 $wpda_mail_server['skip_verify'],
171 $wpda_mail_server['username'],
172 $wpda_mail_server['password']
173 ) ) {
174 add_action(
175 'phpmailer_init',
176 function ( $phpmailer ) use($wpda_mail_server) {
177 // Only run if mail WPDA requests.
178 if ( !did_action( 'wpda_sending_mail' ) ) {
179 return;
180 // Allow other plugins/themes to overwrite.
181 }
182 $phpmailer->isSMTP();
183 $phpmailer->isHTML( false );
184 $phpmailer->SMTPDebug = $wpda_mail_server['debug'] ?? 0;
185 $phpmailer->Host = $wpda_mail_server['host'];
186 $phpmailer->Port = $wpda_mail_server['port'];
187 $phpmailer->SMTPAuth = 'on' === $wpda_mail_server['authenticate'];
188 $phpmailer->SMTPSecure = $wpda_mail_server['encryption'];
189 if ( 'on' === $wpda_mail_server['skip_verify'] ) {
190 $phpmailer->SMTPOptions = array(
191 'ssl' => array(
192 'verify_peer' => false,
193 'verify_peer_name' => false,
194 'allow_self_signed' => true,
195 ),
196 );
197 }
198 $phpmailer->Username = $wpda_mail_server['username'];
199 $phpmailer->Password = $wpda_mail_server['password'];
200 $phpmailer->From = $wpda_mail_server['username'];
201 },
202 10,
203 1
204 );
205 }
206 // Export action.
207 $this->loader->add_action( 'admin_action_wpda_export', WPDA_Export::class, 'export' );
208 // Dashboard and widgets.
209 $this->loader->add_action( 'wp_ajax_wpda_save_dashboard', WPDA_Dashboard::class, 'save' );
210 $this->loader->add_action( 'wp_ajax_wpda_dashboard_list', WPDA_Dashboard::class, 'get_list' );
211 $this->loader->add_action( 'wp_ajax_wpda_widget_load_panel', WPDA_Dashboard::class, 'load_widget' );
212 $this->loader->add_action( 'wp_ajax_wpda_widget_delete', WPDA_Dashboard::class, 'delete_widget' );
213 $this->loader->add_action( 'wp_ajax_wpda_widget_code_add', WPDA_Widget_Code::class, 'ajax_widget' );
214 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_add', WPDA_Widget_Dbms::class, 'ajax_widget' );
215 $this->loader->add_action( 'wp_ajax_wpda_widget_dbms_refresh', WPDA_Widget_Dbms::class, 'ajax_refresh' );
216 $this->loader->add_action( 'wp_ajax_wpda_remove_new_dashboard_message', WPDA_Dashboard::class, 'remove_new_dashboard_message' );
217 $this->loader->add_action( 'wp_ajax_wpda_widget_pub_add', WPDA_Widget_Publication::class, 'ajax_widget' );
218 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_add', WPDA_Widget_Google_Chart::class, 'ajax_widget' );
219 $this->loader->add_action( 'wp_ajax_wpda_widget_chart_refresh', WPDA_Widget_Google_Chart::class, 'ajax_refresh' );
220 $plugin_dictionary_list = new WPDA_Dictionary_Lists();
221 // Get tables for a specific database.
222 $this->loader->add_action( 'admin_action_wpda_get_tables', $plugin_dictionary_list, 'get_tables_ajax' );
223 // Get columns for a specific table.
224 $this->loader->add_action( 'admin_action_wpda_get_columns', $plugin_dictionary_list, 'get_columns' );
225 // Get row count for a specific table.
226 $this->loader->add_action( 'admin_action_wpda_get_table_row_count', $plugin_dictionary_list, 'get_table_row_count_ajax' );
227 // Get table widget info.
228 $this->loader->add_action( 'admin_action_wpda_get_table_widget_info', $plugin_dictionary_list, 'get_table_widget_info_ajax' );
229 // Global database search and replace.
230 $this->loader->add_action( 'wp_ajax_wpda_global_search', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'search' );
231 $this->loader->add_action( 'wp_ajax_wpda_global_replace', \WPDataAccess\Global_Search\WPDA_Global_Search::class, 'replace' );
232 // Export project.
233 $plugin_export_project = new WPDP_Export_Project();
234 $this->loader->add_action( 'admin_action_wpda_export_project', $plugin_export_project, 'export' );
235 // Data backup.
236 $wpda_data_backup = new WPDA_Data_Export();
237 $this->loader->add_action( 'wpda_data_backup', $wpda_data_backup, 'wpda_data_backup' );
238 // Allow to add multiple user roles.
239 $wpda_roles = new WPDA_Roles();
240 $this->loader->add_action( 'user_new_form', $wpda_roles, 'multiple_roles_selection' );
241 $this->loader->add_action( 'edit_user_profile', $wpda_roles, 'multiple_roles_selection' );
242 $this->loader->add_action( 'profile_update', $wpda_roles, 'multiple_roles_update' );
243 $this->loader->add_filter( 'manage_users_columns', $wpda_roles, 'multiple_roles_label' );
244 // Check if a remote db connection can be established via ajax.
245 $wpdadb = new WPDADB();
246 $this->loader->add_action( 'admin_action_wpda_check_remote_database_connection', $wpdadb, 'check_remote_database_connection' );
247 // Make WordPress user ID available to database connections.
248 add_action(
249 'wpda_dbinit',
250 function ( $wpdadb ) {
251 if ( null !== $wpdadb ) {
252 $suppress_errors = $wpdadb->suppress_errors( true );
253 $wpdadb->query( 'set @wpda_wp_user_id = ' . get_current_user_id() );
254 $wpdadb->suppress_errors( $suppress_errors );
255 }
256 },
257 10,
258 1
259 );
260 add_action(
261 'wp_ajax_wpda_dbinit_admin',
262 function () {
263 if ( !isset( $_POST['wpnonce'], $_POST['wpdaschema_name'] ) ) {
264 WPDA::sent_header( 'application/json' );
265 WPDA::sent_msg( 'ERROR', 'Invalid arguments' );
266 wp_die();
267 }
268 // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotValidated
269 $wpnonce = sanitize_text_field( wp_unslash( $_REQUEST['wpnonce'] ) );
270 if ( !WPDA::current_user_is_admin() || !wp_verify_nonce( $wpnonce, 'wpda_dbinit_admin_' . WPDA::get_current_user_login() ) ) {
271 WPDA::sent_header( 'application/json' );
272 WPDA::sent_msg( 'ERROR', 'Not authorized' );
273 wp_die();
274 }
275 $wpdaschema_name = sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) );
276 // phpcs:enable WordPress.Security.ValidatedSanitizedInput.InputNotValidated
277 $wpdadb = WPDADB::get_db_connection( $wpdaschema_name );
278 if ( null === $wpdadb ) {
279 WPDA::sent_header( 'application/json' );
280 WPDA::sent_msg( 'ERROR', 'Cannot connect to database' );
281 wp_die();
282 }
283 $suppress_errors = $wpdadb->suppress_errors( true );
284 $wpdadb->query( 'create function wpda_get_wp_user_id() returns integer deterministic no sql return @wpda_wp_user_id' );
285 $error = $wpdadb->last_error;
286 $wpdadb->suppress_errors( $suppress_errors );
287 if ( '' === $error ) {
288 // phpcs:ignore -- 8.1 proof
289 WPDA::sent_msg( 'OK', '' );
290 } else {
291 WPDA::sent_msg( 'ERROR', "Function not created [{$error}]" );
292 }
293 wp_die();
294 },
295 10,
296 1
297 );
298 // Add id to wpda_datatables.js (for IE).
299 $this->loader->add_filter(
300 'script_loader_tag',
301 $this,
302 'add_id_to_script',
303 10,
304 3
305 );
306 // Add CSV mapping calls.
307 $wpda_csv_uploads_model = new WPDA_CSV_Uploads_Model();
308 $this->loader->add_action( 'admin_action_wpda_save_csv_mapping', $wpda_csv_uploads_model, 'save_mapping' );
309 $this->loader->add_action( 'admin_action_wpda_csv_preview_mapping', $wpda_csv_uploads_model, 'preview_mapping' );
310 // Data Tables services.
311 $this->loader->add_action( 'wp_ajax_wpda_test_publication', \WPDataAccess\Data_Publisher\WPDA_Publisher_Form::class, 'test_publication' );
312 // Add custom CSS to freemius pages.
313 add_action(
314 'admin_footer',
315 function () {
316 if ( WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-account' === $this->page || WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-pricing' === $this->page ) {
317 ?>
318 <script type="application/javascript">
319 jQuery(function() {
320 jQuery.each(document.styleSheets, function (index, cssFile) {
321 if (cssFile.href!==null && cssFile.href.toString().includes("load-styles.php")) {
322 var classes = cssFile.rules || cssFile.cssRules;
323 for (var x=0; x<classes.length; x++) {
324 if (
325 classes[x].selectorText!==undefined &&
326 classes[x].selectorText!==null &&
327 classes[x].selectorText.includes("#adminmenu li.current a.menu-top")
328 ) {
329 jQuery("#adminmenu #toplevel_page_wpda a.menu-top").attr("style", classes[x].style.cssText);
330 }
331 }
332 }
333 });
334 });
335 </script>
336 <?php
337 }
338 },
339 10,
340 1
341 );
342 add_action(
343 'wpda_set_hard_row_count',
344 function ( $dbs, $tbl ) {
345 // Only admins and super admins.
346 if ( WPDA::current_user_is_admin() ) {
347 // Get actual row count.
348 $count = \WPDataAccess\API\WPDA_Actions::get_row_count( $dbs, $tbl );
349 // Get table settings.
350 $settings_db = WPDA_Table_Settings_Model::query( $tbl, $dbs );
351 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
352 // Convert string to JSON.
353 $settings = json_decode( $settings_db[0]['wpda_table_settings'], true );
354 if ( isset( $settings['table_settings']['row_count_estimate_value_hard'] ) ) {
355 // Store actual row count as hard estimate.
356 $settings['table_settings']['row_count_estimate_value_hard'] = $count;
357 // Save new hard row count.
358 WPDA_Table_Settings_Model::update( $tbl, json_encode( $settings ), $dbs );
359 }
360 }
361 }
362 },
363 10,
364 2
365 );
366 // Add WP Data Access dashboard to freemius pages
367 add_action( 'admin_enqueue_scripts', function () {
368 if ( 'wpda_navi-account' === $this->page || 'wpda_navi-pricing' === $this->page || 'wpda_navi-affiliation' === $this->page ) {
369 wp_enqueue_script( 'jquery-ui-sortable' );
370 wp_enqueue_script( 'jquery-ui-tooltip' );
371 wp_enqueue_style(
372 'wpdataaccess_dashboard',
373 plugins_url( '../assets/css/wpda_dashboard.css', __FILE__ ),
374 array(),
375 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
376 );
377 wp_enqueue_script(
378 'wpdataaccess_dashboard',
379 plugins_url( '../assets/js/wpda_dashboard.js', __FILE__ ),
380 array(),
381 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
382 false
383 );
384 wp_localize_script( 'wpdataaccess_dashboard', 'wpda_dashboard_vars', array(
385 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ),
386 ) );
387 // SAVING SPACE - According to the plugin guidelines it is allowed to include external fonts:
388 // https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/#8-plugins-may-not-send-executable-code-via-third-party-systems .
389 // Load fontawesome icons.
390 // phpcs:disable WordPress.WP.EnqueuedResourceParameters.MissingVersion
391 wp_enqueue_style(
392 'wpda_fontawesome_icons',
393 WPDA::CDN_FONTAWESOME . 'all.min.css',
394 array(),
395 null,
396 false
397 );
398 // phpcs:enable WordPress.WP.EnqueuedResourceParameters.MissingVersion
399 // Add dashboards to freemius pages
400 wp_enqueue_style(
401 'wpda_add_dashboard_freemius',
402 plugins_url( '../assets/css/wpda_freemius.css', __FILE__ ),
403 array(),
404 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
405 );
406 wp_enqueue_script(
407 'wpda_add_dashboard_freemius',
408 plugins_url( '../assets/js/wpda_freemius.js', __FILE__ ),
409 array(),
410 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
411 false
412 );
413 ob_start();
414 WPDA_Dashboard::add_dashboard();
415 $freemius_dashboard = ob_get_clean();
416 $freemius_title = '';
417 if ( 'wpda_navi-affiliation' === $this->page ) {
418 $freemius_title = '<h1 class="wp-heading-inline" style="padding-top: 10px">WP Data Access Affiliate Program</h1>';
419 } else {
420 if ( 'wpda_navi-pricing' === $this->page ) {
421 $freemius_title = '<h1 class="wp-heading-inline" style="padding-top: 10px">WP Data Access Plans and Pricing</h1><h2>Choose your plan and upgrade in minutes!</h2>';
422 } else {
423 if ( 'wpda_navi-account' === $this->page ) {
424 $freemius_title = '<h1 class="wp-heading-inline" style="padding-top: 10px">WP Data Access Account</h1>';
425 }
426 }
427 }
428 wp_localize_script( 'wpda_add_dashboard_freemius', 'dashboard', array(
429 'content' => $freemius_dashboard . $freemius_title,
430 ) );
431 // Remove notices
432 remove_all_actions( 'admin_notices' );
433 remove_all_actions( 'all_admin_notices' );
434 }
435 }, 9 );
436 }
437
438 /**
439 * Needed for JDT to support IE
440 *
441 * @param string $tag Tag.
442 * @param string $handle Handle.
443 * @param string $src Source.
444 * @return mixed|string
445 */
446 public function add_id_to_script( $tag, $handle, $src ) {
447 if ( 'wpda_datatables' === $handle ) {
448 // phpcs:disable WordPress.WP.EnqueuedResources.NonEnqueuedScript
449 $tag = '<script id="wpda_datatables" src="' . $src . '"></script>';
450 // phpcs:enable WordPress.WP.EnqueuedResources.NonEnqueuedScript
451 }
452 return $tag;
453 }
454
455 /**
456 * Add public hooks
457 *
458 * Initiates {@see WP_Data_Access_Public} (public functionality), {@see WPDA_Data_Tables} (ajax call to support
459 * server side jQuery DataTables functionality). Adds the appropriate actions to
460 * the loader.
461 *
462 * @since 1.0.0
463 *
464 * @see WP_Data_Access_Public
465 * @see WPDA_Data_Tables
466 * @see WPDA_Dictionary_Lists
467 */
468 private function define_public_hooks() {
469 $plugin_public = new WP_Data_Access_Public();
470 // Shortcodes.
471 $this->loader->add_action( 'init', $plugin_public, 'register_shortcodes' );
472 // Public scripts.
473 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
474 $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
475 $this->loader->add_action(
476 'admin_bar_menu',
477 $plugin_public,
478 'add_apps_to_admin_toolbar',
479 9999
480 );
481 $this->loader->add_action(
482 'admin_bar_menu',
483 $plugin_public,
484 'add_data_projects_to_admin_toolbar',
485 9999
486 );
487 // Ajax calls.
488 $plugin_datatables = new WPDA_Data_Tables();
489 $this->loader->add_action( 'wp_ajax_wpda_datatables', $plugin_datatables, 'get_data' );
490 $this->loader->add_action( 'wp_ajax_nopriv_wpda_datatables', $plugin_datatables, 'get_data' );
491 // Export action.
492 $this->loader->add_action( 'wp_ajax_wpda_export', WPDA_Export::class, 'export_ajax' );
493 $this->loader->add_action( 'wp_ajax_nopriv_wpda_export', WPDA_Export::class, 'export_ajax' );
494 // Add id to wpda_datatables.js (for IE).
495 $this->loader->add_filter(
496 'script_loader_tag',
497 $this,
498 'add_id_to_script',
499 10,
500 3
501 );
502 // Autocomplete.
503 $autocomplete_service = new WPDA_Autocomplete();
504 $this->loader->add_action( 'wp_ajax_wpda_autocomplete', $autocomplete_service, 'autocomplete' );
505 $this->loader->add_action( 'wp_ajax_nopriv_wpda_autocomplete', $autocomplete_service, 'autocomplete_anonymous' );
506 }
507
508 /**
509 * Start plugin loader
510 *
511 * @since 1.0.0
512 */
513 public function run() {
514 $this->loader->add_action( 'init', $this, 'register_blocks' );
515 $this->loader->add_action( 'enqueue_block_assets', $this, 'enqueue_block_assets' );
516 $this->loader->run();
517 }
518
519 public function register_blocks() {
520 register_block_type( plugin_dir_path( dirname( __FILE__ ) ) . 'assets/gtb', array(
521 'render_callback' => array($this, 'render_wp_data_access_app_block'),
522 ) );
523 }
524
525 public function enqueue_block_assets() {
526 wp_enqueue_style( 'dashicons' );
527 }
528
529 public function render_wp_data_access_app_block( $attributes ) {
530 $appid = ( isset( $attributes['appid'] ) ? sanitize_text_field( $attributes['appid'] ) : '' );
531 $feedback = filter_var( $attributes['feedback'] ?? false, FILTER_VALIDATE_BOOLEAN );
532 $builders = filter_var( $attributes['builders'] ?? false, FILTER_VALIDATE_BOOLEAN );
533 $hidetitlebar = filter_var( $attributes['hidetitlebar'] ?? false, FILTER_VALIDATE_BOOLEAN );
534 $fullscreen = filter_var( $attributes['fullscreen'] ?? false, FILTER_VALIDATE_BOOLEAN );
535 if ( empty( $appid ) ) {
536 return null;
537 }
538 if ( !shortcode_exists( 'wpda_app' ) ) {
539 return 'Shortcode wpda_app is not registered.';
540 }
541 $shortcode = sprintf(
542 '[wpda_app app_id="%s" builders="%s" feedback="%s" hidetitlebar="%s" fullscreen="%s"]',
543 esc_attr( $appid ),
544 ( $builders ? 'false' : 'true' ),
545 ( $feedback ? 'true' : 'false' ),
546 ( $hidetitlebar ? 'true' : 'false' ),
547 ( $fullscreen ? 'true' : 'false' )
548 );
549 $wrapper_attributes = get_block_wrapper_attributes( array(
550 'class' => 'wpda-wp-data-access-app',
551 ) );
552 return sprintf( '<div %s>%s</div>', $wrapper_attributes, do_shortcode( $shortcode ) );
553 }
554
555 /**
556 * Add plugin settings page
557 */
558 public function wpdataaccess_register_settings_page() {
559 add_options_page(
560 'WP Data Access',
561 'WP Data Access',
562 'manage_options',
563 WP_Data_Access_Admin::PAGE_SETTINGS,
564 array($this, 'wpdataaccess_settings_page')
565 );
566 }
567
568 /**
569 * Show settings page
570 */
571 public function wpdataaccess_settings_page() {
572 WPDA_Dashboard::add_dashboard();
573 $current_tab = ( isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'plugin' );
574 switch ( $current_tab ) {
575 case 'apps':
576 $wpda_settings_class_name = 'WPDA_Settings_Apps';
577 break;
578 case 'backend':
579 $wpda_settings_class_name = 'WPDA_Settings_BackEnd';
580 break;
581 case 'frontend':
582 $wpda_settings_class_name = 'WPDA_Settings_FrontEnd';
583 break;
584 case 'pds':
585 $wpda_settings_class_name = 'WPDA_Settings_PDS';
586 break;
587 case 'uninstall':
588 $wpda_settings_class_name = 'WPDA_Settings_Uninstall';
589 break;
590 case 'repository':
591 $wpda_settings_class_name = 'WPDA_Settings_ManageRepository';
592 break;
593 case 'system':
594 $wpda_settings_class_name = 'WPDA_Settings_SystemInfo';
595 break;
596 case 'mail':
597 $wpda_settings_class_name = 'WPDA_Settings_Mail';
598 break;
599 case 'drives':
600 $wpda_settings_class_name = 'WPDA_Settings_Drives';
601 break;
602 case 'legacy':
603 $wpda_settings_class_name = 'WPDA_Settings_Legacy';
604 break;
605 default:
606 $wpda_settings_class_name = 'WPDA_Settings_Plugin';
607 }
608 $wpda_settings_class_name = '\\WPDataAccess\\Settings\\' . $wpda_settings_class_name;
609 $wpda_settings = new $wpda_settings_class_name($current_tab);
610 $wpda_settings->show();
611 }
612
613 }
614
615 // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing