PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.83
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.83
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 5.5.41 5.5.42 5.5.43 All 159 releases
wp-data-access / includes / class-wp-data-access.php

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

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