PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.79
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.79
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.79, at includes/class-wp-data-access.php

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