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

399 lines 11.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Suppress "error - 0 - No summary was found for this file" on phpdoc generation
4 *
5 * @package WPDataProjects
6 */
7
8 namespace WPDataProjects {
9
10 use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Exist;
11 use WPDataProjects\Project\WPDP_Project_Design_Table_Model;
12 use WPDataAccess\User_Menu\WPDA_User_Menu_Model;
13 use WPDataAccess\List_Table\WPDA_List_View;
14 use WPDataAccess\WPDA;
15
16 /**
17 * Class WPDP
18 *
19 * @package WPDataProjects
20 * @author Peter Schulz
21 * @since 2.0.0
22 */
23 class WPDP {
24
25 /**
26 *
27 */
28 const PAGE_MAIN = 'wpdp';
29
30 /**
31 * @var null
32 */
33 protected $page = null;
34
35 /**
36 * @var array
37 */
38 protected $tabs;
39 /**
40 * @var array
41 */
42 protected $tab_links;
43 /**
44 * @var
45 */
46 protected $current_tab;
47
48 /**
49 * @var
50 */
51 protected $wpdp_projects_menu;
52 /**
53 * @var
54 */
55 protected $wpdp_projects_view;
56 /**
57 * @var
58 */
59 protected $wpdp_projects_content;
60
61 /**
62 * @var
63 */
64 protected $wpdp_project_menus;
65 /**
66 * @var
67 */
68 protected $wpdp_project_views;
69
70 /**
71 * WPDP constructor.
72 */
73 public function __construct() {
74 if ( isset( $_REQUEST['page'] ) ) {
75 $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) ); // input var okay.
76 }
77
78 $this->title_data_projects_menu = __( 'Data Projects', 'wp-data-access' );
79
80 $this->tabs = [
81 'projects' => __( 'Manage Projects', 'wp-data-access' ),
82 'tables' => __( 'Manage Table Options', 'wp-data-access' ),
83 'menus' => __( 'Manage Dashboard Menus', 'wp-data-access' ),
84 ];
85 $this->tab_links = [
86 'projects' => '?page=wpda_help&docid=data_projects_videos',
87 'tables' => '?page=wpda_help&docid=data_projects_tables',
88 'menus' => '?page=wpda_help&docid=data_projects_menus',
89 ];
90
91 $this->current_tab = 'projects';
92 if ( isset( $_REQUEST['tab'] ) ) {
93 $tab = sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ); // input var okay.
94 if ( isset( $this->tabs[ $tab ] ) ) {
95 $this->current_tab = $tab;
96 }
97 }
98 }
99
100 /**
101 *
102 */
103 public function add_menu_items() {
104 if ( current_user_can( 'manage_options' ) ) {
105 global $wpdb;
106
107 // Check for repository tables to prevent dashboard errors.
108 $project_table_name = $wpdb->prefix . 'wpdp_project';
109 $page_table_name = $wpdb->prefix . 'wpdp_page';
110
111 $wpda_dictionary_exist = new WPDA_Dictionary_Exist( '', $project_table_name );
112 $project_table_exists = $wpda_dictionary_exist->table_exists( false );
113
114 $wpda_dictionary_exist = new WPDA_Dictionary_Exist( '', $page_table_name );
115 $page_table_exists = $wpda_dictionary_exist->table_exists( false );
116 if ( WPDP_Project_Design_Table_Model::table_table_design_exists() &&
117 $project_table_exists &&
118 $page_table_exists
119 ) {
120 $this->wpdp_projects_menu = add_submenu_page(
121 \WP_Data_Access_Admin::PAGE_MAIN,
122 $this->title_data_projects_menu,
123 $this->title_data_projects_menu,
124 'manage_options',
125 self::PAGE_MAIN,
126 [ $this, 'data_projects_page' ]
127 );
128
129 if ( $this->current_tab === 'menus' ) {
130 if ( WPDA_User_Menu_Model::table_menu_items_exists() ) {
131 $this->wpdp_projects_view = new WPDA_List_View(
132 [
133 'page_hook_suffix' => $this->wpdp_projects_menu,
134 'table_name' => $wpdb->prefix . WPDA::get_option( WPDA::OPTION_WPDA_PREFIX ) . 'menu_items',
135 'title' => '',
136 'subtitle' => '',
137 'list_table_class' => 'WPDataAccess\\User_Menu\\WPDA_User_Menu_List_Table',
138 'edit_form_class' => 'WPDataAccess\\User_Menu\\WPDA_User_Menu_Form',
139 'column_headers' => [
140 'menu_name' => __( 'Menu name', 'wp-data-access' ),
141 'menu_table_name' => __( 'Table name', 'wp-data-access' ),
142 'capability' => __( 'Capability', 'wp-data-access' ),
143 'menu_slug' => __( 'Menu slug', 'wp-data-access' ),
144 ],
145 ]
146 );
147 }
148 } elseif ( $this->current_tab === 'tables' ) {
149 $this->wpdp_projects_view = new \WPDataProjects\Project\WPDP_Project_Table_View(
150 [
151 'page_hook_suffix' => $this->wpdp_projects_menu,
152 'table_name' => $wpdb->prefix . 'wpdp_table',
153 'list_table_class' => 'WPDataProjects\\Project\\WPDP_Project_Table_List',
154 'edit_form_class' => 'WPDataProjects\\Project\\WPDP_Project_Table_Form',
155 'subtitle' => '',
156 ]
157 );
158 } else {
159 $this->wpdp_projects_view = new \WPDataProjects\Project\WPDP_Project_Project_View (
160 [
161 'page_hook_suffix' => $this->wpdp_projects_menu,
162 'table_name' => $wpdb->prefix . 'wpdp_project',
163 'edit_form_class' => 'WPDataProjects\\Project\\WPDP_Project_Project_Form',
164 'list_table_class' => 'WPDataProjects\\Project\\WPDP_Project_Project_List',
165 ]
166 );
167 }
168 }
169 }
170 }
171
172 /**
173 *
174 */
175 public function data_projects_page() {
176 ?>
177
178 <div class="wrap">
179 <h1><?php echo esc_html__( 'Data Projects', 'wp-data-access' ); ?></h1>
180
181 <?php
182 $this->add_tabs();
183 $this->add_content();
184 ?>
185
186 </div>
187
188 <?php
189 }
190
191 /**
192 *
193 */
194 protected function add_tabs() {
195 ?>
196
197 <h2 class="nav-tab-wrapper">
198
199 <?php
200 foreach ( $this->tabs as $tab => $name ) {
201
202 $class = ( $tab === $this->current_tab ) ? ' nav-tab-active' : '';
203 echo '<a class="nav-tab' . esc_attr( $class ) . '" href="?page=' . esc_attr( self::PAGE_MAIN ) .
204 '&tab=' . esc_attr( $tab ) . '">' . esc_attr( $name ) . '&nbsp;' .
205 '<span style="font-size:24px;color:lightslategrey;"' .
206 'class="dashicons dashicons-info" ' .
207 'onclick="document.location.href=\'' . $this->tab_links[$tab] . '\'; return false;">' .
208 '</span>' .
209 '</a>';
210
211 }
212 ?>
213
214 </h2>
215
216 <?php
217 }
218
219 /**
220 *
221 */
222 protected function add_content() {
223 if ( null !== $this->wpdp_projects_view ) {
224 $this->wpdp_projects_view->show();
225 } else {
226 wp_die( __( 'ERROR: Option not available', 'wp-data-access' ) );
227 }
228 }
229
230 /**
231 *
232 */
233 public function add_projects() {
234 // Add project Menus.
235 global $wpdb;
236
237 $project_project_table_name = $wpdb->prefix . 'wpdp_project';
238 $project_page_table_name = $wpdb->prefix . 'wpdp_page';
239
240 // Check for repository tables to prevent dashboard errors.
241 $wpda_dictionary_exist = new WPDA_Dictionary_Exist( '', $project_project_table_name );
242 if ( ! $wpda_dictionary_exist->table_exists( false ) ) {
243 return;
244 }
245
246 $wpda_dictionary_exist = new WPDA_Dictionary_Exist( '', $project_page_table_name );
247 if ( ! $wpda_dictionary_exist->table_exists( false ) ) {
248 return;
249 }
250
251 $query_projects = "select * from $project_project_table_name where add_to_menu = 'Yes' order by project_sequence";
252 $projects = $wpdb->get_results( $query_projects, 'ARRAY_A' ); // WPCS: unprepared SQL OK; db call ok; no-cache ok.
253
254 foreach ( $projects as $project ) {
255 $menu_name = $project['menu_name'];
256 $user_roles = WPDA::get_current_user_roles();
257 if ( false === $user_roles ) {
258 // Cannot determine the user role(s). Not able to show project menus.
259 break;
260 }
261 $query_pages = $wpdb->prepare(
262 " select * from $project_page_table_name " .
263 " where project_id = %d " .
264 " and add_to_menu = 'Yes' " .
265 " order by page_sequence",
266 [
267 $project['project_id'],
268 ]
269 );
270 $pages = $wpdb->get_results( $query_pages, 'ARRAY_A' ); // WPCS: unprepared SQL OK; db call ok; no-cache ok.
271
272 $project_menu_shown = false;
273 foreach ( $pages as $page ) {
274 $user_has_role = false;
275 if ( '' === $page['page_role'] || null === $page['page_role'] ) {
276 $user_has_role = in_array( 'administrator', $user_roles );
277 } else {
278 $user_role_array = explode( ',', $page['page_role'] );
279 foreach ( $user_role_array as $user_role_array_item ) {
280 $user_has_role = in_array( $user_role_array_item, $user_roles );
281 if ( $user_has_role ) {
282 break;
283 }
284 }
285 }
286
287 if ( $user_has_role ) {
288 $page_name = self::PAGE_MAIN . '_' . $page['project_id'] . '_' . $page['page_id'];
289 $page_table_name = $page['page_table_name'];
290 $page_type = $page['page_type'];
291
292 if ( ! $project_menu_shown ) {
293 $main_page_name = $page_name;
294 add_menu_page(
295 $menu_name,
296 $menu_name,
297 WPDA::get_current_user_capability(),
298 $main_page_name,
299 null,
300 'dashicons-editor-table'
301 );
302 $project_menu_shown = true;
303 }
304
305 $this->wpdp_project_menus[ $page['project_id'] . '_' . $page['page_id'] ] =
306 add_submenu_page(
307 $main_page_name,
308 $menu_name,
309 $page['page_name'],
310 WPDA::get_current_user_capability(),
311 $page_name,
312 [ $this, 'manage_project_page' ]
313 );
314
315 if ( 'static' !== $page_type && null !== $page['page_where'] && '' !== $page['page_where'] ) {
316 if ( 'where' === substr( str_replace( ' ', '', $page['page_where'] ), 0, 5) ) {
317 $where_clause = " {$page['page_where']}";
318 } else {
319 $where_clause = " where {$page['page_where']} ";
320 }
321 if ( strpos( $where_clause, '$$USER$$' ) ) {
322 $wp_user = wp_get_current_user();
323 $where_clause = str_replace( '$$USER$$', "'" . $wp_user->data->user_login . "'", $where_clause );
324 }
325 } else {
326 $where_clause = '';
327 }
328
329 switch ( $page_type ) {
330 case 'static':
331 $this->wpdp_projects_content[ $page['project_id'] . '_' . $page['page_id'] ] =
332 $page['page_content'];
333 break;
334 case 'table':
335 $this->wpdp_project_views[ $page['project_id'] . '_' . $page['page_id'] ] =
336 new \WPDataProjects\List_Table\WPDP_List_View (
337 [
338 'table_name' => $page_table_name,
339 'project_id' => $page['project_id'],
340 'page_id' => $page['page_id'],
341 'list_table_class' => 'WPDataProjects\\List_Table\\WPDP_List_Table',
342 'edit_form_class' => 'WPDataProjects\\Simple_Form\\WPDP_Simple_Form',
343 'where_clause' => $where_clause,
344 ]
345 );
346 break;
347 case 'parent/child':
348 $this->wpdp_project_views[ $page['project_id'] . '_' . $page['page_id'] ] =
349 new \WPDataProjects\Parent_Child\WPDP_Parent_List_View (
350 [
351 'page_hook_suffix' => 'WPDA_WPDP',
352 'table_name' => $page_table_name,
353 'list_table_class' => 'WPDataProjects\\Parent_Child\\WPDP_Parent_List_Table',
354 'edit_form_class' => 'WPDataProjects\\Parent_Child\\WPDP_Parent_Form',
355 'project_id' => $page['project_id'],
356 'page_id' => $page['page_id'],
357 'where_clause' => $where_clause,
358 ]
359 );
360 }
361 }
362 }
363 }
364
365 }
366
367 /**
368 *
369 */
370 public function manage_project_page() {
371 $ids = explode( '_', $this->page );
372
373 if ( 3 !== count( $ids ) ) {
374 wp_die( __( 'ERROR: Wrong arguments', 'wp-data-access' ) );
375 }
376
377 $project_id = $ids[1];
378 $page_id = $ids[2];
379
380 if ( isset( $this->wpdp_project_views[ $project_id . '_' . $page_id ] ) ) {
381 $this->wpdp_project_views[ $project_id . '_' . $page_id ]->show();
382 } else {
383 if ( isset( $this->wpdp_projects_content[ $project_id . '_' . $page_id ] ) ) {
384 $post_id = $this->wpdp_projects_content[ $project_id . '_' . $page_id ];
385 $post = get_post( $post_id );
386 $content = $post->post_content;
387 $content = apply_filters('the_content', $content);
388 $content = str_replace(']]>', ']]&gt;', $content);
389 echo $content;
390 } else {
391 wp_die( __( 'ERROR: Project page initialization failed', 'wp-data-access' ) );
392 }
393 }
394 }
395
396 }
397
398 }
399