PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.1.3
Adminify – White Label, Admin Menu Editor, Login Customizer v4.1.3
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 4.1.3, at Libs/adminify-framework/classes/admin-options.class.php

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