PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.2
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.2
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 / WPDataProjects / WPDP.php

WPDP.php in WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards 5.2, at WPDataProjects/WPDP.php

541 lines 21.8 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 WPDataProjects
7 */
8 namespace WPDataProjects;
9
10 use WPDataAccess\Plugin_Table_Models\WPDP_Page_Model ;
11 use WPDataAccess\Plugin_Table_Models\WPDP_Project_Model ;
12 use WPDataAccess\Plugin_Table_Models\WPDP_Project_Design_Table_Model ;
13 use WPDataAccess\Utilities\WPDA_Repository ;
14 use WPDataAccess\WPDA ;
15 use WPDataProjects\Project\WPDP_Project_Project_View ;
16 use WPDataProjects\Project\WPDP_Project_Table_View ;
17 use WPDataAccess\Dashboard\WPDA_Dashboard ;
18 /**
19 * Class WPDP
20 *
21 * Implements Data Projects and Project Templates pages:
22 * (1) WPDP_Project_Project_View - To manage Data Projects
23 * (2) WPDP_Project_Table_View - To manage Table Options
24 *
25 * @author Peter Schulz
26 * @since 2.0.0
27 */
28 class WPDP
29 {
30 /**
31 * Menu slug of Data Project page
32 */
33 const PAGE_MAIN = 'wpda_wpdp' ;
34 /**
35 * Menu slug of Project Templates page
36 */
37 const PAGE_TEMPLATES = 'wpda_templates' ;
38 /**
39 * Menu slug taken from URL
40 *
41 * @var null
42 */
43 protected $page = null ;
44 /**
45 * Templates Page title
46 */
47 protected $projects_page_title ;
48 /**
49 * Projects Page title
50 */
51 protected $templates_page_title ;
52 /**
53 * Data Projects menu
54 *
55 * @var
56 */
57 protected $wpdp_projects_menu ;
58 /**
59 * Handle to Data Projects view
60 *
61 * @var
62 */
63 protected $wpdp_projects_view ;
64 /**
65 * Handle to Project Templates view
66 *
67 * @var
68 */
69 protected $wpdp_templates_view ;
70 /**
71 * Used for static pages
72 *
73 * @var
74 */
75 protected $wpdp_projects_content ;
76 /**
77 * Arrary containing all project pages
78 *
79 * @var
80 */
81 protected $wpdp_project_menus ;
82 /**
83 * Array containing all project page views
84 *
85 * @var
86 */
87 protected $wpdp_project_views ;
88 protected $wp_admin_toolbar = array() ;
89 protected $main_menu_slug = null ;
90 /**
91 * WPDP constructor
92 */
93 public function __construct( $main_menu_slug = null )
94 {
95
96 if ( isset( $_REQUEST['page'] ) ) {
97 $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) );
98 // input var okay.
99 }
100
101 $this->main_menu_slug = $main_menu_slug;
102 $this->projects_page_title = 'Data Projects';
103 $this->template_page_title = 'Project Templates';
104 }
105
106 /**
107 * Add menu items
108 *
109 * Adds Data Projects tool to dashboard menu.
110 */
111 public function add_menu_items()
112 {
113
114 if ( current_user_can( 'manage_options' ) ) {
115 if ( 'on' === WPDA::get_option( WPDA::OPTION_PLUGIN_HIDE_ADMIN_MENU ) ) {
116 // Hide admin menu
117 return;
118 }
119 global $wpdb ;
120 // Add Data Projects menu
121 $this->wpdp_projects_menu = add_submenu_page(
122 $this->main_menu_slug,
123 'Data Projects',
124 'Data Projects',
125 'manage_options',
126 self::PAGE_MAIN,
127 [ $this, 'data_projects_page' ]
128 );
129 if ( $this->page === self::PAGE_MAIN ) {
130 $this->wpdp_projects_view = new WPDP_Project_Project_View( [
131 'page_hook_suffix' => $this->wpdp_projects_menu,
132 'table_name' => $wpdb->prefix . 'wpda_project',
133 'edit_form_class' => 'WPDataProjects\\Project\\WPDP_Project_Project_Form',
134 'list_table_class' => 'WPDataProjects\\Project\\WPDP_Project_Project_List',
135 'title' => $this->projects_page_title,
136 ] );
137 }
138 // Add Project Templates menu
139 $this->wpdp_projects_menu = add_submenu_page(
140 $this->main_menu_slug,
141 'Project Templates',
142 'Project Templates',
143 'manage_options',
144 self::PAGE_TEMPLATES,
145 [ $this, 'project_templates_page' ]
146 );
147 if ( $this->page === self::PAGE_TEMPLATES ) {
148 $this->wpdp_templates_view = new WPDP_Project_Table_View( [
149 'page_hook_suffix' => $this->wpdp_projects_menu,
150 'table_name' => $wpdb->prefix . 'wpda_project_table',
151 'list_table_class' => 'WPDataProjects\\Project\\WPDP_Project_Table_List',
152 'edit_form_class' => 'WPDataProjects\\Project\\WPDP_Project_Table_Form',
153 'title' => $this->template_page_title,
154 'subtitle' => '',
155 ] );
156 }
157 }
158
159 }
160
161 /**
162 * Implementation of the Data Projects page
163 */
164 public function data_projects_page()
165 {
166 WPDA_Dashboard::add_dashboard();
167 // Check for repository tables to prevent dashboard errors.
168
169 if ( WPDP_Project_Design_Table_Model::table_exists() && WPDP_Project_Model::table_exists() ) {
170 $this->wpdp_projects_view->show();
171 } else {
172 $this->data_projects_page_not_found();
173 }
174
175 }
176
177 /**
178 * Implementation of the Project Templates page
179 */
180 public function project_templates_page()
181 {
182 WPDA_Dashboard::add_dashboard();
183 // Check for repository tables to prevent dashboard errors.
184
185 if ( WPDP_Page_Model::table_exists() ) {
186 $this->wpdp_templates_view->show();
187 } else {
188 $this->data_projects_page_not_found();
189 }
190
191 }
192
193 /**
194 * Data Designer repository table not found
195 */
196 public function data_projects_page_not_found()
197 {
198 $wpda_repository = new WPDA_Repository();
199 $wpda_repository->inform_user();
200 ?>
201 <div class="wrap">
202 <h1 class="wp-heading-inline">
203 <span><?php
204 echo $this->projects_page_title ;
205 ?></span>
206 <a href="<?php
207 echo 'https://wpdataaccess.com/docs/documentation/data-projects/data-projects-getting-started/' ;
208 ?>" target="_blank">
209 <span class="dashicons dashicons-editor-help"
210 style="text-decoration:none;vertical-align:top;font-size:30px;">
211 </span></a>
212 </h1>
213 <p>
214 <?php
215 echo __( 'ERROR: Repository table(s) not found!', 'wp-data-access' ) ;
216 ?>
217 </p>
218 </div>
219 <?php
220 }
221
222 public function project_templates_page_not_found()
223 {
224 $wpda_repository = new WPDA_Repository();
225 $wpda_repository->inform_user();
226 ?>
227 <div class="wrap">
228 <h1 class="wp-heading-inline">
229 <span><?php
230 echo $this->projects_page_title ;
231 ?></span>
232 <a href="<?php
233 echo 'https://wpdataaccess.com/docs/documentation/project-templates/gettings-started/' ;
234 ?>" target="_blank">
235 <span class="dashicons dashicons-editor-help"
236 style="text-decoration:none;vertical-align:top;font-size:30px;">
237 </span></a>
238 </h1>
239 <p>
240 <?php
241 echo __( 'ERROR: Repository table(s) not found!', 'wp-data-access' ) ;
242 ?>
243 </p>
244 </div>
245 <?php
246 }
247
248 /**
249 * Add projects to menu
250 *
251 * Menu items are taken from active projects. Project pages marked as "add to menu" are added to the
252 * dashboard menu.
253 */
254 public function add_projects()
255 {
256 if ( !is_admin() && 'on' !== WPDA::get_option( WPDA::OPTION_FE_ADD_PROJECTS_TO_TOOLBAR ) ) {
257 return;
258 }
259 if ( !WPDP_Project_Model::table_exists() ) {
260 // Missing repository table
261 return;
262 }
263 // Add project Menus.
264 global $wpdb ;
265 $project_project_table_name = $wpdb->prefix . 'wpda_project';
266 $project_page_table_name = $wpdb->prefix . 'wpda_project_page';
267 $query_projects = "select * from {$project_project_table_name} where add_to_menu = 'Yes' order by project_sequence";
268 $projects = $wpdb->get_results( $query_projects, 'ARRAY_A' );
269 // phpcs:ignore Standard.Category.SniffName.ErrorCode
270 if ( sizeof( $projects ) > 0 ) {
271 // Check for repository tables to prevent dashboard errors.
272 if ( !WPDP_Project_Design_Table_Model::table_exists() || !WPDP_Page_Model::table_exists() ) {
273 return;
274 }
275 }
276 foreach ( $projects as $project ) {
277
278 if ( null === $project['menu_name'] || '' === trim( $project['menu_name'] ) ) {
279 $menu_name = 'UNNAMED';
280 } else {
281 $menu_name = $project['menu_name'];
282 }
283
284 $user_roles = WPDA::get_current_user_roles();
285 if ( false === $user_roles ) {
286 // Cannot determine the user role(s). Not able to show project menus.
287 break;
288 }
289 $query_pages = $wpdb->prepare( " select * from {$project_page_table_name} " . " where project_id = %d " . " and add_to_menu = 'Yes' " . " order by page_sequence", [ $project['project_id'] ] );
290 $pages = $wpdb->get_results( $query_pages, 'ARRAY_A' );
291 // phpcs:ignore Standard.Category.SniffName.ErrorCode
292 $project_menu_shown = false;
293 foreach ( $pages as $page ) {
294 $user_has_role = false;
295
296 if ( '' === $page['page_role'] || null === $page['page_role'] ) {
297 $user_has_role = in_array( 'administrator', $user_roles );
298 } else {
299 $user_role_array = explode( ',', $page['page_role'] );
300 foreach ( $user_role_array as $user_role_array_item ) {
301 $user_has_role = in_array( $user_role_array_item, $user_roles );
302 if ( $user_has_role ) {
303 break;
304 }
305 }
306 }
307
308 if ( $user_has_role ) {
309
310 if ( is_admin() ) {
311 $page_name = self::PAGE_MAIN . '_' . $page['project_id'] . '_' . $page['page_id'];
312 $page_schema_name = $page['page_schema_name'];
313 $page_table_name = $page['page_table_name'];
314 $page_type = $page['page_type'];
315
316 if ( !$project_menu_shown ) {
317 $main_page_name = $page_name;
318 add_menu_page(
319 $menu_name,
320 $menu_name,
321 WPDA::get_current_user_capability(),
322 $main_page_name,
323 null,
324 'dashicons-editor-table'
325 );
326 $project_menu_shown = true;
327 }
328
329 $this->wpdp_project_menus[$page['project_id'] . '_' . $page['page_id']] = add_submenu_page(
330 $main_page_name,
331 $menu_name,
332 $page['page_name'],
333 WPDA::get_current_user_capability(),
334 $page_name,
335 [ $this, 'manage_project_page' ]
336 );
337
338 if ( $this->page === self::PAGE_MAIN . '_' . $page['project_id'] . '_' . $page['page_id'] ) {
339
340 if ( 'static' !== $page_type && null !== $page['page_where'] && '' !== $page['page_where'] ) {
341
342 if ( 'where' === strtolower( substr( str_replace( ' ', '', $page['page_where'] ), 0, 5 ) ) ) {
343 $where_clause = " {$page['page_where']}";
344 } else {
345 $where_clause = " where {$page['page_where']} ";
346 }
347
348 $where_clause = WPDA::substitute_environment_vars( $where_clause );
349 } else {
350 $where_clause = '';
351 }
352
353 switch ( $page_type ) {
354 case 'static':
355 $this->wpdp_projects_content[$page['project_id'] . '_' . $page['page_id']] = $page['page_content'];
356 break;
357 case 'table':
358 $args = [
359 'page_hook_suffix' => $this->wpdp_project_menus[$page['project_id'] . '_' . $page['page_id']],
360 'wpdaschema_name' => $page_schema_name,
361 'table_name' => $page_table_name,
362 'project_id' => $page['project_id'],
363 'page_id' => $page['page_id'],
364 'list_table_class' => 'WPDataProjects\\List_Table\\WPDP_List_Table',
365 'edit_form_class' => 'WPDataProjects\\Simple_Form\\WPDP_Simple_Form',
366 'where_clause' => $where_clause,
367 'orderby_clause' => $page['page_orderby'],
368 ];
369
370 if ( 'view' === $page['page_mode'] ) {
371 $args['allow_update'] = 'off';
372 $args['allow_import'] = 'off';
373 }
374
375
376 if ( 'no' === $page['page_allow_insert'] ) {
377 $args['allow_insert'] = 'off';
378 $args['allow_import'] = 'off';
379 }
380
381 if ( 'no' === $page['page_allow_delete'] ) {
382 $args['allow_delete'] = 'off';
383 }
384
385 if ( 'only' === $page['page_allow_insert'] ) {
386 $args['action'] = 'new';
387 $args['allow_insert'] = 'only';
388 $args['allow_update'] = 'off';
389 $args['allow_import'] = 'off';
390 $args['allow_delete'] = 'off';
391 }
392
393 if ( 'no' === $page['page_allow_import'] ) {
394 $args['allow_import'] = 'off';
395 }
396 if ( 'no' === $page['page_allow_bulk'] ) {
397 $args['bulk_actions_enabled'] = false;
398 }
399 $this->wpdp_project_views[$page['project_id'] . '_' . $page['page_id']] = new \WPDataProjects\List_Table\WPDP_List_View( $args );
400 break;
401 case 'parent/child':
402 $args = [
403 'page_hook_suffix' => $this->wpdp_project_menus[$page['project_id'] . '_' . $page['page_id']],
404 'wpdaschema_name' => $page_schema_name,
405 'table_name' => $page_table_name,
406 'list_table_class' => 'WPDataProjects\\Parent_Child\\WPDP_Parent_List_Table',
407 'edit_form_class' => 'WPDataProjects\\Parent_Child\\WPDP_Parent_Form',
408 'project_id' => $page['project_id'],
409 'page_id' => $page['page_id'],
410 'where_clause' => $where_clause,
411 'orderby_clause' => $page['page_orderby'],
412 ];
413
414 if ( 'view' === $page['page_mode'] ) {
415 $args['allow_update'] = 'off';
416 $args['allow_import'] = 'off';
417 }
418
419
420 if ( 'no' === $page['page_allow_insert'] ) {
421 $args['allow_insert'] = 'off';
422 $args['allow_import'] = 'off';
423 }
424
425 if ( 'no' === $page['page_allow_delete'] ) {
426 $args['allow_delete'] = 'off';
427 }
428
429 if ( 'only' === $page['page_allow_insert'] ) {
430 $args['action'] = 'new';
431 $args['allow_insert'] = 'only';
432 $args['allow_update'] = 'off';
433 $args['allow_import'] = 'off';
434 $args['allow_delete'] = 'off';
435 }
436
437 if ( 'no' === $page['page_allow_import'] ) {
438 $args['allow_import'] = 'off';
439 }
440 if ( 'no' === $page['page_allow_bulk'] ) {
441 $args['bulk_actions_enabled'] = false;
442 }
443 $this->wpdp_project_views[$page['project_id'] . '_' . $page['page_id']] = new \WPDataProjects\Parent_Child\WPDP_Parent_List_View( $args );
444 }
445 }
446
447 } else {
448 $page_title = $page['page_title'];
449 if ( null === $page_title || '' === trim( $page_title ) ) {
450 $page_title = 'Untitled';
451 }
452 $title = $project['project_description'];
453 if ( null === $title || '' === trim( $title ) ) {
454 $title = $page_title;
455 }
456 $menu = [
457 'menu_id' => self::PAGE_MAIN . '_' . $page['project_id'] . '_' . $page['page_id'],
458 'menu_name' => $project['menu_name'],
459 'menu_title' => $title,
460 'page_title' => $page_title,
461 ];
462
463 if ( !isset( $this->wp_admin_toolbar[$page['project_id']] ) ) {
464 $this->wp_admin_toolbar[$page['project_id']][] = $menu;
465 } else {
466 $this->wp_admin_toolbar[$page['project_id']][] = $menu;
467 }
468
469 }
470
471 }
472 }
473 }
474 if ( !is_admin() ) {
475 $this->wpda_add_project_to_toolbar();
476 }
477 }
478
479 protected function wpda_add_project_to_toolbar()
480 {
481 foreach ( $this->wp_admin_toolbar as $pid => $toolbar ) {
482 foreach ( $toolbar as $key => $menu ) {
483 if ( 0 === $key ) {
484 $this->additem_to_toolbar( $pid, $menu );
485 }
486 $this->additem_to_toolbar( $menu['menu_id'], $menu, $pid );
487 }
488 }
489 }
490
491 protected function additem_to_toolbar( $pid, $menu, $parent = null )
492 {
493 global $wp_admin_bar ;
494 $args = [
495 'id' => $pid,
496 'title' => ( null === $parent ? $menu['menu_name'] : $menu['page_title'] ),
497 'href' => admin_url( 'admin.php' ) . '?page=' . $menu['menu_id'],
498 'zindex' => '9999',
499 'meta' => [
500 'class' => ( null === $parent ? 'wpda-wpdp-toolbar' : '' ),
501 'title' => ( null === $parent ? $menu['menu_title'] : $menu['page_title'] ),
502 ],
503 ];
504 if ( null !== $parent ) {
505 $args['parent'] = $parent;
506 }
507 $wp_admin_bar->add_node( $args );
508 }
509
510 /**
511 * Manage project page
512 */
513 public function manage_project_page()
514 {
515 $ids = explode( '_', $this->page );
516 if ( 4 !== count( $ids ) ) {
517 wp_die( __( 'ERROR: Wrong arguments [missing page]', 'wp-data-access' ) );
518 }
519 $project_id = $ids[2];
520 $page_id = $ids[3];
521
522 if ( isset( $this->wpdp_project_views[$project_id . '_' . $page_id] ) ) {
523 $this->wpdp_project_views[$project_id . '_' . $page_id]->show();
524 } else {
525
526 if ( isset( $this->wpdp_projects_content[$project_id . '_' . $page_id] ) ) {
527 $post_id = $this->wpdp_projects_content[$project_id . '_' . $page_id];
528 $post = get_post( $post_id );
529 $content = $post->post_content;
530 $content = apply_filters( 'the_content', $content );
531 $content = str_replace( ']]>', ']]&gt;', $content );
532 echo $content ;
533 } else {
534 wp_die( __( 'ERROR: Project page initialization failed', 'wp-data-access' ) );
535 }
536
537 }
538
539 }
540
541 }