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

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