PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.1.9
Adminify – White Label, Admin Menu Editor, Login Customizer v3.1.9
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
adminify / Libs / adminify-framework / classes / admin-options.class.php

admin-options.class.php in Adminify – White Label, Admin Menu Editor, Login Customizer 3.1.9, at Libs/adminify-framework/classes/admin-options.class.php

659 lines 24.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php if ( ! defined( 'ABSPATH' ) ) {
2 die;
3 } // Cannot access directly.
4 /**
5 *
6 * Options Class
7 *
8 * @since 1.0.0
9 * @version 1.0.0
10 */
11 if ( ! class_exists( 'ADMINIFY_Options' ) ) {
12 class ADMINIFY_Options extends ADMINIFY_Abstract {
13
14
15 // constans
16 public $unique = '';
17 public $notice = '';
18 public $abstract = 'options';
19 public $sections = [];
20 public $options = [];
21 public $errors = [];
22 public $pre_tabs = [];
23 public $pre_fields = [];
24 public $pre_sections = [];
25 public $args = [
26
27 // framework title
28 'framework_title' => 'Adminify Framework <small>by Adminify</small>',
29 'framework_class' => '',
30
31 // menu settings
32 'menu_title' => '',
33 'menu_slug' => '',
34 'menu_type' => 'menu',
35 'menu_capability' => 'manage_options',
36 'menu_icon' => null,
37 'menu_position' => null,
38 'menu_hidden' => false,
39 'menu_parent' => '',
40 'sub_menu_title' => '',
41
42 // menu extras
43 'show_bar_menu' => true,
44 'show_sub_menu' => true,
45 'show_in_network' => true,
46 'show_in_customizer' => false,
47
48 'show_search' => true,
49 'show_reset_all' => true,
50 'show_reset_section' => true,
51 'show_footer' => true,
52 'show_all_options' => true,
53 'show_form_warning' => true,
54 'sticky_header' => true,
55 'save_defaults' => true,
56 'ajax_save' => true,
57 'form_action' => '',
58
59 // admin bar menu settings
60 'admin_bar_menu_icon' => '',
61 'admin_bar_menu_priority' => 50,
62
63 // footer
64 'footer_text' => '',
65 'footer_after' => '',
66 'footer_credit' => '',
67
68 // database model
69 'database' => '', // options, transient, theme_mod, network
70 'transient_time' => 0,
71
72 // contextual help
73 'contextual_help' => [],
74 'contextual_help_sidebar' => '',
75
76 // typography options
77 'enqueue_webfont' => true,
78 'async_webfont' => false,
79
80 // others
81 'output_css' => true,
82
83 // theme
84 'nav' => 'normal',
85 'theme' => 'dark',
86 'class' => '',
87
88 // external default values
89 'defaults' => [],
90
91 ];
92
93 // run framework construct
94 public function __construct( $key, $params = [] ) {
95 $this->unique = $key;
96 $this->args = apply_filters( "adminify_{$this->unique}_args", wp_parse_args( $params['args'], $this->args ), $this );
97 $this->sections = apply_filters( "adminify_{$this->unique}_sections", $params['sections'], $this );
98
99 // run only is admin panel options, avoid performance loss
100 $this->pre_tabs = $this->pre_tabs( $this->sections );
101 $this->pre_fields = $this->pre_fields( $this->sections );
102 $this->pre_sections = $this->pre_sections( $this->sections );
103
104 $this->get_options();
105 $this->set_options();
106 $this->save_defaults();
107
108 add_action( 'admin_menu', [ $this, 'add_admin_menu' ] );
109 add_action( 'admin_bar_menu', [ $this, 'add_admin_bar_menu' ], $this->args['admin_bar_menu_priority'] );
110 add_action( 'wp_ajax_adminify_' . $this->unique . '_ajax_save', [ $this, 'ajax_save' ] );
111
112 if ( $this->args['database'] === 'network' && ! empty( $this->args['show_in_network'] ) ) {
113 add_action( 'network_admin_menu', [ $this, 'add_admin_menu' ] );
114 }
115
116 // wp enqeueu for typography and output css
117 parent::__construct();
118 }
119
120 // instance
121 public static function instance( $key, $params = [] ) {
122 return new self( $key, $params );
123 }
124
125 public function pre_tabs( $sections ) {
126 $result = [];
127 $parents = [];
128 $count = 100;
129
130 foreach ( $sections as $key => $section ) {
131 if ( ! empty( $section['parent'] ) ) {
132 $section['priority'] = ( isset( $section['priority'] ) ) ? $section['priority'] : $count;
133 $parents[ $section['parent'] ][] = $section;
134 unset( $sections[ $key ] );
135 }
136 $count++;
137 }
138
139 foreach ( $sections as $key => $section ) {
140 $section['priority'] = ( isset( $section['priority'] ) ) ? $section['priority'] : $count;
141 if ( ! empty( $section['id'] ) && ! empty( $parents[ $section['id'] ] ) ) {
142 $section['subs'] = wp_list_sort( $parents[ $section['id'] ], [ 'priority' => 'ASC' ], 'ASC', true );
143 }
144 $result[] = $section;
145 $count++;
146 }
147
148 return wp_list_sort( $result, [ 'priority' => 'ASC' ], 'ASC', true );
149 }
150
151 public function pre_fields( $sections ) {
152 $result = [];
153
154 foreach ( $sections as $key => $section ) {
155 if ( ! empty( $section['fields'] ) ) {
156 foreach ( $section['fields'] as $field ) {
157 $result[] = $field;
158 }
159 }
160 }
161
162 return $result;
163 }
164
165 public function pre_sections( $sections ) {
166 $result = [];
167
168 foreach ( $this->pre_tabs as $tab ) {
169 if ( ! empty( $tab['subs'] ) ) {
170 foreach ( $tab['subs'] as $sub ) {
171 $sub['ptitle'] = $tab['title'];
172 $result[] = $sub;
173 }
174 }
175 if ( empty( $tab['subs'] ) ) {
176 $result[] = $tab;
177 }
178 }
179
180 return $result;
181 }
182
183 // add admin bar menu
184 public function add_admin_bar_menu( $wp_admin_bar ) {
185 if ( ! current_user_can( $this->args['menu_capability'] ) ) {
186 return;
187 }
188
189 if ( is_network_admin() && ( $this->args['database'] !== 'network' || $this->args['show_in_network'] !== true ) ) {
190 return;
191 }
192
193 if ( ! empty( $this->args['show_bar_menu'] ) && empty( $this->args['menu_hidden'] ) ) {
194 global $submenu;
195
196 $menu_slug = $this->args['menu_slug'];
197 $menu_icon = ( ! empty( $this->args['admin_bar_menu_icon'] ) ) ? '<span class="adminify-ab-icon ab-icon ' . esc_attr( $this->args['admin_bar_menu_icon'] ) . '"></span>' : '';
198
199 $wp_admin_bar->add_node(
200 [
201 'id' => $menu_slug,
202 'title' => $menu_icon . esc_attr( $this->args['menu_title'] ),
203 'href' => esc_url( ( is_network_admin() ) ? network_admin_url( 'admin.php?page=' . $menu_slug ) : admin_url( 'admin.php?page=' . $menu_slug ) ),
204 ]
205 );
206
207 if ( ! empty( $submenu[ $menu_slug ] ) ) {
208 foreach ( $submenu[ $menu_slug ] as $menu_key => $menu_value ) {
209 $wp_admin_bar->add_node(
210 [
211 'parent' => $menu_slug,
212 'id' => $menu_slug . '-' . $menu_key,
213 'title' => $menu_value[0],
214 'href' => esc_url( ( is_network_admin() ) ? network_admin_url( 'admin.php?page=' . $menu_value[2] ) : admin_url( 'admin.php?page=' . $menu_value[2] ) ),
215 ]
216 );
217 }
218 }
219 }
220 }
221
222 public function ajax_save() {
223 $result = $this->set_options( true );
224
225 if ( ! $result ) {
226 wp_send_json_error( [ 'error' => esc_html__( 'Error while saving the changes.', 'adminify' ) ] );
227 } else {
228 wp_send_json_success(
229 [
230 'notice' => $this->notice,
231 'errors' => $this->errors,
232 ]
233 );
234 }
235 }
236
237 // get default value
238 public function get_default( $field ) {
239 $default = ( isset( $field['default'] ) ) ? $field['default'] : '';
240 $default = ( isset( $this->args['defaults'][ $field['id'] ] ) ) ? $this->args['defaults'][ $field['id'] ] : $default;
241
242 return $default;
243 }
244
245 // save defaults and set new fields value to main options
246 public function save_defaults() {
247 $tmp_options = $this->options;
248
249 foreach ( $this->pre_fields as $field ) {
250 if ( ! empty( $field['id'] ) ) {
251 $this->options[ $field['id'] ] = ( isset( $this->options[ $field['id'] ] ) ) ? $this->options[ $field['id'] ] : $this->get_default( $field );
252 }
253 }
254
255 if ( $this->args['save_defaults'] && empty( $tmp_options ) ) {
256 $this->save_options( $this->options );
257 }
258 }
259
260 // set options
261 public function set_options( $ajax = false ) {
262 if ( $ajax && ! empty( $_POST['data'] ) ) {
263 // sanitized after decode
264 $response = wp_kses_post_deep( json_decode( wp_unslash( $_POST['data'] ), true ) );
265 } else {
266 $response = wp_kses_post_deep( wp_unslash( $_POST ) );
267 }
268
269 // Set variables.
270 $data = [];
271 $noncekey = 'adminify_options_nonce' . $this->unique;
272 $nonce = ( ! empty( $response[ $noncekey ] ) ) ? $response[ $noncekey ] : '';
273 $options = ( ! empty( $response[ $this->unique ] ) ) ? $response[ $this->unique ] : [];
274 $transient = ( ! empty( $response['adminify_transient'] ) ) ? $response['adminify_transient'] : [];
275
276 if ( wp_verify_nonce( $nonce, 'adminify_options_nonce' ) ) {
277 $importing = false;
278 $section_id = ( ! empty( $transient['section'] ) ) ? $transient['section'] : '';
279
280 if ( ! $ajax && ! empty( $response['adminify_import_data'] ) ) {
281
282 // XSS ok.
283 // No worries, This "POST" requests is sanitizing in the below foreach. see #L337 - #L341
284 $import_data = json_decode( wp_unslash( trim( $response['adminify_import_data'] ) ), true );
285 $options = ( is_array( $import_data ) && ! empty( $import_data ) ) ? $import_data : [];
286 $importing = true;
287 $this->notice = esc_html__( 'Settings successfully imported.', 'adminify' );
288 }
289
290 if ( ! empty( $transient['reset'] ) ) {
291 foreach ( $this->pre_fields as $field ) {
292 if ( ! empty( $field['id'] ) ) {
293 $data[ $field['id'] ] = $this->get_default( $field );
294 }
295 }
296
297 $this->notice = esc_html__( 'Default settings restored.', 'adminify' );
298 } elseif ( ! empty( $transient['reset_section'] ) && ! empty( $section_id ) ) {
299 if ( ! empty( $this->pre_sections[ $section_id - 1 ]['fields'] ) ) {
300 foreach ( $this->pre_sections[ $section_id - 1 ]['fields'] as $field ) {
301 if ( ! empty( $field['id'] ) ) {
302 $data[ $field['id'] ] = $this->get_default( $field );
303 }
304 }
305 }
306
307 $data = wp_parse_args( $data, $this->options );
308
309 $this->notice = esc_html__( 'Default settings restored.', 'adminify' );
310 } else {
311
312 // sanitize and validate
313 foreach ( $this->pre_fields as $field ) {
314 if ( ! empty( $field['id'] ) ) {
315 $field_id = $field['id'];
316 $field_value = isset( $options[ $field_id ] ) ? $options[ $field_id ] : '';
317
318 // Ajax and Importing doing wp_unslash already.
319 if ( ! $ajax && ! $importing ) {
320 $field_value = wp_unslash( $field_value );
321 }
322
323 // Sanitize "post" request of field.
324 if ( ! isset( $field['sanitize'] ) ) {
325 if ( is_array( $field_value ) ) {
326 $data[ $field_id ] = wp_kses_post_deep( $field_value );
327 } else {
328 $data[ $field_id ] = wp_kses_post( $field_value );
329 }
330 } elseif ( isset( $field['sanitize'] ) && is_callable( $field['sanitize'] ) ) {
331 $data[ $field_id ] = call_user_func( $field['sanitize'], $field_value );
332 } else {
333 $data[ $field_id ] = $field_value;
334 }
335
336 // Validate "post" request of field.
337 if ( isset( $field['validate'] ) && is_callable( $field['validate'] ) ) {
338 $has_validated = call_user_func( $field['validate'], $field_value );
339
340 if ( ! empty( $has_validated ) ) {
341 $data[ $field_id ] = ( isset( $this->options[ $field_id ] ) ) ? $this->options[ $field_id ] : '';
342 $this->errors[ $field_id ] = $has_validated;
343 }
344 }
345 }
346 }
347 }
348
349 $data = apply_filters( "adminify_{$this->unique}_save", $data, $this );
350
351 do_action( "adminify_{$this->unique}_save_before", $data, $this );
352
353 $this->options = $data;
354
355 $this->save_options( $data );
356
357 do_action( "adminify_{$this->unique}_save_after", $data, $this );
358
359 if ( empty( $this->notice ) ) {
360 $this->notice = esc_html__( 'Settings saved.', 'adminify' );
361 }
362
363 return true;
364 }
365
366 return false;
367 }
368
369 // save options database
370 public function save_options( $data ) {
371 if ( $this->args['database'] === 'transient' ) {
372 set_transient( $this->unique, $data, $this->args['transient_time'] );
373 } elseif ( $this->args['database'] === 'theme_mod' ) {
374 set_theme_mod( $this->unique, $data );
375 } elseif ( $this->args['database'] === 'network' ) {
376 update_site_option( $this->unique, $data );
377 } else {
378 update_option( $this->unique, $data );
379 }
380
381 do_action( "adminify_{$this->unique}_saved", $data, $this );
382 }
383
384 // get options from database
385 public function get_options() {
386 if ( $this->args['database'] === 'transient' ) {
387 $this->options = get_transient( $this->unique );
388 } elseif ( $this->args['database'] === 'theme_mod' ) {
389 $this->options = get_theme_mod( $this->unique );
390 } elseif ( $this->args['database'] === 'network' ) {
391 $this->options = get_site_option( $this->unique );
392 } else {
393 $this->options = get_option( $this->unique );
394 }
395
396 if ( empty( $this->options ) ) {
397 $this->options = [];
398 }
399
400 return $this->options;
401 }
402
403 // admin menu
404 public function add_admin_menu() {
405 extract( $this->args );
406
407 if ( $menu_type === 'submenu' ) {
408 $menu_page = call_user_func( 'add_submenu_page', $menu_parent, esc_attr( $menu_title ), esc_attr( $menu_title ), $menu_capability, $menu_slug, [ $this, 'add_options_html' ] );
409 } else {
410 $menu_page = call_user_func( 'add_menu_page', esc_attr( $menu_title ), esc_attr( $menu_title ), $menu_capability, $menu_slug, [ $this, 'add_options_html' ], $menu_icon, $menu_position );
411
412 if ( ! empty( $sub_menu_title ) ) {
413 call_user_func( 'add_submenu_page', $menu_slug, esc_attr( $sub_menu_title ), esc_attr( $sub_menu_title ), $menu_capability, $menu_slug, [ $this, 'add_options_html' ] );
414 }
415
416 if ( ! empty( $this->args['show_sub_menu'] ) && count( $this->pre_tabs ) > 1 ) {
417
418 // create submenus
419 foreach ( $this->pre_tabs as $section ) {
420 call_user_func( 'add_submenu_page', $menu_slug, esc_attr( $section['title'] ), esc_attr( $section['title'] ), $menu_capability, $menu_slug . '#tab=' . sanitize_title( $section['title'] ), '__return_null' );
421 }
422
423 remove_submenu_page( $menu_slug, $menu_slug );
424 }
425
426 if ( ! empty( $menu_hidden ) ) {
427 remove_menu_page( $menu_slug );
428 }
429 }
430
431 add_action( 'load-' . $menu_page, [ $this, 'add_page_on_load' ] );
432 }
433
434 public function add_page_on_load() {
435 if ( ! empty( $this->args['contextual_help'] ) ) {
436 $screen = get_current_screen();
437
438 foreach ( $this->args['contextual_help'] as $tab ) {
439 $screen->add_help_tab( $tab );
440 }
441
442 if ( ! empty( $this->args['contextual_help_sidebar'] ) ) {
443 $screen->set_help_sidebar( $this->args['contextual_help_sidebar'] );
444 }
445 }
446
447 add_filter( 'admin_footer_text', [ $this, 'add_admin_footer_text' ] );
448 }
449
450 public function add_admin_footer_text() {
451 $default = 'Thank you for creating with <a href="http://adminifyframework.com/" target="_blank">Adminify Framework</a>';
452 if ( ! empty( $this->args['footer_credit'] ) ) {
453 echo wp_kses_post( $this->args['footer_credit'] );
454 } else {
455 echo wp_kses_post( $default );
456 }
457 }
458
459 public function error_check( $sections, $err = '' ) {
460 if ( ! $this->args['ajax_save'] ) {
461 if ( ! empty( $sections['fields'] ) ) {
462 foreach ( $sections['fields'] as $field ) {
463 if ( ! empty( $field['id'] ) ) {
464 if ( array_key_exists( $field['id'], $this->errors ) ) {
465 $err = '<span class="adminify-label-error">!</span>';
466 }
467 }
468 }
469 }
470
471 if ( ! empty( $sections['subs'] ) ) {
472 foreach ( $sections['subs'] as $sub ) {
473 $err = $this->error_check( $sub, $err );
474 }
475 }
476
477 if ( ! empty( $sections['id'] ) && array_key_exists( $sections['id'], $this->errors ) ) {
478 $err = $this->errors[ $sections['id'] ];
479 }
480 }
481
482 return $err;
483 }
484
485 // option page html output
486 public function add_options_html() {
487 $has_nav = ( count( $this->pre_tabs ) > 1 ) ? true : false;
488 $show_all = ( ! $has_nav ) ? ' adminify-show-all' : '';
489 $ajax_class = ( $this->args['ajax_save'] ) ? ' adminify-save-ajax' : '';
490 $sticky_class = ( $this->args['sticky_header'] ) ? ' adminify-sticky-header' : '';
491 $wrapper_class = ( $this->args['framework_class'] ) ? ' ' . $this->args['framework_class'] : '';
492 $theme = ( $this->args['theme'] ) ? ' adminify-theme-' . $this->args['theme'] : '';
493 $class = ( $this->args['class'] ) ? ' ' . $this->args['class'] : '';
494 $nav_type = ( $this->args['nav'] === 'inline' ) ? 'inline' : 'normal';
495 $form_action = ( $this->args['form_action'] ) ? $this->args['form_action'] : '';
496
497 do_action( 'adminify_options_before' );
498
499 echo '<div class="adminify adminify-options' . esc_attr( $theme . $class . $wrapper_class ) . '" data-slug="' . esc_attr( $this->args['menu_slug'] ) . '" data-unique="' . esc_attr( $this->unique ) . '">';
500
501 echo '<div class="adminify-container">';
502
503 echo '<form method="post" action="' . esc_attr( $form_action ) . '" enctype="multipart/form-data" id="adminify-form" autocomplete="off" novalidate="novalidate">';
504
505 echo '<input type="hidden" class="adminify-section-id" name="adminify_transient[section]" value="1">';
506
507 wp_nonce_field( 'adminify_options_nonce', 'adminify_options_nonce' . $this->unique );
508
509 echo '<div class="adminify-header' . esc_attr( $sticky_class ) . '">';
510 echo '<div class="adminify-header-inner">';
511
512 echo '<div class="adminify-header-left">';
513 echo '<h1>' . wp_kses_post( $this->args['framework_title'] ) . '</h1>';
514 echo '</div>';
515
516 echo '<div class="adminify-header-right">';
517
518 $notice_class = ( ! empty( $this->notice ) ) ? 'adminify-form-show' : '';
519 $notice_text = ( ! empty( $this->notice ) ) ? $this->notice : '';
520
521 echo '<div class="adminify-form-result adminify-form-success ' . esc_attr( $notice_class ) . '">' . wp_kses_post( $notice_text ) . '</div>';
522
523 echo ( $this->args['show_form_warning'] ) ? '<div class="adminify-form-result adminify-form-warning">' . esc_html__( 'You have unsaved changes, save your changes!', 'adminify' ) . '</div>' : '';
524
525 echo ( $has_nav && $this->args['show_all_options'] ) ? '<div class="adminify-expand-all" title="' . esc_html__( 'show all settings', 'adminify' ) . '"><i class="fas fa-outdent"></i></div>' : '';
526
527 echo ( $this->args['show_search'] ) ? '<div class="adminify-search"><input type="text" name="adminify-search" placeholder="' . esc_html__( 'Search...', 'adminify' ) . '" autocomplete="off" /></div>' : '';
528
529 echo '<div class="adminify-buttons">';
530 echo '<input type="submit" name="' . esc_attr( $this->unique ) . '[_nonce][save]" class="button button-primary adminify-top-save adminify-save' . esc_attr( $ajax_class ) . '" value="' . esc_html__( 'Save', 'adminify' ) . '" data-save="' . esc_html__( 'Saving...', 'adminify' ) . '">';
531 echo ( $this->args['show_reset_section'] ) ? '<input type="submit" name="adminify_transient[reset_section]" class="button button-secondary adminify-reset-section adminify-confirm" value="' . esc_html__( 'Reset Section', 'adminify' ) . '" data-confirm="' . esc_html__( 'Are you sure to reset this section options?', 'adminify' ) . '">' : '';
532 echo ( $this->args['show_reset_all'] ) ? '<input type="submit" name="adminify_transient[reset]" class="button adminify-warning-primary adminify-reset-all adminify-confirm" value="' . ( ( $this->args['show_reset_section'] ) ? esc_html__( 'Reset All', 'adminify' ) : esc_html__( 'Reset', 'adminify' ) ) . '" data-confirm="' . esc_html__( 'Are you sure you want to reset all settings to default values?', 'adminify' ) . '">' : '';
533 echo '</div>';
534
535 echo '</div>';
536
537 echo '<div class="clear"></div>';
538 echo '</div>';
539 echo '</div>';
540
541 echo '<div class="adminify-wrapper' . esc_attr( $show_all ) . '">';
542
543 if ( $has_nav ) {
544 echo '<div class="adminify-nav adminify-nav-' . esc_attr( $nav_type ) . ' adminify-nav-options">';
545
546 echo '<ul>';
547
548 foreach ( $this->pre_tabs as $tab ) {
549 $tab_id = sanitize_title( $tab['title'] );
550 $tab_error = $this->error_check( $tab );
551 $tab_icon = ( ! empty( $tab['icon'] ) ) ? '<i class="adminify-tab-icon ' . esc_attr( $tab['icon'] ) . '"></i>' : '';
552
553 if ( ! empty( $tab['subs'] ) ) {
554 echo '<li class="adminify-tab-item">';
555
556 echo '<a href="#tab=' . esc_attr( $tab_id ) . '" data-tab-id="' . esc_attr( $tab_id ) . '" class="adminify-arrow">' . wp_kses_post( $tab_icon . $tab['title'] . $tab_error ) . '</a>';
557
558 echo '<ul>';
559
560 foreach ( $tab['subs'] as $sub ) {
561 $sub_id = $tab_id . '/' . sanitize_title( $sub['title'] );
562 $sub_error = $this->error_check( $sub );
563 $sub_icon = ( ! empty( $sub['icon'] ) ) ? '<i class="adminify-tab-icon ' . esc_attr( $sub['icon'] ) . '"></i>' : '';
564
565 echo '<li><a href="#tab=' . esc_attr( $sub_id ) . '" data-tab-id="' . esc_attr( $sub_id ) . '">' . wp_kses_post( $sub_icon . $sub['title'] . $sub_error ) . '</a></li>';
566 }
567
568 echo '</ul>';
569
570 echo '</li>';
571 } else {
572 echo '<li class="adminify-tab-item"><a href="#tab=' . esc_attr( $tab_id ) . '" data-tab-id="' . esc_attr( $tab_id ) . '">' . wp_kses_post( $tab_icon . $tab['title'] . $tab_error ) . '</a></li>';
573 }
574 }
575
576 echo '</ul>';
577
578 echo '</div>';
579 }
580
581 echo '<div class="adminify-content">';
582
583 echo '<div class="adminify-sections">';
584
585 foreach ( $this->pre_sections as $section ) {
586 $section_onload = ( ! $has_nav ) ? ' adminify-onload' : '';
587 $section_class = ( ! empty( $section['class'] ) ) ? ' ' . $section['class'] : '';
588 $section_icon = ( ! empty( $section['icon'] ) ) ? '<i class="adminify-section-icon ' . esc_attr( $section['icon'] ) . '"></i>' : '';
589 $section_title = ( ! empty( $section['title'] ) ) ? $section['title'] : '';
590 $section_parent = ( ! empty( $section['ptitle'] ) ) ? sanitize_title( $section['ptitle'] ) . '/' : '';
591 $section_slug = ( ! empty( $section['title'] ) ) ? sanitize_title( $section_title ) : '';
592
593 echo '<div class="adminify-section hidden' . esc_attr( $section_onload . $section_class ) . '" data-section-id="' . esc_attr( $section_parent . $section_slug ) . '">';
594 echo ( $has_nav ) ? '<div class="adminify-section-title"><h3>' . wp_kses_post( $section_icon . $section_title ) . '</h3></div>' : '';
595 echo ( ! empty( $section['description'] ) ) ? '<div class="adminify-field adminify-section-description">' . wp_kses_post( $section['description'] ) . '</div>' : '';
596
597 if ( ! empty( $section['fields'] ) ) {
598 foreach ( $section['fields'] as $field ) {
599 $is_field_error = $this->error_check( $field );
600
601 if ( ! empty( $is_field_error ) ) {
602 $field['_error'] = $is_field_error;
603 }
604
605 if ( ! empty( $field['id'] ) ) {
606 $field['default'] = $this->get_default( $field );
607 }
608
609 $value = ( ! empty( $field['id'] ) && isset( $this->options[ $field['id'] ] ) ) ? $this->options[ $field['id'] ] : '';
610
611 ADMINIFY::field( $field, $value, $this->unique, 'options' );
612 }
613 } else {
614 echo '<div class="adminify-no-option">' . esc_html__( 'No data available.', 'adminify' ) . '</div>';
615 }
616
617 echo '</div>';
618 }
619
620 echo '</div>';
621
622 echo '<div class="clear"></div>';
623
624 echo '</div>';
625
626 echo ( $has_nav && $nav_type === 'normal' ) ? '<div class="adminify-nav-background"></div>' : '';
627
628 echo '</div>';
629
630 if ( ! empty( $this->args['show_footer'] ) ) {
631 echo '<div class="adminify-footer">';
632
633 echo '<div class="adminify-buttons">';
634 echo '<input type="submit" name="adminify_transient[save]" class="button button-primary adminify-save' . esc_attr( $ajax_class ) . '" value="' . esc_html__( 'Save', 'adminify' ) . '" data-save="' . esc_html__( 'Saving...', 'adminify' ) . '">';
635 echo ( $this->args['show_reset_section'] ) ? '<input type="submit" name="adminify_transient[reset_section]" class="button button-secondary adminify-reset-section adminify-confirm" value="' . esc_html__( 'Reset Section', 'adminify' ) . '" data-confirm="' . esc_html__( 'Are you sure to reset this section options?', 'adminify' ) . '">' : '';
636 echo ( $this->args['show_reset_all'] ) ? '<input type="submit" name="adminify_transient[reset]" class="button adminify-warning-primary adminify-reset-all adminify-confirm" value="' . ( ( $this->args['show_reset_section'] ) ? esc_html__( 'Reset All', 'adminify' ) : esc_html__( 'Reset', 'adminify' ) ) . '" data-confirm="' . esc_html__( 'Are you sure you want to reset all settings to default values?', 'adminify' ) . '">' : '';
637 echo '</div>';
638
639 echo ( ! empty( $this->args['footer_text'] ) ) ? '<div class="adminify-copyright">' . wp_kses_post( $this->args['footer_text'] ) . '</div>' : '';
640
641 echo '<div class="clear"></div>';
642 echo '</div>';
643 }
644
645 echo '</form>';
646
647 echo '</div>';
648
649 echo '<div class="clear"></div>';
650
651 echo ( ! empty( $this->args['footer_after'] ) ) ? wp_kses_post( $this->args['footer_after'] ) : '';
652
653 echo '</div>';
654
655 do_action( 'adminify_options_after' );
656 }
657 }
658 }
659