PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.23
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.23
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 / WPDataAccess / API / WPDA_Settings.php

WPDA_Settings.php in WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards 5.5.23, at WPDataAccess/API/WPDA_Settings.php

650 lines 18.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPDataAccess\API {
4
5 use WPDataAccess\Plugin_Table_Models\WPDA_Media_Model;
6 use WPDataAccess\Plugin_Table_Models\WPDA_Table_Settings_Model;
7 use WPDataAccess\Plugin_Table_Models\WPDA_User_Menus_Model;
8 use WPDataAccess\WPDA;
9
10 class WPDA_Settings extends WPDA_API_Core {
11
12 const WPDA_SETTINGS = 'wpda_settings';
13
14 public function register_rest_routes() {
15
16 register_rest_route(
17 WPDA_API::WPDA_NAMESPACE,
18 'save-settings',
19 array(
20 'methods' => array( 'POST' ),
21 'callback' => array( $this, 'save_settings' ),
22 'permission_callback' => '__return_true',
23 'args' => array(
24 'action' => array(
25 'required' => true,
26 'type' => 'string',
27 'description' => __( 'Setting type', 'wp-data-access' ),
28 'sanitize_callback' => 'sanitize_text_field',
29 'validate_callback' => function ( $param ) {
30 return in_array(
31 $param,
32 array(
33 'dashboard_menus',
34 'table_settings',
35 'column_settings',
36 'rest_api',
37 'admin_settings',
38 'explorer_settings'
39 )
40 );
41 },
42 ),
43 'dbs' => $this->get_param( 'dbs' ),
44 'tbl' => $this->get_param( 'tbl' ),
45 'settings' => array(
46 'required' => true,
47 'type' => 'string',
48 'description' => __( 'Settings JSON as string', 'wp-data-access' ),
49 'sanitize_callback' => 'sanitize_text_field',
50 'validate_callback' => 'rest_validate_request_arg',
51 ),
52 ),
53 )
54 );
55
56 }
57
58 /**
59 * Save plugin settings.
60 *
61 * @param WP_REST_Request $request Rest API request.
62 * @return \WP_Error|\WP_REST_Response
63 */
64 public function save_settings( $request ) {
65
66 if ( ! $this->current_user_can_access( true ) ) {
67 return $this->unauthorized();
68 }
69
70 if ( ! $this->current_user_token_valid( $request ) ) {
71 return $this->invalid_nonce();
72 }
73
74 $dbs = $request->get_param( 'dbs' );
75 $tbl = $request->get_param( 'tbl' );
76
77 $settings_string = $request->get_param( 'settings' );
78 if ( ! is_string( $settings_string ) ) {
79 return $this->bad_request();
80 }
81
82 $settings = json_decode( $settings_string, true );
83 if ( false === $settings || is_null( $settings ) ) {
84 return $this->bad_request();
85 }
86
87 switch ( $request->get_param( 'action' ) ) {
88 case 'dashboard_menus':
89 return $this->save_dashboard_menus( $dbs, $tbl, $settings );
90 case 'table_settings':
91 return $this->save_table_settings( $dbs, $tbl, $settings );
92 case 'column_settings':
93 return $this->save_column_settings( $dbs, $tbl, $settings );
94 case 'rest_api':
95 return $this->save_rest_api_settings( $dbs, $tbl, $settings );
96 case 'admin_settings':
97 $theme = $request->get_param( 'theme' );
98 return $this->save_admin_settings( $dbs, $tbl, $settings, $theme );
99 case 'explorer_settings':
100 return $this->save_explorer_settings( $dbs, $tbl, $settings );
101 }
102
103 return $this->bad_request();
104
105 }
106
107 private function save_explorer_settings( $schema_name, $table_name, $settings ) {
108
109 global $wpdb;
110 $dml_failed = 0;
111
112 // Handle REST API
113 $rest_api = $settings['rest_api'] ?? null;
114 $rest_api_settings = get_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS );
115 if ( false === $rest_api_settings ) {
116 $rest_api_settings = array();
117 }
118 if ( null !== $rest_api ) {
119 // Add table REST API
120 $rest_api_settings[ $schema_name ][ $table_name ] = $rest_api;
121 } else {
122 // Delete table REST API
123 unset($rest_api_settings[ $schema_name ][ $table_name ]);
124 }
125 update_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS, $rest_api_settings );
126 unset( $settings['rest_api'] );
127
128 // Handle Media columns
129 $media_columns = $settings['column_media'] ?? null;
130 if ( is_array( $media_columns ) ) {
131 foreach ( $media_columns as $column => $value ) {
132 if ( false === $value || '' === $value ) {
133 // Delete column media (no error handling)
134 WPDA_Media_Model::delete( $table_name, $column, $schema_name );
135 } elseif ( 'string' === gettype( $value) ) {
136 if ( false === WPDA_Media_Model::get_column_media( $table_name, $column, $schema_name ) ) {
137 if ( ! WPDA_Media_Model::insert( $table_name, $column, $value, 'Yes', $schema_name ) ) {
138 $dml_failed++;
139 }
140 } else {
141 if ( false === WPDA_Media_Model::update( $table_name, $column, $value, $schema_name ) ) {
142 $dml_failed++;
143 }
144 }
145 }
146 }
147 }
148 unset( $settings['column_media'] );
149
150 // Handle UPDATE | INSERT table and column settings
151 $settings_db = WPDA_Table_Settings_Model::query( $table_name, $schema_name );
152 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
153 // Row found, perform update
154 $settings_from_db = json_decode( $settings_db[0]['wpda_table_settings'], true );
155 foreach ( $settings_from_db as $key => $value ) {
156 if ( ! isset( $settings[ $key ] ) ) {
157 $settings[ $key ] = $value;
158 }
159 }
160
161 WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name );
162 if ( '' !== $wpdb->last_error ) {
163 $dml_failed++;
164 }
165 } else {
166 // No row found, insert new
167 if ( ! WPDA_Table_Settings_Model::insert( $table_name, json_encode( $settings ), $schema_name ) ) {
168 $dml_failed++;
169 }
170 }
171
172 if ( 0 === $dml_failed ) {
173 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
174 } else {
175 if ( '' === $wpdb->last_error ) {
176 return new \WP_Error(
177 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
178 array( 'status' => 420 )
179 );
180 } else {
181 return new \WP_Error(
182 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
183 array( 'status' => 420 )
184 );
185 }
186 }
187
188 }
189
190 /**
191 * Save table settings.
192 *
193 * @param $schema_name
194 * @param $table_name
195 * @param $settings
196 * @return \WP_Error|\WP_REST_Response
197 */
198 private function save_table_settings( $schema_name, $table_name, $settings ) {
199 if (
200 isset( $settings['table_settings']['hyperlink_definition'] ) &&
201 isset( $settings['unused'] )
202 ) {
203 $sql_dml = $settings['unused'];
204
205 unset( $settings['request_type'] );
206 unset( $settings['unused'] );
207
208 global $wpdb;
209 if ( 'UPDATE' === $sql_dml ) {
210 $settings_db = WPDA_Table_Settings_Model::query( $table_name, $schema_name );
211 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
212 $settings_from_db = json_decode( $settings_db[0]['wpda_table_settings'], true );
213 foreach ( $settings_from_db as $key => $value ) {
214 if ( ! isset( $settings[ $key ] ) ) {
215 $settings[ $key ] = $value;
216 }
217 }
218 }
219
220 if (
221 1 === WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name ) ||
222 (
223 '' === $wpdb->last_error &&
224 0 === WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name )
225 )
226 ) {
227 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
228 } else {
229 return new \WP_Error(
230 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
231 array( 'status' => 420 )
232 );
233 }
234 } else {
235 if ( WPDA_Table_Settings_Model::insert( $table_name, json_encode( $settings ), $schema_name ) ) {
236 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
237 } else {
238 return new \WP_Error(
239 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
240 array( 'status' => 420 )
241 );
242 }
243 }
244 } else {
245 // Nothing really to save, just to satisfy the user experience.
246 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
247 }
248 }
249
250 /**
251 * Save column settings.
252 *
253 * @param $schema_name
254 * @param $table_name
255 * @param $settings
256 * @return \WP_Error|\WP_REST_Response
257 */
258 private function save_column_settings( $schema_name, $table_name, $settings ) {
259 $sql_dml = null;
260 $dml_succeeded = 0;
261 $dml_failed = 0;
262
263 if ( isset( $settings['column_media'] ) ) {
264 // Process media columns.
265 $settings_column_media = $settings['column_media'];
266 foreach ( $settings_column_media as $column => $value ) {
267 if ( isset( $value['value'] ) && isset( $value['dml'] ) ) {
268 if ( 'INSERT' === $value['dml'] ) {
269 if ( WPDA_Media_Model::insert( $table_name, $column, $value['value'], 'Yes', $schema_name ) ) {
270 $dml_succeeded ++;
271 } else {
272 $dml_failed ++;
273 }
274 } elseif ( 'UPDATE' === $value['dml'] ) {
275 if ( '' === $value['value'] ) {
276 if ( 1 === WPDA_Media_Model::delete( $table_name, $column, $schema_name ) ) {
277 $dml_succeeded ++;
278 } else {
279 $dml_failed ++;
280 }
281 } else {
282 if ( 1 === WPDA_Media_Model::update( $table_name, $column, $value['value'], $schema_name ) ) {
283 $dml_succeeded ++;
284 } else {
285 $dml_failed ++;
286 }
287 }
288 }
289 }
290 }
291 unset( $settings['column_media'] );
292 }
293
294 if ( isset( $settings['unused'] ) ) {
295 $settings_unused = $settings['unused'];
296 if ( isset( $settings_unused['sql_dml'] ) ) {
297 $sql_dml = $settings_unused['sql_dml'];
298 }
299 unset( $settings['unused'] );
300 }
301
302 if ( null === $sql_dml ) {
303 return new \WP_Error(
304 sprintf(
305 __( 'Failed to save changes [%s]', 'wp-data-access' ),
306 'please contact the plugin development team'
307 ),
308 array( 'status' => 420 )
309 );
310 } else {
311 // Save settings.
312 if ( isset( $settings['request_type'] ) ) {
313 unset( $settings['request_type'] );
314 }
315
316 if ( 'UPDATE' === $sql_dml ) {
317 $settings_db = WPDA_Table_Settings_Model::query( $table_name, $schema_name );
318 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
319 $settings_from_db = json_decode( $settings_db[0]['wpda_table_settings'], true );
320 foreach ( $settings_from_db as $key => $value ) {
321 if ( ! isset( $settings[ $key ] ) ) {
322 $settings[ $key ] = $value;
323 }
324 }
325 }
326 if ( 1 === WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name ) ) {
327 $dml_succeeded ++;
328 }
329 } else {
330 if ( WPDA_Table_Settings_Model::insert( $table_name, json_encode( $settings ), $schema_name ) ) {
331 $dml_succeeded ++;
332 } else {
333 $dml_failed ++;
334 }
335 }
336 }
337
338 if ( $dml_succeeded >= 0 && $dml_failed === 0 ) {
339 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
340 } else {
341 global $wpdb;
342 $msg = '' !== $wpdb->last_error ? " [{$wpdb->last_error}]" : '';
343
344 return new \WP_Error(
345 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $msg ),
346 array( 'status' => 420 )
347 );
348 }
349 }
350
351 /**
352 * Save dashboard menu changes.
353 *
354 * @param $schema_name
355 * @param $table_name
356 * @param $settings
357 * @return \WP_Error|\WP_REST_Response
358 */
359 private function save_dashboard_menus( $schema_name, $table_name, $settings ) {
360 $dml_succeeded = 0;
361 $dml_failed = 0;
362 $new_menus = array();
363
364 if ( isset( $settings['menu'] ) && is_array( $settings['menu'] ) ) {
365 // Process menu items.
366 foreach ( $settings['menu'] as $menu ) {
367 if ( isset( $menu['menu_name'] ) && isset( $menu['menu_slug'] ) ) {
368 if ( isset( $menu['menu_role'] ) ) {
369 if ( is_array( $menu['menu_role'] ) ) {
370 $menu_role = implode( ',', $menu['menu_role'] );
371 } else {
372 $menu_role = $menu['menu_role'];
373 }
374 } else {
375 $menu_role = '';
376 }
377 if ( isset( $menu['menu_id'] ) && '' === $menu['menu_id'] ) {
378 // Add new menu
379 if ( WPDA_User_Menus_Model::insert(
380 $table_name,
381 $menu['menu_name'],
382 $menu['menu_slug'],
383 $menu_role,
384 $schema_name
385 ) ) {
386 $dml_succeeded ++;
387
388 global $wpdb;
389 $new_menus[] = array(
390 'menu_name' => $menu['menu_name'],
391 'menu_slug' => $menu['menu_slug'],
392 'menu_id' => $wpdb->insert_id,
393 );
394 } else {
395 $dml_failed ++;
396 }
397 } else {
398 if ( isset( $menu['menu_id'] ) ) {
399 // Update existing menu.
400 $update_result = WPDA_User_Menus_Model::update(
401 $menu['menu_id'],
402 $table_name,
403 $menu['menu_name'],
404 $menu['menu_slug'],
405 $menu_role,
406 $schema_name
407 );
408 if ( 1 === $update_result ) {
409 $dml_succeeded ++;
410 }
411 }
412 }
413 }
414 }
415 unset( $settings['menu'] );
416 }
417
418 if ( isset( $settings['delete'] ) && is_array( $settings['delete'] ) ) {
419 // Process menu items to be deleted.
420 foreach ( $settings['delete'] as $menu ) {
421 if ( 1 === WPDA_User_Menus_Model::delete( $menu ) ) {
422 $dml_succeeded++;
423 } else {
424 $dml_failed++;
425 }
426 }
427 unset( $settings['delete'] );
428 }
429
430 if ( $dml_succeeded >= 0 && $dml_failed === 0 ) {
431 return $this->WPDA_Rest_Response(
432 sprintf( __( 'Saved dashboard menus for table `%s`', 'wp-data-access' ), $table_name ),
433 $new_menus
434 );
435 } else {
436 global $wpdb;
437 $msg = '' !== $wpdb->last_error ? " [{$wpdb->last_error}]" : '';
438
439 return new \WP_Error(
440 sprintf( __( 'Cannot save dashboard menus for table `%s`%s', 'wp-data-access' ), $table_name, $msg ),
441 array( 'status' => 420 )
442 );
443 }
444 }
445
446 /**
447 * Save rest api settings.
448 *
449 * @param $schema_name
450 * @param $table_name
451 * @param $settings
452 * @return \WP_Error|\WP_REST_Response
453 */
454 private function save_rest_api_settings( $schema_name, $table_name, $settings ) {
455 if ( ! isset( $settings['enabled'] ) ) {
456 return $this->bad_request();
457 }
458
459 $rest_api_settings = get_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS );
460 if ( false === $rest_api_settings ) {
461 $rest_api_settings = array();
462 }
463
464 if ( true === $settings['enabled'] ) {
465 // Add new | update existing REST API rule.
466 $actions = array( 'select', 'insert', 'update', 'delete' );
467 foreach ( $actions as $action ) {
468 if (
469 isset(
470 $settings[ $action ],
471 $settings[ $action ]['authorization'],
472 $settings[ $action ]['methods'],
473 $settings[ $action ]['authorized_roles'],
474 $settings[ $action ]['authorized_users']
475 )
476 ) {
477 unset( $rest_api_settings[ $schema_name ][ $table_name ][ $action ] ); // Unset previous authorization.
478 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['authorization'] = $settings[ $action ]['authorization'];
479 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['methods'] = $settings[ $action ]['methods'];
480 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['authorized_roles'] = $settings[ $action ]['authorized_roles'];
481 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['authorized_users'] = $settings[ $action ]['authorized_users'];
482 }
483 else {
484 return $this->bad_request();
485 }
486 }
487 } elseif ( false === $settings['enabled'] ) {
488 // Remove existing REST API rule.
489 if ( isset( $settings['select'] ) ) {
490 unset( $rest_api_settings[ $schema_name ][ $table_name ]['select'] );
491 if (
492 isset( $rest_api_settings[ $schema_name ][ $table_name ] ) &&
493 0 === count( $rest_api_settings[ $schema_name ][ $table_name ] )//phpcs:ignore - 8.1 proof
494 ) {
495 unset( $rest_api_settings[ $schema_name ][ $table_name ] );
496 if (
497 isset( $rest_api_settings[ $schema_name ] ) &&
498 0 === count( $rest_api_settings[ $schema_name ] )//phpcs:ignore - 8.1 proof
499 ) {
500 unset( $rest_api_settings[ $schema_name ] );
501 }
502 }
503 } else {
504 return $this->bad_request();
505 }
506 } else {
507 return $this->bad_request();
508 }
509
510 update_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS, $rest_api_settings );
511
512 return $this->WPDA_Rest_Response(
513 sprintf( __( 'Saved REST API settings for table `%s`', 'wp-data-access' ), $table_name )
514 );
515 }
516
517 private function save_admin_settings( $schema_name, $table_name, $settings, $theme ) {
518 if (
519 !
520 (
521 isset(
522 $settings['scope'],
523 $settings['target']
524 ) &&
525 (
526 isset(
527 $settings['data']
528 ) ||
529 null === $settings['data']
530 ) &&
531 (
532 'global' === $settings['scope'] ||
533 'user' === $settings['scope']
534 ) &&
535 (
536 'table' === $settings['target'] ||
537 'form' === $settings['target'] ||
538 'theme' === $settings['target']
539 )
540
541 )
542 ) {
543 return $this->bad_request();
544 }
545
546 $admin_settings = WPDA_Settings::get_admin_settings_key(
547 $settings['target'],
548 $schema_name ,
549 $table_name
550 );
551
552 if ( 'global' === $settings['scope'] ) {
553 // Store settings globally.
554 if ( null !== $settings['data'] ) {
555 update_option( $admin_settings, $settings['data'] );
556
557 if ( null !== $theme ) {
558 $theme_settings = WPDA_Settings::get_admin_settings_key(
559 'theme',
560 $schema_name ,
561 $table_name
562 );
563 update_option( $theme_settings, $theme );
564 }
565 } else {
566 delete_option( $admin_settings );
567 }
568 } else {
569 // Store settings for login user.
570 if ( null !== $settings['data'] ) {
571 update_user_option( $admin_settings, $settings['data'] );
572
573 if ( null !== $theme ) {
574 $theme_settings = WPDA_Settings::get_admin_settings_key(
575 'theme',
576 $schema_name ,
577 $table_name
578 );
579 update_user_option( $theme_settings, $theme );
580 }
581 } else {
582 delete_user_option( $admin_settings );
583 }
584 }
585
586 return $this->WPDA_Rest_Response( __( 'Successfully saved changes', 'wp-data-access' ) );
587 }
588
589 public static function get_admin_settings( $schema_name, $table_name ) {
590 return array(
591 'global' => array(
592 'table' => get_option(
593 WPDA_Settings::get_admin_settings_key(
594 'table',
595 $schema_name,
596 $table_name
597 )
598 ),
599 'form' => get_option(
600 WPDA_Settings::get_admin_settings_key(
601 'form',
602 $schema_name,
603 $table_name
604 )
605 ),
606 'theme' => get_option(
607 WPDA_Settings::get_admin_settings_key(
608 'theme',
609 $schema_name,
610 $table_name
611 )
612 ),
613 ),
614 'local' => array(
615 'table' => get_user_option(
616 WPDA_Settings::get_admin_settings_key(
617 'table',
618 $schema_name,
619 $table_name
620 )
621 ),
622 'form' => get_user_option(
623 WPDA_Settings::get_admin_settings_key(
624 'form',
625 $schema_name,
626 $table_name
627 )
628 ),
629 'theme' => get_user_option(
630 WPDA_Settings::get_admin_settings_key(
631 'theme',
632 $schema_name,
633 $table_name
634 )
635 ),
636 ),
637 );
638 }
639
640 private static function get_admin_settings_key( $target, $schema_name, $table_name ) {
641 return WPDA_Settings::WPDA_SETTINGS .
642 '-' . $target .
643 '-' . str_replace( ' ', '*', $schema_name ) .
644 '-' . str_replace( ' ', '*', $table_name );
645 }
646
647 }
648
649 }
650