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

627 lines 18.5 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() ) {
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 return $this->save_admin_settings( $dbs, $tbl, $settings );
98 case 'explorer_settings':
99 return $this->save_explorer_settings( $dbs, $tbl, $settings );
100 }
101
102 return $this->bad_request();
103
104 }
105
106 private function save_explorer_settings( $schema_name, $table_name, $settings ) {
107
108 global $wpdb;
109 $dml_failed = 0;
110
111 // Handle REST API
112 $rest_api = $settings['rest_api'] ?? null;
113 $rest_api_settings = get_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS );
114 if ( false === $rest_api_settings ) {
115 $rest_api_settings = array();
116 }
117 if ( null !== $rest_api ) {
118 // Add table REST API
119 $rest_api_settings[ $schema_name ][ $table_name ] = $rest_api;
120 } else {
121 // Delete table REST API
122 unset($rest_api_settings[ $schema_name ][ $table_name ]);
123 }
124 update_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS, $rest_api_settings );
125 unset( $settings['rest_api'] );
126
127 // Handle Media columns
128 $media_columns = $settings['column_media'] ?? null;
129 if ( is_array( $media_columns ) ) {
130 foreach ( $media_columns as $column => $value ) {
131 if ( false === $value || '' === $value ) {
132 // Delete column media (no error handling)
133 WPDA_Media_Model::delete( $table_name, $column, $schema_name );
134 } elseif ( 'string' === gettype( $value) ) {
135 if ( false === WPDA_Media_Model::get_column_media( $table_name, $column, $schema_name ) ) {
136 if ( ! WPDA_Media_Model::insert( $table_name, $column, $value, 'Yes', $schema_name ) ) {
137 $dml_failed++;
138 }
139 } else {
140 if ( false === WPDA_Media_Model::update( $table_name, $column, $value, $schema_name ) ) {
141 $dml_failed++;
142 }
143 }
144 }
145 }
146 }
147 unset( $settings['column_media'] );
148
149 // Handle UPDATE | INSERT table and column settings
150 $settings_db = WPDA_Table_Settings_Model::query( $table_name, $schema_name );
151 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
152 // Row found, perform update
153 $settings_from_db = json_decode( $settings_db[0]['wpda_table_settings'], true );
154 foreach ( $settings_from_db as $key => $value ) {
155 if ( ! isset( $settings[ $key ] ) ) {
156 $settings[ $key ] = $value;
157 }
158 }
159
160 WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name );
161 if ( '' !== $wpdb->last_error ) {
162 $dml_failed++;
163 }
164 } else {
165 // No row found, insert new
166 if ( ! WPDA_Table_Settings_Model::insert( $table_name, json_encode( $settings ), $schema_name ) ) {
167 $dml_failed++;
168 }
169 }
170
171 if ( 0 === $dml_failed ) {
172 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
173 } else {
174 if ( '' === $wpdb->last_error ) {
175 return new \WP_Error(
176 /* translators: %s = last dbs 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 /* translators: %s = last dbs error */
183 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
184 array( 'status' => 420 )
185 );
186 }
187 }
188
189 }
190
191 /**
192 * Save table settings.
193 *
194 * @param $schema_name
195 * @param $table_name
196 * @param $settings
197 * @return \WP_Error|\WP_REST_Response
198 */
199 private function save_table_settings( $schema_name, $table_name, $settings ) {
200 if (
201 isset( $settings['table_settings']['hyperlink_definition'] ) &&
202 isset( $settings['unused'] )
203 ) {
204 $sql_dml = $settings['unused'];
205
206 unset( $settings['request_type'] );
207 unset( $settings['unused'] );
208
209 global $wpdb;
210 if ( 'UPDATE' === $sql_dml ) {
211 $settings_db = WPDA_Table_Settings_Model::query( $table_name, $schema_name );
212 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
213 $settings_from_db = json_decode( $settings_db[0]['wpda_table_settings'], true );
214 foreach ( $settings_from_db as $key => $value ) {
215 if ( ! isset( $settings[ $key ] ) ) {
216 $settings[ $key ] = $value;
217 }
218 }
219 }
220
221 if (
222 1 === WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name ) ||
223 (
224 '' === $wpdb->last_error &&
225 0 === WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name )
226 )
227 ) {
228 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
229 } else {
230 return new \WP_Error(
231 /* translators: %s = last dbs error */
232 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
233 array( 'status' => 420 )
234 );
235 }
236 } else {
237 if ( WPDA_Table_Settings_Model::insert( $table_name, json_encode( $settings ), $schema_name ) ) {
238 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
239 } else {
240 return new \WP_Error(
241 /* translators: %s = last dbs error */
242 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $wpdb->last_error ),
243 array( 'status' => 420 )
244 );
245 }
246 }
247 } else {
248 // Nothing really to save, just to satisfy the user experience.
249 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
250 }
251 }
252
253 /**
254 * Save column settings.
255 *
256 * @param $schema_name
257 * @param $table_name
258 * @param $settings
259 * @return \WP_Error|\WP_REST_Response
260 */
261 private function save_column_settings( $schema_name, $table_name, $settings ) {
262 $sql_dml = null;
263 $dml_succeeded = 0;
264 $dml_failed = 0;
265
266 if ( isset( $settings['column_media'] ) ) {
267 // Process media columns.
268 $settings_column_media = $settings['column_media'];
269 foreach ( $settings_column_media as $column => $value ) {
270 if ( isset( $value['value'] ) && isset( $value['dml'] ) ) {
271 if ( 'INSERT' === $value['dml'] ) {
272 if ( WPDA_Media_Model::insert( $table_name, $column, $value['value'], 'Yes', $schema_name ) ) {
273 $dml_succeeded ++;
274 } else {
275 $dml_failed ++;
276 }
277 } elseif ( 'UPDATE' === $value['dml'] ) {
278 if ( '' === $value['value'] ) {
279 if ( 1 === WPDA_Media_Model::delete( $table_name, $column, $schema_name ) ) {
280 $dml_succeeded ++;
281 } else {
282 $dml_failed ++;
283 }
284 } else {
285 if ( 1 === WPDA_Media_Model::update( $table_name, $column, $value['value'], $schema_name ) ) {
286 $dml_succeeded ++;
287 } else {
288 $dml_failed ++;
289 }
290 }
291 }
292 }
293 }
294 unset( $settings['column_media'] );
295 }
296
297 if ( isset( $settings['unused'] ) ) {
298 $settings_unused = $settings['unused'];
299 if ( isset( $settings_unused['sql_dml'] ) ) {
300 $sql_dml = $settings_unused['sql_dml'];
301 }
302 unset( $settings['unused'] );
303 }
304 WPDA::wpda_log_wp_error($settings);
305 WPDA::wpda_log_wp_error($settings_unused);
306
307 if ( null === $sql_dml ) {
308 return new \WP_Error(
309 sprintf(
310 /* translators: %s = contact message */
311 __( 'Failed to save changes [%s]', 'wp-data-access' ),
312 'please contact the plugin development team'
313 ),
314 array( 'status' => 420 )
315 );
316 } else {
317 // Save settings.
318 if ( isset( $settings['request_type'] ) ) {
319 unset( $settings['request_type'] );
320 }
321
322 if ( 'UPDATE' === $sql_dml ) {
323 $settings_db = WPDA_Table_Settings_Model::query( $table_name, $schema_name );
324 if ( isset( $settings_db[0]['wpda_table_settings'] ) ) {
325 $settings_from_db = json_decode( $settings_db[0]['wpda_table_settings'], true );
326 foreach ( $settings_from_db as $key => $value ) {
327 if ( ! isset( $settings[ $key ] ) ) {
328 $settings[ $key ] = $value;
329 }
330 }
331 }
332 if ( 1 === WPDA_Table_Settings_Model::update( $table_name, json_encode( $settings ), $schema_name ) ) {
333 $dml_succeeded ++;
334 }
335 } else {
336 if ( WPDA_Table_Settings_Model::insert( $table_name, json_encode( $settings ), $schema_name ) ) {
337 $dml_succeeded ++;
338 } else {
339 $dml_failed ++;
340 }
341 }
342 }
343
344 if ( $dml_succeeded >= 0 && $dml_failed === 0 ) {
345 return $this->WPDA_Rest_Response( __( 'Changes successfully saved', 'wp-data-access' ) );
346 } else {
347 global $wpdb;
348 $msg = '' !== $wpdb->last_error ? " [{$wpdb->last_error}]" : '';
349
350 return new \WP_Error(
351 /* translators: %s = error message */
352 sprintf( __( 'Failed to save changes [%s]', 'wp-data-access' ), $msg ),
353 array( 'status' => 420 )
354 );
355 }
356 }
357
358 /**
359 * Save dashboard menu changes.
360 *
361 * @param $schema_name
362 * @param $table_name
363 * @param $settings
364 * @return \WP_Error|\WP_REST_Response
365 */
366 private function save_dashboard_menus( $schema_name, $table_name, $settings ) {
367 $dml_succeeded = 0;
368 $dml_failed = 0;
369 $new_menus = array();
370
371 if ( isset( $settings['menu'] ) && is_array( $settings['menu'] ) ) {
372 // Process menu items.
373 foreach ( $settings['menu'] as $menu ) {
374 if ( isset( $menu['menu_name'] ) && isset( $menu['menu_slug'] ) ) {
375 if ( isset( $menu['menu_role'] ) ) {
376 if ( is_array( $menu['menu_role'] ) ) {
377 $menu_role = implode( ',', $menu['menu_role'] );
378 } else {
379 $menu_role = $menu['menu_role'];
380 }
381 } else {
382 $menu_role = '';
383 }
384 if ( isset( $menu['menu_id'] ) && '' === $menu['menu_id'] ) {
385 // Add new menu
386 if ( WPDA_User_Menus_Model::insert(
387 $table_name,
388 $menu['menu_name'],
389 $menu['menu_slug'],
390 $menu_role,
391 $schema_name
392 ) ) {
393 $dml_succeeded ++;
394
395 global $wpdb;
396 $new_menus[] = array(
397 'menu_name' => $menu['menu_name'],
398 'menu_slug' => $menu['menu_slug'],
399 'menu_id' => $wpdb->insert_id,
400 );
401 } else {
402 $dml_failed ++;
403 }
404 } else {
405 if ( isset( $menu['menu_id'] ) ) {
406 // Update existing menu.
407 $update_result = WPDA_User_Menus_Model::update(
408 $menu['menu_id'],
409 $table_name,
410 $menu['menu_name'],
411 $menu['menu_slug'],
412 $menu_role,
413 $schema_name
414 );
415 if ( 1 === $update_result ) {
416 $dml_succeeded ++;
417 }
418 }
419 }
420 }
421 }
422 unset( $settings['menu'] );
423 }
424
425 if ( isset( $settings['delete'] ) && is_array( $settings['delete'] ) ) {
426 // Process menu items to be deleted.
427 foreach ( $settings['delete'] as $menu ) {
428 if ( 1 === WPDA_User_Menus_Model::delete( $menu ) ) {
429 $dml_succeeded++;
430 } else {
431 $dml_failed++;
432 }
433 }
434 unset( $settings['delete'] );
435 }
436
437 if ( $dml_succeeded >= 0 && $dml_failed === 0 ) {
438 return $this->WPDA_Rest_Response(
439 /* translators: %s = table name */
440 sprintf( __( 'Saved dashboard menus for table `%s`', 'wp-data-access' ), $table_name ),
441 $new_menus
442 );
443 } else {
444 global $wpdb;
445 $msg = '' !== $wpdb->last_error ? " [{$wpdb->last_error}]" : '';
446
447 return new \WP_Error(
448 /* translators: 1: table name; 2: error message */
449 sprintf( __( 'Cannot save dashboard menus for table `%1$s`%2$s', 'wp-data-access' ), $table_name, $msg ),
450 array( 'status' => 420 )
451 );
452 }
453 }
454
455 /**
456 * Save rest api settings.
457 *
458 * @param $schema_name
459 * @param $table_name
460 * @param $settings
461 * @return \WP_Error|\WP_REST_Response
462 */
463 private function save_rest_api_settings( $schema_name, $table_name, $settings ) {
464 if ( ! isset( $settings['enabled'] ) ) {
465 return $this->bad_request();
466 }
467
468 $rest_api_settings = get_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS );
469 if ( false === $rest_api_settings ) {
470 $rest_api_settings = array();
471 }
472
473 if ( true === $settings['enabled'] ) {
474 // Add new | update existing REST API rule.
475 $actions = array( 'select', 'insert', 'update', 'delete' );
476 foreach ( $actions as $action ) {
477 if (
478 isset(
479 $settings[ $action ],
480 $settings[ $action ]['authorization'],
481 $settings[ $action ]['methods'],
482 $settings[ $action ]['authorized_roles'],
483 $settings[ $action ]['authorized_users']
484 )
485 ) {
486 unset( $rest_api_settings[ $schema_name ][ $table_name ][ $action ] ); // Unset previous authorization.
487 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['authorization'] = $settings[ $action ]['authorization'];
488 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['methods'] = $settings[ $action ]['methods'];
489 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['authorized_roles'] = $settings[ $action ]['authorized_roles'];
490 $rest_api_settings[ $schema_name ][ $table_name ][ $action ]['authorized_users'] = $settings[ $action ]['authorized_users'];
491 }
492 else {
493 return $this->bad_request();
494 }
495 }
496 } elseif ( false === $settings['enabled'] ) {
497 // Remove existing REST API rule.
498 if ( isset( $settings['select'] ) ) {
499 unset( $rest_api_settings[ $schema_name ][ $table_name ]['select'] );
500 if (
501 isset( $rest_api_settings[ $schema_name ][ $table_name ] ) &&
502 0 === count( $rest_api_settings[ $schema_name ][ $table_name ] ) // phpcs:ignore -- 8.1 proof
503 ) {
504 unset( $rest_api_settings[ $schema_name ][ $table_name ] );
505 if (
506 isset( $rest_api_settings[ $schema_name ] ) &&
507 0 === count( $rest_api_settings[ $schema_name ] ) // phpcs:ignore -- 8.1 proof
508 ) {
509 unset( $rest_api_settings[ $schema_name ] );
510 }
511 }
512 } else {
513 return $this->bad_request();
514 }
515 } else {
516 return $this->bad_request();
517 }
518
519 update_option( WPDA_API::WPDA_REST_API_TABLE_ACCESS, $rest_api_settings );
520
521 return $this->WPDA_Rest_Response(
522 /* translators: %s = table name */
523 sprintf( __( 'Saved REST API settings for table `%s`', 'wp-data-access' ), $table_name )
524 );
525 }
526
527 private function save_admin_settings( $schema_name, $table_name, $settings ) {
528 if (
529 !
530 (
531 isset(
532 $settings['scope'],
533 $settings['target']
534 ) &&
535 (
536 isset(
537 $settings['data']
538 ) ||
539 null === $settings['data']
540 ) &&
541 (
542 'global' === $settings['scope'] ||
543 'user' === $settings['scope']
544 ) &&
545 (
546 'table' === $settings['target'] ||
547 'form' === $settings['target']
548 )
549
550 )
551 ) {
552 return $this->bad_request();
553 }
554
555 $admin_settings = WPDA_Settings::get_admin_settings_key(
556 $settings['target'],
557 $schema_name ,
558 $table_name
559 );
560
561 if ( 'global' === $settings['scope'] ) {
562 // Store settings globally.
563 if ( null !== $settings['data'] ) {
564 update_option( $admin_settings, $settings['data'] );
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 } else {
573 delete_user_option( $admin_settings );
574 }
575 }
576
577 return $this->WPDA_Rest_Response( __( 'Successfully saved changes', 'wp-data-access' ) );
578 }
579
580 public static function get_admin_settings( $schema_name, $table_name ) {
581 return array(
582 'global' => array(
583 'table' => get_option(
584 WPDA_Settings::get_admin_settings_key(
585 'table',
586 $schema_name,
587 $table_name
588 )
589 ),
590 'form' => get_option(
591 WPDA_Settings::get_admin_settings_key(
592 'form',
593 $schema_name,
594 $table_name
595 )
596 ),
597 ),
598 'local' => array(
599 'table' => get_user_option(
600 WPDA_Settings::get_admin_settings_key(
601 'table',
602 $schema_name,
603 $table_name
604 )
605 ),
606 'form' => get_user_option(
607 WPDA_Settings::get_admin_settings_key(
608 'form',
609 $schema_name,
610 $table_name
611 )
612 ),
613 ),
614 );
615 }
616
617 private static function get_admin_settings_key( $target, $schema_name, $table_name ) {
618 return WPDA_Settings::WPDA_SETTINGS .
619 '-' . $target .
620 '-' . str_replace( ' ', '*', $schema_name ) .
621 '-' . str_replace( ' ', '*', $table_name );
622 }
623
624 }
625
626 }
627