PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.81
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.81
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 / admin / class-wp-data-access-admin.php

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

1,179 lines 40.4 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\admin
7 */
8 use WPDataAccess\API\WPDA_API;
9 use WPDataAccess\API\WPDA_API_Core;
10 use WPDataAccess\Backup\WPDA_Data_Export;
11 use WPDataAccess\CSV_Files\WPDA_CSV_Import;
12 use WPDataAccess\Dashboard\WPDA_Dashboard;
13 use WPDataAccess\Data_Apps\WPDA_App_Builder;
14 use WPDataAccess\Data_Apps\WPDA_Data_Explorer;
15 use WPDataAccess\Data_Apps\WPDA_Table_Container;
16 use WPDataAccess\Global_Search\WPDA_Global_Search;
17 use WPDataAccess\List_Table\WPDA_List_View;
18 use WPDataAccess\Plugin_Table_Models\WPDA_App_Model;
19 use WPDataAccess\Plugin_Table_Models\WPDA_Design_Table_Model;
20 use WPDataAccess\Plugin_Table_Models\WPDA_Publisher_Model;
21 use WPDataAccess\Plugin_Table_Models\WPDA_User_Menus_Model;
22 use WPDataAccess\Premium\WPDAPRO_Data_Publisher\WPDAPRO_Data_Publisher_Manage_Styles;
23 use WPDataAccess\Settings\WPDA_Settings;
24 use WPDataAccess\Utilities\WPDA_Add_App_To_Menu;
25 use WPDataAccess\Utilities\WPDA_Repository;
26 use WPDataAccess\WPDA;
27 use WPDataAccess\WPDA_Navi\WPDA_Navi;
28 use WPDataProjects\WPDP;
29 /**
30 * Class WP_Data_Access_Admin
31 *
32 * Defines admin specific functionality for plugin WP Data Access.
33 *
34 * @author Peter Schulz
35 * @since 1.0.0
36 */
37 // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- verified on page
38 class WP_Data_Access_Admin {
39 /**
40 * Menu slug for main page
41 */
42 const PAGE_MAIN = 'wpda';
43
44 /**
45 * Menu slug for navigator page
46 */
47 const PAGE_NAVI = 'wpda_navi';
48
49 /**
50 * Menu slug for apps page
51 */
52 const PAGE_APPS = 'wpda_apps';
53
54 /**
55 * Menu slug for dashboard page
56 */
57 const PAGE_DASHBOARD = 'wpda_dashboard';
58
59 /**
60 * Menu slug for setting page
61 */
62 const PAGE_SETTINGS = 'wpdataaccess';
63
64 /**
65 * Menu slug for explorer page
66 */
67 const PAGE_EXPLORER = 'wpda_explorer';
68
69 /**
70 * Menu slug for query builder page
71 */
72 const PAGE_QUERY_BUILDER = 'wpda_query_builder';
73
74 /**
75 * Menu slug for Data Tables page
76 */
77 const PAGE_PUBLISHER = 'wpda_publisher';
78
79 /**
80 * Menu slug for charts page
81 */
82 const PAGE_CHARTS = 'wpda_charts';
83
84 /**
85 * Menu slug for designer page
86 */
87 const PAGE_DESIGNER = 'wpda_designer';
88
89 /**
90 * Plugin main page slug
91 */
92 const MAIN_PAGE_SLUG = self::PAGE_NAVI;
93
94 const PAGE_TABLE = 'wpda_table';
95
96 /**
97 * Menu slug for my tables page
98 */
99 const PAGE_MY_TABLES = 'wpda_my_tables';
100
101 /**
102 * Page hook suffix to Data Explorer page or false
103 *
104 * @var string|false
105 */
106 protected $wpda_data_explorer_menu;
107
108 protected $wpda_table;
109
110 /**
111 * Page hook suffix to Data Designer page or false
112 *
113 * @var string|false
114 */
115 protected $wpda_data_designer_menu;
116
117 /**
118 * Page hook suffix to Data Tables page or false
119 *
120 * @var string|false
121 */
122 protected $wpda_data_publisher_menu;
123
124 /**
125 * Page hook suffix to Charts page or false
126 *
127 * @var string|false
128 */
129 protected $wpda_charts_menu;
130
131 /**
132 * Reference to list view for Data Explorer page
133 *
134 * @var WPDA_List_View
135 */
136 protected $wpda_data_explorer_view;
137
138 /**
139 * Reference to list view for Data Designer page
140 *
141 * @var WPDA_List_View
142 */
143 protected $wpda_data_designer_view;
144
145 /**
146 * Reference to list view for Data Tables page
147 *
148 * @var WPDA_List_View
149 */
150 protected $wpda_data_publisher_view;
151
152 /**
153 * Reference to list view for Charts page
154 *
155 * @var WPDA_List_View
156 */
157 protected $wpda_charts_view;
158
159 /**
160 * Array of page hook suffixes to user defined sub menus
161 *
162 * @var array
163 */
164 protected $wpda_my_table_list_menu = array();
165
166 /**
167 * Array of list view for user defined sub menus
168 *
169 * @var array
170 */
171 protected $wpda_my_table_list_view = array();
172
173 /**
174 * Page hook suffix help page or false
175 *
176 * @var string|false
177 */
178 protected $wpda_help;
179
180 /**
181 * Menu slug or null
182 *
183 * @var null
184 */
185 protected $page = null;
186
187 /**
188 * Status loading indicator
189 *
190 * @var bool
191 */
192 protected $loaded_user_main_menu = false;
193
194 /**
195 * Main menu page
196 *
197 * @var null
198 */
199 protected $first_page = null;
200
201 /**
202 * WP_Data_Access_Admin constructor
203 *
204 * @since 1.0.0
205 */
206 public function __construct() {
207 if ( isset( $_REQUEST['page'] ) ) {
208 $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) );
209 }
210 }
211
212 private function load_app_css() {
213 // WPDataAccess apps CSS.
214 wp_register_style(
215 'wpda_apps',
216 plugins_url( '../assets/css/wpda_apps.css', __FILE__ ),
217 array(),
218 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
219 );
220 }
221
222 /**
223 * Add stylesheets to back-end
224 *
225 * The following stylesheets are added:
226 * + Plugin stylesheet
227 * + Visual editor stylesheet
228 *
229 * The plugin stylesheet is used to style the setting forms {@see WPDA_Settings}, simple forms
230 * {@see \WPDataAccess\Simple_Form\WPDA_Simple_Form}.
231 *
232 * @since 1.0.0
233 *
234 * @see WPDA_Settings
235 * @see \WPDataAccess\Simple_Form\WPDA_Simple_Form
236 * @see WP_Data_Access_Public
237 */
238 public function enqueue_styles() {
239 if ( !WPDA::is_plugin_page( $this->page ) ) {
240 // Admin styles are only added to plugin admin pages.
241 // App pages still require the apps.css file.
242 $apps = WPDA_App_Model::add_to_dashboard_menu();
243 $css_added = false;
244 for ($i = 0; $i < count( $apps ) && !$css_added; $i++) {
245 $settings = json_decode( $apps[$i]['app_settings'], true );
246 if ( isset( $settings['settings']['app_menu_title'] ) && $this->page === $settings['settings']['app_menu_title'] ) {
247 $this->load_app_css();
248 $css_added = true;
249 }
250 }
251 return;
252 }
253 if ( self::PAGE_NAVI === $this->page ) {
254 // WPDataAccess CSS.
255 wp_enqueue_style(
256 'wpdanavi',
257 plugins_url( '../assets/css/wpda_navi.css', __FILE__ ),
258 array(),
259 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
260 );
261 }
262 wp_enqueue_style( 'wp-jquery-ui-core' );
263 wp_enqueue_style( 'wp-jquery-ui-dialog' );
264 wp_enqueue_style( 'wp-jquery-ui-sortable' );
265 wp_enqueue_style( 'wp-jquery-ui-tabs' );
266 $this->load_app_css();
267 // WPDataAccess CSS.
268 wp_enqueue_style(
269 'wpdataaccess',
270 plugins_url( '../assets/css/wpda_style.css', __FILE__ ),
271 array(),
272 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
273 );
274 // WPDataAccess dashboard.
275 wp_register_style(
276 'wpdataaccess_dashboard',
277 plugins_url( '../assets/css/wpda_dashboard.css', __FILE__ ),
278 array(),
279 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
280 );
281 // Add WP Data Projects stylesheet.
282 wp_enqueue_style(
283 'wpdataprojects',
284 plugins_url( '../WPDataProjects/assets/css/wpdp_style.css', __FILE__ ),
285 array(),
286 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
287 );
288 // Register datetimepicker external library.
289 wp_register_style(
290 'datetimepicker',
291 plugins_url( '../assets/css/jquery.datetimepicker.min.css', __FILE__ ),
292 array(),
293 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
294 );
295 // Register JQuery DataTables to use data tables in the dashboard.
296 wp_register_style(
297 'jquery_datatables',
298 plugins_url( '../assets/css/jquery.dataTables.min.css', __FILE__ ),
299 array(),
300 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
301 );
302 // Register JQuery DataTables Responsive to use data tables in the dashboard.
303 wp_register_style(
304 'jquery_datatables_responsive',
305 plugins_url( '../assets/css/responsive.dataTables.min.css', __FILE__ ),
306 array(),
307 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
308 );
309 if ( self::PAGE_MAIN === $this->page || self::PAGE_APPS === $this->page || self::PAGE_DASHBOARD === $this->page || self::PAGE_QUERY_BUILDER === $this->page || self::PAGE_PUBLISHER === $this->page || self::PAGE_CHARTS === $this->page ) {
310 // Load UI smoothness theme.
311 wp_enqueue_style(
312 'wpda_ui_smoothness',
313 plugins_url( '../assets/css/jquery-ui.smoothness.min.css', __FILE__ ),
314 array(),
315 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
316 );
317 } else {
318 // Load UI darkness theme.
319 wp_enqueue_style(
320 'wpda_ui_darkness',
321 plugins_url( '../assets/css/jquery-ui.min.css', __FILE__ ),
322 array(),
323 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
324 );
325 }
326 $hide_button_icons = WPDA::get_option( WPDA::OPTION_BE_HIDE_BUTTON_ICONS );
327 if ( false !== $hide_button_icons && 'on' !== $hide_button_icons ) {
328 // SAVING SPACE - According to the plugin guidelines it is allowed to include external fonts:
329 // https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/#8-plugins-may-not-send-executable-code-via-third-party-systems .
330 // Load fontawesome icons.
331 // phpcs:disable WordPress.WP.EnqueuedResourceParameters.MissingVersion
332 wp_enqueue_style(
333 'wpda_fontawesome_icons',
334 WPDA::CDN_FONTAWESOME . 'all.min.css',
335 array(),
336 null,
337 false
338 );
339 // phpcs:enable WordPress.WP.EnqueuedResourceParameters.MissingVersion
340 }
341 if ( self::PAGE_PUBLISHER === $this->page ) {
342 wp_register_style(
343 'wpda_datatables_default',
344 plugins_url( '../assets/css/wpda_datatables_default.css', __FILE__ ),
345 array(),
346 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
347 );
348 // Add jQuery multiselect resources.
349 wp_enqueue_style(
350 'wpda_jquery_multiselect',
351 plugins_url( '../assets/css/jquery.multiselect.sortable.js.css', __FILE__ ),
352 array(),
353 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
354 false
355 );
356 }
357 if ( self::PAGE_QUERY_BUILDER === $this->page ) {
358 // Add Query Builder resources.
359 wp_enqueue_style(
360 'wpda_query_builder',
361 plugins_url( '../assets/css/wpda_query_builder.css', __FILE__ ),
362 array(),
363 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
364 );
365 wp_enqueue_style(
366 'wpda_jquery_json_viewer',
367 plugins_url( '../assets/css/jquery.json-viewer.css', __FILE__ ),
368 array(),
369 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
370 );
371 }
372 if ( !WPDA::current_user_is_admin() ) {
373 wp_enqueue_style(
374 'wpda_non_admin',
375 plugins_url( '../assets/css/wpda_non_admin.css', __FILE__ ),
376 array(),
377 WPDA::get_option( WPDA::OPTION_WPDA_VERSION )
378 );
379 }
380 }
381
382 /**
383 * Remove icons from buttons (if configured)
384 *
385 * @return void
386 */
387 public function remove_icons() {
388 if ( !WPDA::is_plugin_page( $this->page ) ) {
389 // Only executed on plugin pages.
390 return;
391 }
392 if ( 'on' === WPDA::get_option( WPDA::OPTION_BE_HIDE_BUTTON_ICONS ) ) {
393 echo '
394 <style>
395 i.fas.wpda_icon_on_button {
396 display: none;
397 }
398 </style>
399 ';
400 }
401 }
402
403 /**
404 * Add scripts to back-end
405 *
406 * @since 1.0.0
407 *
408 * @see WP_Data_Access_Public
409 */
410 public function enqueue_scripts() {
411 if ( !WPDA::is_plugin_page( $this->page ) ) {
412 // Admin styles are only added to plugin admin pages.
413 return;
414 }
415 wp_enqueue_script( 'jquery-ui-core' );
416 wp_enqueue_script( 'jquery-ui-dialog' );
417 wp_enqueue_script( 'jquery-ui-tabs' );
418 wp_enqueue_script( 'jquery-ui-sortable' );
419 wp_enqueue_script( 'jquery-ui-tooltip' );
420 wp_enqueue_script( 'jquery-ui-autocomplete' );
421 // Register wpda rest api.
422 wp_enqueue_script(
423 'wpda_rest_api',
424 plugins_url( '../assets/js/wpda_rest_api.js', __FILE__ ),
425 array('wp-api'),
426 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
427 false
428 );
429 wp_localize_script( 'wpda_rest_api', 'wpdaApiSettings', array(
430 'path' => WPDA_API::WPDA_NAMESPACE,
431 ) );
432 // Register wpda admin functions.
433 wp_enqueue_script(
434 'wpda_admin_scripts',
435 plugins_url( '../assets/js/wpda_admin.js', __FILE__ ),
436 array(),
437 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
438 false
439 );
440 wp_localize_script( 'wpda_admin_scripts', 'wpda_admin_vars', array(
441 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ),
442 ) );
443 // Register dashboard.
444 wp_register_script(
445 'wpdataaccess_dashboard',
446 plugins_url( '../assets/js/wpda_dashboard.js', __FILE__ ),
447 array(),
448 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
449 false
450 );
451 wp_localize_script( 'wpdataaccess_dashboard', 'wpda_dashboard_vars', array(
452 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ),
453 ) );
454 // Add WP Data Projects JS functions.RESEARCH.
455 wp_enqueue_script(
456 'wpdataprojects',
457 plugins_url( '../WPDataProjects/assets/js/wpdp_admin.js', __FILE__ ),
458 array(),
459 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
460 false
461 );
462 // Register jQuery DataTables to use data tables in the dashboard.
463 wp_register_script(
464 'jquery_datatables',
465 plugins_url( '../assets/js/jquery.dataTables.min.js', __FILE__ ),
466 array(),
467 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
468 false
469 );
470 // Register jQuery DataTables Responsive to use data tables in the dashboard.
471 wp_register_script(
472 'jquery_datatables_responsive',
473 plugins_url( '../assets/js/dataTables.responsive.min.js', __FILE__ ),
474 array(),
475 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
476 false
477 );
478 // Ajax call to WPDA datatables implementation to use data tables in the dashboard.
479 wp_register_script(
480 'wpda_datatables',
481 plugins_url( '../assets/js/wpda_datatables.js', __FILE__ ),
482 array(),
483 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
484 false
485 );
486 wp_localize_script( 'wpda_datatables', 'wpda_publication_vars', array(
487 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ),
488 ) );
489 // Register notify external library.
490 wp_enqueue_script(
491 'wpda_notify',
492 plugins_url( '../assets/js/notify.min.js', __FILE__ ),
493 array(),
494 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
495 false
496 );
497 // Register datetimepicker external library.
498 wp_register_script(
499 'datetimepicker',
500 plugins_url( '../assets/js/jquery.datetimepicker.full.min.js', __FILE__ ),
501 array(),
502 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
503 false
504 );
505 // Register clipboard.js.
506 wp_enqueue_script( 'clipboard' );
507 if ( self::PAGE_PUBLISHER === $this->page ) {
508 if ( isset( $_REQUEST['action'] ) && in_array( $_REQUEST['action'], array('view', 'new', 'edit'), true ) ) {
509 $json_editing = WPDA::get_option( WPDA::OPTION_DP_JSON_EDITING );
510 if ( WPDA::OPTION_DP_JSON_EDITING[1] === $json_editing ) {
511 // Register codeEditor to support JSON editing in Data Tables (table options advanced).
512 $cm_settings['codeEditor'] = wp_enqueue_code_editor( array(
513 'type' => 'application/json',
514 'codemirror' => array(
515 'autoRefresh' => true,
516 ),
517 ) );
518 wp_localize_script( 'wp-theme-plugin-editor', 'cm_settings', $cm_settings );
519 wp_enqueue_script( 'wp-theme-plugin-editor' );
520 }
521 // Add jQuery multiselect resources.
522 wp_enqueue_script(
523 'wpda_jquery_multiselect',
524 plugins_url( '../assets/js/jquery.multiselect.sortable.js', __FILE__ ),
525 array(),
526 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
527 false
528 );
529 }
530 }
531 if ( self::PAGE_CHARTS === $this->page ) {
532 $this->load_google_charts();
533 }
534 if ( self::PAGE_QUERY_BUILDER === $this->page ) {
535 // Add Query Builder resources.
536 wp_enqueue_script(
537 'wpda_query_builder',
538 plugins_url( '../assets/js/wpda_query_builder.js', __FILE__ ),
539 array(),
540 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
541 false
542 );
543 wp_enqueue_script(
544 'wpda_jquery_xml2json',
545 plugins_url( '../assets/js/jquery.xml2json.js', __FILE__ ),
546 array(),
547 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
548 false
549 );
550 wp_enqueue_script(
551 'wpda_jquery_json_viewer',
552 plugins_url( '../assets/js/jquery.json-viewer.js', __FILE__ ),
553 array(),
554 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
555 false
556 );
557 // Add codeEditor to query builder.
558 $cm_settings['codeEditor'] = wp_enqueue_code_editor( array(
559 'type' => 'text/x-sql',
560 'codemirror' => array(
561 'mode' => 'sql',
562 'lineNumbers' => true,
563 'autoRefresh' => true,
564 'lineWrapping' => true,
565 'styleActiveLine' => true,
566 ),
567 ) );
568 wp_enqueue_script( 'wp-theme-plugin-editor' );
569 wp_localize_script( 'wp-theme-plugin-editor', 'cm_settings', $cm_settings );
570 wp_enqueue_style( 'wp-codemirror' );
571 }
572 if ( self::PAGE_DASHBOARD === $this->page ) {
573 $this->load_google_charts();
574 // Load DBMS panels.
575 wp_enqueue_script(
576 'wpda_dbms',
577 plugins_url( '../assets/js/wpda_dbms.js', __FILE__ ),
578 array(),
579 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
580 false
581 );
582 wp_localize_script( 'wpda_dbms', 'wpda_dbms_vars', array(
583 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ),
584 ) );
585 }
586 wp_enqueue_media();
587 }
588
589 /**
590 * Load Google Charts resources
591 *
592 * @return void
593 */
594 private function load_google_charts() {
595 // Load Google Charts.
596 // phpcs:disable WordPress.WP.EnqueuedResourceParameters
597 wp_enqueue_script(
598 'wpda_google_charts',
599 WPDA::GOOGLE_CHARTS,
600 array(),
601 null,
602 false
603 );
604 // phpcs:enable WordPress.WP.EnqueuedResourceParameters
605 wp_enqueue_script(
606 'wpda_google_charts_fnc',
607 plugins_url( '../assets/js/wpda_google_charts.js', __FILE__ ),
608 array(),
609 WPDA::get_option( WPDA::OPTION_WPDA_VERSION ),
610 false
611 );
612 wp_localize_script( 'wpda_google_charts_fnc', 'wpda_chart_vars', array(
613 'wpda_ajaxurl' => admin_url( 'admin-ajax.php' ),
614 'wpda_chartdir' => plugin_dir_url( __FILE__ ) . '../assets/images/google_chart_types/',
615 'wpda_premium' => ( wpda_freemius()->can_use_premium_code__premium_only() ? 'true' : 'false' ),
616 ) );
617 }
618
619 /**
620 * Hide admin notices
621 *
622 * @return void
623 */
624 public function user_admin_notices() {
625 if ( WPDA::is_plugin_page( $this->page ) && 'on' === WPDA::get_option( WPDA::OPTION_PLUGIN_HIDE_NOTICES ) ) {
626 remove_all_actions( 'admin_notices' );
627 remove_all_actions( 'all_admin_notices' );
628 }
629 }
630
631 /**
632 * Add plugin menu and sub menus
633 *
634 * Adds the following menu and sub menus to the back-end menu:
635 * + WP Data Access
636 * + Data Explorer
637 * + Data Designer
638 * + Data Projects
639 * + Manage Plugin
640 *
641 * @since 1.0.0
642 */
643 public function add_menu_items() {
644 if ( WPDA::current_user_is_admin() ) {
645 if ( 'on' === WPDA::get_option( WPDA::OPTION_PLUGIN_HIDE_ADMIN_MENU ) ) {
646 // Show Data Projects.
647 $this->add_data_projects();
648 // Hide admin menu.
649 return;
650 }
651 if ( self::PAGE_MAIN === $this->page && isset( $_REQUEST['de'] ) ) {
652 if ( 'new' === $_REQUEST['de'] ) {
653 update_user_meta( WPDA::get_current_user_id(), 'wpda_data_explorer', 'new' );
654 } elseif ( 'old' === $_REQUEST['de'] ) {
655 update_user_meta( WPDA::get_current_user_id(), 'wpda_data_explorer', 'old' );
656 }
657 }
658 if ( self::PAGE_QUERY_BUILDER === $this->page && isset( $_REQUEST['qb'] ) ) {
659 if ( 'new' === $_REQUEST['qb'] ) {
660 update_user_meta( WPDA::get_current_user_id(), 'wpda_query_builder_version', 'new' );
661 } elseif ( 'old' === $_REQUEST['qb'] ) {
662 update_user_meta( WPDA::get_current_user_id(), 'wpda_query_builder_version', 'old' );
663 }
664 }
665 // Main menu and items are only available to admin users (set capability to 'manage_options').
666 add_menu_page(
667 'WP Data Access',
668 'WP Data Access',
669 'manage_options',
670 self::MAIN_PAGE_SLUG,
671 null,
672 'dashicons-database',
673 999999999
674 );
675 // Add navigator page to WPDA menu.
676 add_submenu_page(
677 self::MAIN_PAGE_SLUG,
678 'WP Data Access',
679 'Tool Guide',
680 'manage_options',
681 self::PAGE_NAVI,
682 array($this, 'data_navi')
683 );
684 // Add apps to menu.
685 add_submenu_page(
686 self::MAIN_PAGE_SLUG,
687 'WP Data Access',
688 'App Builder',
689 'manage_options',
690 self::PAGE_APPS,
691 array($this, 'data_apps')
692 );
693 // Add data explorer to WPDA menu.
694 $this->wpda_data_explorer_menu = add_submenu_page(
695 self::MAIN_PAGE_SLUG,
696 'WP Data Access',
697 'Data Explorer',
698 'manage_options',
699 self::PAGE_MAIN,
700 array($this, 'data_explorer_page')
701 );
702 // Add data explorer to WPDA menu.
703 $this->wpda_table = add_submenu_page(
704 self::PAGE_TABLE,
705 'WP Data Access',
706 'Data Explorer',
707 'manage_options',
708 self::PAGE_TABLE,
709 array($this, 'data_explorer_table_page')
710 );
711 // Add submenu for Query Builder.
712 $current_query_builder_version = get_user_meta( WPDA::get_current_user_id(), 'wpda_query_builder_version', true );
713 $this->wpda_data_publisher_menu = add_submenu_page(
714 self::MAIN_PAGE_SLUG,
715 'WP Data Access',
716 'SQL Query Builder',
717 'manage_options',
718 self::PAGE_QUERY_BUILDER,
719 array($this, ( $current_query_builder_version === 'old' ? 'query_builder_old' : 'query_builder' ))
720 );
721 // Add submenu for Data Tables.
722 $this->wpda_data_publisher_menu = add_submenu_page(
723 self::MAIN_PAGE_SLUG,
724 'WP Data Access',
725 'Table Builder',
726 'manage_options',
727 self::PAGE_PUBLISHER,
728 array($this, 'data_publisher_page')
729 );
730 if ( self::PAGE_PUBLISHER === $this->page ) {
731 $this->wpda_data_publisher_view = new WPDA_List_View(array(
732 'page_hook_suffix' => $this->wpda_data_publisher_menu,
733 'table_name' => WPDA_Publisher_Model::get_base_table_name(),
734 'list_table_class' => 'WPDataAccess\\Data_Publisher\\WPDA_Publisher_List_Table',
735 'edit_form_class' => 'WPDataAccess\\Data_Publisher\\WPDA_Publisher_Form',
736 ));
737 }
738 // Add Data Projects menu.
739 $wpdp = new WPDP(self::MAIN_PAGE_SLUG);
740 $wpdp->add_menu_items();
741 // Add data designer to WPDA menu.
742 $this->wpda_data_designer_menu = add_submenu_page(
743 self::MAIN_PAGE_SLUG,
744 'WP Data Access',
745 'Data Designer',
746 'manage_options',
747 self::PAGE_DESIGNER,
748 array($this, 'data_designer_page')
749 );
750 if ( self::PAGE_DESIGNER === $this->page ) {
751 $this->wpda_data_designer_view = new WPDA_List_View(array(
752 'page_hook_suffix' => $this->wpda_data_designer_menu,
753 'table_name' => WPDA_Design_Table_Model::get_base_table_name(),
754 'list_table_class' => 'WPDataAccess\\Design_Table\\WPDA_Design_Table_List_Table',
755 'edit_form_class' => 'WPDataAccess\\Design_Table\\WPDA_Design_Table_Form',
756 'subtitle' => '',
757 ));
758 }
759 } else {
760 $this->grant_access_to_dashboard();
761 $this->grant_access_to_data_publications();
762 }
763 $this->add_data_projects();
764 $this->add_apps();
765 }
766
767 /**
768 * Remove plugin sub menu items (when in dashboard mode)
769 *
770 * @param mixed $submenu_file Dashboard menu items.
771 * @return mixed
772 */
773 public function wpda_submenu_filter( $submenu_file ) {
774 if ( WPDA::current_user_is_admin() ) {
775 $hidden_submenus = array(
776 self::PAGE_DASHBOARD,
777 self::PAGE_CHARTS,
778 self::PAGE_PUBLISHER,
779 WPDP::PAGE_MAIN,
780 self::PAGE_DESIGNER,
781 WPDP::PAGE_TEMPLATES,
782 self::MAIN_PAGE_SLUG . '-account',
783 self::MAIN_PAGE_SLUG . '-wp-support-forum'
784 );
785 foreach ( $hidden_submenus as $submenu ) {
786 remove_submenu_page( self::MAIN_PAGE_SLUG, $submenu );
787 }
788 } else {
789 global $submenu;
790 $submenu[self::PAGE_MAIN][0][2] = self::PAGE_DASHBOARD;
791 // phpcs:ignore WordPress.WP.GlobalVariablesOverride
792 }
793 return $submenu_file;
794 }
795
796 /**
797 * Add apps to dashboard menu.
798 *
799 * @return void
800 */
801 protected function add_apps() {
802 // Add apps to dashbaord menu
803 $apps = new WPDA_Add_App_To_Menu();
804 $apps->add_apps_to_menu();
805 }
806
807 /**
808 * Add Data Projects and Project Templates to plugin navigation
809 *
810 * @return void
811 */
812 protected function add_data_projects() {
813 // Add Data Projects.
814 $wpdp = new WPDP();
815 $wpdp->add_projects();
816 }
817
818 /**
819 * Allow authorized users to access WP Data Access dashboard
820 *
821 * @return void
822 */
823 protected function grant_access_to_dashboard() {
824 // Check user role.
825 $user_roles = WPDA::get_current_user_roles();
826 if ( false === $user_roles || !is_array( $user_roles ) ) {
827 // Cannot determine the user roles (not able to show menus).
828 return;
829 }
830 // Check dashboard role access.
831 $dashboard_roles = get_option( \WPDataAccess\Settings\WPDA_Settings_Legacy_Dashboard::DASHBOARD_ROLES );
832 $user_has_role = false;
833 foreach ( $user_roles as $user_role ) {
834 if ( false !== strpos( $dashboard_roles, $user_role ) ) {
835 $user_has_role = true;
836 break;
837 }
838 }
839 // Check dashboard user access.
840 $dashboard_users = get_option( \WPDataAccess\Settings\WPDA_Settings_Legacy_Dashboard::DASHBOARD_USERS );
841 $user_has_access = false !== strpos( $dashboard_users, WPDA::get_current_user_login() );
842 if ( !$user_has_role && !$user_has_access ) {
843 return;
844 }
845 // User has dashboard access: add menu item.
846 $this->create_non_admin_menu( self::PAGE_DASHBOARD );
847 add_submenu_page(
848 $this->first_page,
849 'Dashboard',
850 'Dashboard',
851 WPDA::get_current_user_capability(),
852 self::PAGE_DASHBOARD,
853 array($this, 'data_dashboard_page')
854 );
855 }
856
857 /**
858 * Allow authorized users to access Data Tables
859 *
860 * @return void
861 */
862 protected function grant_access_to_data_publications() {
863 // Check user role.
864 $user_roles = WPDA::get_current_user_roles();
865 if ( false === $user_roles || !is_array( $user_roles ) ) {
866 // Cannot determine the user roles (not able to show menus).
867 return;
868 }
869 $publication_roles = WPDA::get_option( WPDA::OPTION_DP_PUBLICATION_ROLES );
870 if ( '' === $publication_roles || 'administrator' === $publication_roles ) {
871 // No access.
872 return;
873 }
874 $user_has_role = false;
875 foreach ( $user_roles as $user_role ) {
876 if ( false !== stripos( $publication_roles, $user_role ) ) {
877 $user_has_role = true;
878 }
879 }
880 if ( !$user_has_role ) {
881 // No access.
882 return;
883 }
884 // Grant access to main menu.
885 $this->create_non_admin_menu( self::PAGE_PUBLISHER );
886 // Add submenu for Data Tables.
887 $this->wpda_data_publisher_menu = add_submenu_page(
888 $this->first_page,
889 'WP Data Access',
890 'Data Tables',
891 WPDA::get_current_user_capability(),
892 self::PAGE_PUBLISHER,
893 array($this, 'data_publisher_page')
894 );
895 if ( self::PAGE_PUBLISHER === $this->page ) {
896 global $wpdb;
897 $this->wpda_data_publisher_view = new WPDA_List_View(array(
898 'page_hook_suffix' => $this->wpda_data_publisher_menu,
899 'table_name' => $wpdb->prefix . 'wpda_publisher',
900 'list_table_class' => 'WPDataAccess\\Data_Publisher\\WPDA_Publisher_List_Table',
901 'edit_form_class' => 'WPDataAccess\\Data_Publisher\\WPDA_Publisher_Form',
902 ));
903 }
904 }
905
906 /**
907 * Add dashboard page
908 *
909 * @return void
910 */
911 public function data_dashboard_page() {
912 WPDA_Dashboard::add_dashboard( true );
913 }
914
915 public function data_explorer_page() {
916 WPDA_Dashboard::add_dashboard();
917 if ( isset( $_REQUEST['page_action'] ) && 'wpda_backup' === $_REQUEST['page_action'] ) {
918 $this->backup_page();
919 } elseif ( isset( $_REQUEST['page_action'] ) && 'wpda_import_csv' === $_REQUEST['page_action'] ) {
920 $this->import_csv();
921 } elseif ( isset( $_REQUEST['page_action'] ) && 'wpda_global_search' === $_REQUEST['page_action'] ) {
922 $this->advanced_search();
923 } else {
924 $explorer = new WPDA_Data_Explorer();
925 $explorer->show();
926 }
927 }
928
929 public function data_explorer_table_page() {
930 WPDA_Dashboard::add_dashboard();
931 if ( !isset(
932 $_POST['dbs'],
933 $_POST['tbl'],
934 $_POST['s'],
935 $_POST['c']
936 ) ) {
937 wp_die( esc_attr__( 'ERROR: Invalid usage', 'wp-data-access' ) );
938 }
939 $dbs = WPDA_API_Core::sanitize_db_identifier( sanitize_text_field( wp_unslash( $_POST['dbs'] ) ) );
940 $tbl = WPDA_API_Core::sanitize_db_identifier( sanitize_text_field( wp_unslash( $_POST['tbl'] ) ) );
941 $s = WPDA_API_Core::sanitize_db_identifier( sanitize_text_field( wp_unslash( $_POST['s'] ) ) );
942 $c = WPDA_API_Core::sanitize_db_identifier( sanitize_text_field( wp_unslash( $_POST['c'] ) ) );
943 $explorer = new WPDA_Table_Container(array(
944 'dbs' => $dbs,
945 'tbl' => $tbl,
946 's' => $s,
947 'c' => $c,
948 ));
949 $explorer->show();
950 }
951
952 public function data_navi() {
953 if ( isset( $_POST['wpda-legacy-tool-status'] ) ) {
954 // Legacy tools update
955 $update_status = json_decode( sanitize_text_field( wp_unslash( $_POST['wpda-legacy-tool-status'] ) ), true );
956 if ( null !== $update_status ) {
957 if ( isset(
958 $update_status['tables'],
959 $update_status['forms'],
960 $update_status['templates'],
961 $update_status['designer'],
962 $update_status['dashboards'],
963 $update_status['charts']
964 ) ) {
965 // Get current legacy tool settings
966 $option_legacy_tools = \WPDataAccess\Utilities\WPDA_Legacy_Tool_Visibility::get();
967 // Update legacy tool settings
968 $option_legacy_tools['tables'][0] = $update_status['tables'];
969 $option_legacy_tools['forms'][0] = $update_status['forms'];
970 $option_legacy_tools['templates'][0] = $update_status['templates'];
971 $option_legacy_tools['designer'][0] = $update_status['designer'];
972 $option_legacy_tools['dashboards'][0] = $update_status['dashboards'];
973 $option_legacy_tools['charts'][0] = $update_status['charts'];
974 // Save legacy tool settings
975 WPDA::set_option( WPDA::OPTION_PLUGIN_LEGACY_TOOLS, $option_legacy_tools );
976 }
977 }
978 }
979 WPDA_Dashboard::add_dashboard();
980 $navi = new WPDA_Navi();
981 $navi->show();
982 }
983
984 public function data_apps() {
985 WPDA_Dashboard::add_dashboard();
986 $wpda_app_builder = new WPDA_App_Builder();
987 $wpda_app_builder->show();
988 }
989
990 public function advanced_search() {
991 $advanced_search = new WPDA_Global_Search();
992 $advanced_search->show();
993 }
994
995 /**
996 * Add Query Builder
997 *
998 * @return void
999 */
1000 public function query_builder() {
1001 WPDA_Dashboard::add_dashboard();
1002 $query_builder = new \WPDataAccess\Data_Apps\WPDA_Query_Builder();
1003 $query_builder->show();
1004 }
1005
1006 public function query_builder_old() {
1007 WPDA_Dashboard::add_dashboard();
1008 $query_builder = new \WPDataAccess\Query_Builder\WPDA_Query_Builder();
1009 $query_builder->show();
1010 }
1011
1012 /**
1013 * Add CSV page
1014 *
1015 * @return void
1016 */
1017 public function import_csv() {
1018 $csv_import = new WPDA_CSV_Import();
1019 $csv_import->show();
1020 }
1021
1022 /**
1023 * Show data designer main page
1024 *
1025 * Initialization of $this->wpda_data_designer_view is done earlier in
1026 * {@see WP_Data_Access_Admin::add_menu_items()} to support screen options. This method just shows the page
1027 * containing the list table.
1028 *
1029 * @since 1.0.0
1030 *
1031 * @see WP_Data_Access_Admin::add_menu_items()
1032 */
1033 public function data_designer_page() {
1034 WPDA_Dashboard::add_dashboard();
1035 $data_designer_table_found = WPDA_Design_Table_Model::table_exists();
1036 if ( $data_designer_table_found ) {
1037 $this->wpda_data_designer_view->show();
1038 } else {
1039 $this->data_designer_page_not_found();
1040 }
1041 }
1042
1043 /**
1044 * Data Designer repository table not found
1045 */
1046 public function data_designer_page_not_found() {
1047 WPDA_Dashboard::add_dashboard();
1048 $wpda_repository = new WPDA_Repository();
1049 $wpda_repository->inform_user();
1050 ?>
1051 <div class="wrap">
1052 <h1 class="wp-heading-inline">
1053 <span>Data Designer</span>
1054 <a href="https://docs.legacy.wpdataaccess.com/docs/data-designer-getting-started/" target="_blank" class="wpda_tooltip" title="Plugin Help - opens in a new tab or window">
1055 <span class="dashicons dashicons-editor-help" style="text-decoration:none;vertical-align:top;font-size:30px;">
1056 </span>
1057 </a>
1058 </h1>
1059 <p>
1060 <?php
1061 esc_html_e( 'ERROR: Repository table not found!', 'wp-data-access' );
1062 ?>
1063 </p>
1064 </div>
1065 <?php
1066 }
1067
1068 /**
1069 * Show Data Tables main page
1070 */
1071 public function data_publisher_page() {
1072 if ( WPDA::current_user_is_admin() ) {
1073 WPDA_Dashboard::add_dashboard();
1074 }
1075 $data_publisher_table_found = WPDA_Publisher_Model::table_exists();
1076 if ( $data_publisher_table_found ) {
1077 $this->wpda_data_publisher_view->show();
1078 } else {
1079 $this->data_publisher_page_not_found();
1080 }
1081 }
1082
1083 public function data_publisher_mngstl() {
1084 $mngstl = new WPDAPRO_Data_Publisher_Manage_Styles();
1085 $mngstl->show();
1086 }
1087
1088 /**
1089 * Add Charts page
1090 *
1091 * @return void
1092 */
1093 public function data_charts_page() {
1094 }
1095
1096 /**
1097 * Data Tables repository table not found
1098 */
1099 public function data_publisher_page_not_found() {
1100 if ( WPDA::current_user_is_admin() ) {
1101 WPDA_Dashboard::add_dashboard();
1102 }
1103 $wpda_repository = new WPDA_Repository();
1104 $wpda_repository->inform_user();
1105 ?>
1106 <div class="wrap">
1107 <h1 class="wp-heading-inline">
1108 <span>Data Tables</span>
1109 <a href="https://docs.legacy.wpdataaccess.com/docs/data-tables-getting-started/" target="_blank" class="wpda_tooltip" title="Plugin Help - opens in a new tab or window">
1110 <span class="dashicons dashicons-editor-help" style="text-decoration:none;vertical-align:top;font-size:30px;">
1111 </span>
1112 </a>
1113 </h1>
1114 <p>
1115 <?php
1116 esc_html_e( 'ERROR: Repository table not found!', 'wp-data-access' );
1117 ?>
1118 </p>
1119 </div>
1120 <?php
1121 }
1122
1123 /**
1124 * Show data backup main page
1125 *
1126 * Calls a page to create automatic backups (in fact data exports) and offers possibilities to restore (in fact
1127 * data imports).
1128 *
1129 * @since 2.0.6
1130 *
1131 * @see WPDA_Data_Export::show_wp_cron()
1132 */
1133 public function backup_page() {
1134 $wpda_backup = new WPDA_Data_Export();
1135 $wp_nonce = ( isset( $_REQUEST['wp_nonce'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wp_nonce'] ) ) : '?' );
1136 if ( isset( $_REQUEST['action'] ) && wp_verify_nonce( $wp_nonce, 'wpda-backup-' . WPDA::get_current_user_login() ) ) {
1137 $action = sanitize_text_field( wp_unslash( $_REQUEST['action'] ) );
1138 if ( 'new' === $action ) {
1139 $wpda_backup->create_export( 'add' );
1140 } elseif ( 'add' === $action ) {
1141 $wpda_backup->wpda_add_cron_job();
1142 } elseif ( 'remove' === $action ) {
1143 $wpda_backup->wpda_remove_cron_job();
1144 } elseif ( 'edit' === $action ) {
1145 $wpda_backup->create_export( 'update' );
1146 } elseif ( 'update' === $action ) {
1147 $wpda_backup->wpda_update_cron_job();
1148 }
1149 } else {
1150 $wpda_backup->show_wp_cron();
1151 }
1152 }
1153
1154 /**
1155 * Add main menu for non admin user
1156 *
1157 * @param string $first_page First plugin page.
1158 * @return void
1159 */
1160 protected function create_non_admin_menu( $first_page ) {
1161 if ( !$this->loaded_user_main_menu ) {
1162 add_menu_page(
1163 'WP Data Access',
1164 'WP Data Access',
1165 WPDA::get_current_user_capability(),
1166 $first_page,
1167 function () {
1168 },
1169 'dashicons-database-view',
1170 999999999
1171 );
1172 $this->loaded_user_main_menu = true;
1173 $this->first_page = $first_page;
1174 }
1175 }
1176
1177 }
1178
1179 // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing