PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.2.4.1
Adminify – White Label, Admin Menu Editor, Login Customizer v3.2.4.1
4.3.2 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 All 165 releases
← All changes | Libs/adminify-framework/classes/admin-options.class.php +504 -518 4.1.173.2.4.1 View file →
@@ -1,5 +1,7 @@
1 -<?php if ( ! defined( 'ABSPATH' ) ) { die; } // Cannot access directly.
1 +<?php if ( ! defined( 'ABSPATH' ) ) {
2 + die;
3 +} // Cannot access directly.
2 4 /**
3 5 *
4 6 * Options Class
5 7 *
@@ -4,669 +6,653 @@
4 6 * Options Class
5 7 *
6 8 * @since 1.0.0
7 9 * @version 1.0.0
8 - *
9 10 */
10 11 if ( ! class_exists( 'ADMINIFY_Options' ) ) {
11 - class ADMINIFY_Options extends ADMINIFY_Abstract {
12 + class ADMINIFY_Options extends ADMINIFY_Abstract {
12 13
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 14
25 - // framework title
26 - 'framework_title' => 'Adminify Framework <small>by Adminify</small>',
27 - 'framework_class' => '',
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 = [
28 26
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' => '',
27 + // framework title
28 + 'framework_title' => 'Adminify Framework <small>by Adminify</small>',
29 + 'framework_class' => '',
40 30
41 - // menu extras
42 - 'show_bar_menu' => true,
43 - 'show_sub_menu' => true,
44 - 'show_in_network' => true,
45 - 'show_in_customizer' => false,
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' => '',
46 41
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' => '',
42 + // menu extras
43 + 'show_bar_menu' => true,
44 + 'show_sub_menu' => true,
45 + 'show_in_network' => true,
46 + 'show_in_customizer' => false,
57 47
58 - // admin bar menu settings
59 - 'admin_bar_menu_icon' => '',
60 - 'admin_bar_menu_priority' => 50,
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' => '',
61 58
62 - // footer
63 - 'footer_text' => 'Thank you for creating with Adminify Framework',
64 - 'footer_after' => '',
65 - 'footer_credit' => '',
59 + // admin bar menu settings
60 + 'admin_bar_menu_icon' => '',
61 + 'admin_bar_menu_priority' => 50,
66 62
67 - // database model
68 - 'database' => '', // options, transient, theme_mod, network
69 - 'transient_time' => 0,
63 + // footer
64 + 'footer_text' => '',
65 + 'footer_after' => '',
66 + 'footer_credit' => '',
70 67
71 - // contextual help
72 - 'contextual_help' => array(),
73 - 'contextual_help_sidebar' => '',
68 + // database model
69 + 'database' => '', // options, transient, theme_mod, network
70 + 'transient_time' => 0,
74 71
75 - // typography options
76 - 'enqueue_webfont' => true,
77 - 'async_webfont' => false,
72 + // contextual help
73 + 'contextual_help' => [],
74 + 'contextual_help_sidebar' => '',
78 75
79 - // others
80 - 'output_css' => true,
76 + // typography options
77 + 'enqueue_webfont' => true,
78 + 'async_webfont' => false,
81 79
82 - // theme
83 - 'nav' => 'normal',
84 - 'theme' => 'dark',
85 - 'class' => '',
80 + // others
81 + 'output_css' => true,
86 82
87 - // external default values
88 - 'defaults' => array(),
83 + // theme
84 + 'nav' => 'normal',
85 + 'theme' => 'dark',
86 + 'class' => '',
89 87
90 - );
88 + // external default values
89 + 'defaults' => [],
91 90
92 - // run framework construct
93 - public function __construct( $key, $params = array() ) {
91 + ];
94 92
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 );
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 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 );
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 103
104 - $this->get_options();
105 - $this->set_options();
106 - $this->save_defaults();
104 + $this->get_options();
105 + $this->set_options();
106 + $this->save_defaults();
107 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' ) );
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 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 - }
112 + if ( $this->args['database'] === 'network' && ! empty( $this->args['show_in_network'] ) ) {
113 + add_action( 'network_admin_menu', [ $this, 'add_admin_menu' ] );
114 + }
115 115
116 - // wp enqeueu for typography and output css
117 - parent::__construct();
116 + // wp enqeueu for typography and output css
117 + parent::__construct();
118 + }
118 119
119 - }
120 + // instance
121 + public static function instance( $key, $params = [] ) {
122 + return new self( $key, $params );
123 + }
120 124
121 - // instance
122 - public static function instance( $key, $params = array() ) {
123 - return new self( $key, $params );
124 - }
125 + public function pre_tabs( $sections ) {
126 + $result = [];
127 + $parents = [];
128 + $count = 100;
125 129
126 - // add admin bar menu
127 - public function add_admin_bar_menu( $wp_admin_bar ) {
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 + }
128 138
129 - if ( ! current_user_can( $this->args['menu_capability'] ) ) {
130 - return;
131 - }
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 + }
132 147
133 - if ( is_network_admin() && ( $this->args['database'] !== 'network' || $this->args['show_in_network'] !== true ) ) {
134 - return;
135 - }
148 + return wp_list_sort( $result, [ 'priority' => 'ASC' ], 'ASC', true );
149 + }
136 150
137 - if ( ! empty( $this->args['show_bar_menu'] ) && empty( $this->args['menu_hidden'] ) ) {
151 + public function pre_fields( $sections ) {
152 + $result = [];
138 153
139 - global $submenu;
154 + foreach ( $sections as $key => $section ) {
155 + if ( ! empty( $section['fields'] ) ) {
156 + foreach ( $section['fields'] as $field ) {
157 + $result[] = $field;
158 + }
159 + }
160 + }
140 161
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>' : '';
162 + return $result;
163 + }
143 164
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 - ) );
165 + public function pre_sections( $sections ) {
166 + $result = [];
149 167
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 - }
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 + }
160 179
161 - }
180 + return $result;
181 + }
162 182
163 - }
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 + }
164 188
165 - public function ajax_save() {
189 + if ( is_network_admin() && ( $this->args['database'] !== 'network' || $this->args['show_in_network'] !== true ) ) {
190 + return;
191 + }
166 192
167 - $result = $this->set_options( true );
193 + if ( ! empty( $this->args['show_bar_menu'] ) && empty( $this->args['menu_hidden'] ) ) {
194 + global $submenu;
168 195
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 - }
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>' : '';
174 198
175 - }
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 + );
176 206
177 - // get default value
178 - public function get_default( $field ) {
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 + }
179 221
180 - $default = ( isset( $field['default'] ) ) ? $field['default'] : '';
181 - $default = ( isset( $this->args['defaults'][$field['id']] ) ) ? $this->args['defaults'][$field['id']] : $default;
222 + public function ajax_save() {
223 + $result = $this->set_options( true );
182 224
183 - return $default;
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 + }
184 236
185 - }
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;
186 241
187 - // save defaults and set new fields value to main options
188 - public function save_defaults() {
242 + return $default;
243 + }
189 244
190 - $tmp_options = $this->options;
245 + // save defaults and set new fields value to main options
246 + public function save_defaults() {
247 + $tmp_options = $this->options;
191 248
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 - }
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 + }
197 254
198 - if ( $this->args['save_defaults'] && empty( $tmp_options ) ) {
199 - $this->save_options( $this->options );
200 - }
255 + if ( $this->args['save_defaults'] && empty( $tmp_options ) ) {
256 + $this->save_options( $this->options );
257 + }
258 + }
201 259
202 - }
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 + }
203 268
204 - // set options
205 - public function set_options( $ajax = false ) {
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'] : [];
206 275
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;
276 + if ( wp_verify_nonce( $nonce, 'adminify_options_nonce' ) ) {
277 + $importing = false;
278 + $section_id = ( ! empty( $transient['section'] ) ) ? $transient['section'] : '';
210 279
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();
280 + if ( ! $ajax && ! empty( $response['adminify_import_data'] ) ) {
217 281
218 - if ( wp_verify_nonce( $nonce, 'adminify_options_nonce' ) ) {
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 + }
219 289
220 - $importing = false;
221 - $section_id = ( ! empty( $transient['section'] ) ) ? $transient['section'] : '';
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 + }
222 296
223 - if ( ! $ajax && ! empty( $response[ 'adminify_import_data' ] ) ) {
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 + }
224 306
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' );
307 + $data = wp_parse_args( $data, $this->options );
231 308
232 - }
309 + $this->notice = esc_html__( 'Default settings restored.', 'adminify' );
310 + } else {
233 311
234 - if ( ! empty( $transient['reset'] ) ) {
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 ] : '';
235 317
236 - foreach ( $this->pre_fields as $field ) {
237 - if ( ! empty( $field['id'] ) ) {
238 - $data[$field['id']] = $this->get_default( $field );
239 - }
240 - }
318 + // Ajax and Importing doing wp_unslash already.
319 + if ( ! $ajax && ! $importing ) {
320 + $field_value = wp_unslash( $field_value );
321 + }
241 322
242 - $this->notice = esc_html__( 'Default settings restored.', 'adminify' );
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 + }
243 335
244 - } else if ( ! empty( $transient['reset_section'] ) && ! empty( $section_id ) ) {
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 );
245 339
246 - if ( ! empty( $this->pre_sections[$section_id-2]['fields'] ) ) {
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 + }
247 348
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 - }
349 + $data = apply_filters( "adminify_{$this->unique}_save", $data, $this );
253 350
254 - }
351 + do_action( "adminify_{$this->unique}_save_before", $data, $this );
255 352
256 - $data = wp_parse_args( $data, $this->options );
353 + $this->options = $data;
257 354
258 - $this->notice = esc_html__( 'Default settings restored.', 'adminify' );
355 + $this->save_options( $data );
259 356
260 - } else {
357 + do_action( "adminify_{$this->unique}_save_after", $data, $this );
261 358
262 - // sanitize and validate
263 - foreach ( $this->pre_fields as $field ) {
359 + if ( empty( $this->notice ) ) {
360 + $this->notice = esc_html__( 'Settings saved.', 'adminify' );
361 + }
264 362
265 - if ( ! empty( $field['id'] ) ) {
363 + return true;
364 + }
266 365
267 - $field_id = $field['id'];
268 - $field_value = isset( $options[$field_id] ) ? $options[$field_id] : '';
366 + return false;
367 + }
269 368
270 - // Ajax and Importing doing wp_unslash already.
271 - if ( ! $ajax && ! $importing ) {
272 - $field_value = wp_unslash( $field_value );
273 - }
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 + }
274 380
275 - // Sanitize "post" request of field.
276 - if ( ! isset( $field['sanitize'] ) ) {
381 + do_action( "adminify_{$this->unique}_saved", $data, $this );
382 + }
277 383
278 - if( is_array( $field_value ) ) {
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 + }
279 395
280 - $data[$field_id] = wp_kses_post_deep( $field_value );
396 + if ( empty( $this->options ) ) {
397 + $this->options = [];
398 + }
281 399
282 - } else {
400 + return $this->options;
401 + }
283 402
284 - $data[$field_id] = wp_kses_post( $field_value );
403 + // admin menu
404 + public function add_admin_menu() {
405 + extract( $this->args );
285 406
286 - }
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 );
287 411
288 - } else if( isset( $field['sanitize'] ) && is_callable( $field['sanitize'] ) ) {
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 + }
289 415
290 - $data[$field_id] = call_user_func( $field['sanitize'], $field_value );
416 + if ( ! empty( $this->args['show_sub_menu'] ) && count( $this->pre_tabs ) > 1 ) {
291 417
292 - } else {
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 + }
293 422
294 - $data[$field_id] = $field_value;
423 + remove_submenu_page( $menu_slug, $menu_slug );
424 + }
295 425
296 - }
426 + if ( ! empty( $menu_hidden ) ) {
427 + remove_menu_page( $menu_slug );
428 + }
429 + }
297 430
298 - // Validate "post" request of field.
299 - if ( isset( $field['validate'] ) && is_callable( $field['validate'] ) ) {
431 + add_action( 'load-' . $menu_page, [ $this, 'add_page_on_load' ] );
432 + }
300 433
301 - $has_validated = call_user_func( $field['validate'], $field_value );
434 + public function add_page_on_load() {
435 + if ( ! empty( $this->args['contextual_help'] ) ) {
436 + $screen = get_current_screen();
302 437
303 - if ( ! empty( $has_validated ) ) {
438 + foreach ( $this->args['contextual_help'] as $tab ) {
439 + $screen->add_help_tab( $tab );
440 + }
304 441
305 - $data[$field_id] = ( isset( $this->options[$field_id] ) ) ? $this->options[$field_id] : '';
306 - $this->errors[$field_id] = $has_validated;
442 + if ( ! empty( $this->args['contextual_help_sidebar'] ) ) {
443 + $screen->set_help_sidebar( $this->args['contextual_help_sidebar'] );
444 + }
445 + }
307 446
308 - }
447 + add_filter( 'admin_footer_text', [ $this, 'add_admin_footer_text' ] );
448 + }
309 449
310 - }
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 + }
311 458
312 - }
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 + }
313 470
314 - }
471 + if ( ! empty( $sections['subs'] ) ) {
472 + foreach ( $sections['subs'] as $sub ) {
473 + $err = $this->error_check( $sub, $err );
474 + }
475 + }
315 476
316 - }
477 + if ( ! empty( $sections['id'] ) && array_key_exists( $sections['id'], $this->errors ) ) {
478 + $err = $this->errors[ $sections['id'] ];
479 + }
480 + }
317 481
318 - $data = apply_filters( "adminify_{$this->unique}_save", $data, $this );
482 + return $err;
483 + }
319 484
320 - do_action( "adminify_{$this->unique}_save_before", $data, $this );
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'] : '';
321 496
322 - $this->options = $data;
497 + do_action( 'adminify_options_before' );
323 498
324 - $this->save_options( $data );
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 ) . '">';
325 500
326 - do_action( "adminify_{$this->unique}_save_after", $data, $this );
501 + echo '<div class="adminify-container">';
327 502
328 - if ( empty( $this->notice ) ) {
329 - $this->notice = esc_html__( 'Settings saved.', 'adminify' );
330 - }
503 + echo '<form method="post" action="' . esc_attr( $form_action ) . '" enctype="multipart/form-data" id="adminify-form" autocomplete="off" novalidate="novalidate">';
331 504
332 - return true;
505 + echo '<input type="hidden" class="adminify-section-id" name="adminify_transient[section]" value="1">';
333 506
334 - }
507 + wp_nonce_field( 'adminify_options_nonce', 'adminify_options_nonce' . $this->unique );
335 508
336 - return false;
509 + echo '<div class="adminify-header' . esc_attr( $sticky_class ) . '">';
510 + echo '<div class="adminify-header-inner">';
337 511
338 - }
512 + echo '<div class="adminify-header-left">';
513 + echo '<h1>' . wp_kses_post( $this->args['framework_title'] ) . '</h1>';
514 + echo '</div>';
339 515
340 - // save options database
341 - public function save_options( $data ) {
516 + echo '<div class="adminify-header-right">';
342 517
343 - $data = apply_filters( "adminify_{$this->unique}_saved_before", $data );
518 + $notice_class = ( ! empty( $this->notice ) ) ? 'adminify-form-show' : '';
519 + $notice_text = ( ! empty( $this->notice ) ) ? $this->notice : '';
344 520
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 - }
521 + echo '<div class="adminify-form-result adminify-form-success ' . esc_attr( $notice_class ) . '">' . wp_kses_post( $notice_text ) . '</div>';
354 522
355 - do_action( "adminify_{$this->unique}_saved", $data, $this );
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>' : '';
356 524
357 - }
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>' : '';
358 526
359 - // get options from database
360 - public function get_options() {
527 + echo ( $this->args['show_search'] ) ? '<div class="adminify-search"><input type="text" name="adminify-search" placeholder="' . esc_html__( 'Search...', 'adminify' ) . '" autocomplete="off" /></div>' : '';
361 528
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 - }
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>';
371 534
372 - if ( empty( $this->options ) ) {
373 - $this->options = array();
374 - }
535 + echo '</div>';
375 536
376 - $this->options = apply_filters( "adminify_{$this->unique}_options", $this->options );
537 + echo '<div class="clear"></div>';
538 + echo '</div>';
539 + echo '</div>';
377 540
378 - return $this->options;
541 + echo '<div class="adminify-wrapper' . esc_attr( $show_all ) . '">';
379 542
380 - }
543 + if ( $has_nav ) {
544 + echo '<div class="adminify-nav adminify-nav-' . esc_attr( $nav_type ) . ' adminify-nav-options">';
381 545
382 - // admin menu
383 - public function add_admin_menu() {
546 + echo '<ul>';
384 547
385 - extract( $this->args );
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>' : '';
386 552
387 - if ( $menu_type === 'submenu' ) {
553 + if ( ! empty( $tab['subs'] ) ) {
554 + echo '<li class="adminify-tab-item">';
388 555
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' ) );
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>';
390 557
391 - } else {
558 + echo '<ul>';
392 559
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 );
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>' : '';
394 564
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 - }
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 + }
398 567
399 - if ( ! empty( $this->args['show_sub_menu'] ) && count( $this->pre_tabs ) > 1 ) {
568 + echo '</ul>';
400 569
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 - }
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 + }
405 575
406 - remove_submenu_page( $menu_slug, $menu_slug );
576 + echo '</ul>';
407 577
408 - }
578 + echo '</div>';
579 + }
409 580
410 - if ( ! empty( $menu_hidden ) ) {
411 - remove_menu_page( $menu_slug );
412 - }
581 + echo '<div class="adminify-content">';
413 582
414 - }
583 + echo '<div class="adminify-sections">';
415 584
416 - add_action( 'load-'. $menu_page, array( $this, 'add_page_on_load' ) );
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 ) : '';
417 592
418 - }
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>' : '';
419 596
420 - public function add_page_on_load() {
597 + if ( ! empty( $section['fields'] ) ) {
598 + foreach ( $section['fields'] as $field ) {
599 + $is_field_error = $this->error_check( $field );
421 600
422 - if ( ! empty( $this->args['contextual_help'] ) ) {
601 + if ( ! empty( $is_field_error ) ) {
602 + $field['_error'] = $is_field_error;
603 + }
423 604
424 - $screen = get_current_screen();
605 + if ( ! empty( $field['id'] ) ) {
606 + $field['default'] = $this->get_default( $field );
607 + }
425 608
426 - foreach ( $this->args['contextual_help'] as $tab ) {
427 - $screen->add_help_tab( $tab );
428 - }
609 + $value = ( ! empty( $field['id'] ) && isset( $this->options[ $field['id'] ] ) ) ? $this->options[ $field['id'] ] : '';
429 610
430 - if ( ! empty( $this->args['contextual_help_sidebar'] ) ) {
431 - $screen->set_help_sidebar( $this->args['contextual_help_sidebar'] );
432 - }
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 + }
433 616
434 - }
617 + echo '</div>';
618 + }
435 619
436 - if ( ! empty( $this->args['footer_credit'] ) ) {
437 - add_filter( 'admin_footer_text', array( $this, 'add_admin_footer_text' ) );
438 - }
620 + echo '</div>';
439 621
440 - }
622 + echo '<div class="clear"></div>';
441 623
442 - public function add_admin_footer_text() {
443 - echo wp_kses_post( $this->args['footer_credit'] );
444 - }
624 + echo '</div>';
445 625
446 - public function error_check( $sections, $err = '' ) {
626 + echo ( $has_nav && $nav_type === 'normal' ) ? '<div class="adminify-nav-background"></div>' : '';
447 627
448 - if ( ! $this->args['ajax_save'] ) {
628 + echo '</div>';
449 629
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 - }
630 + if ( ! empty( $this->args['show_footer'] ) ) {
631 + echo '<div class="adminify-footer">';
459 632
460 - if ( ! empty( $sections['subs'] ) ) {
461 - foreach ( $sections['subs'] as $sub ) {
462 - $err = $this->error_check( $sub, $err );
463 - }
464 - }
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>';
465 638
466 - if ( ! empty( $sections['id'] ) && array_key_exists( $sections['id'], $this->errors ) ) {
467 - $err = $this->errors[$sections['id']];
468 - }
639 + echo ( ! empty( $this->args['footer_text'] ) ) ? '<div class="adminify-copyright">' . wp_kses_post( $this->args['footer_text'] ) . '</div>' : '';
469 640
470 - }
641 + echo '<div class="clear"></div>';
642 + echo '</div>';
643 + }
471 644
472 - return $err;
473 - }
645 + echo '</form>';
474 646
475 - // option page html output
476 - public function add_options_html() {
647 + echo '</div>';
477 648
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'] : '';
649 + echo '<div class="clear"></div>';
487 650
488 - do_action( 'adminify_options_before', $this );
651 + echo ( ! empty( $this->args['footer_after'] ) ) ? wp_kses_post( $this->args['footer_after'] ) : '';
489 652
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 ) .'">';
653 + echo '</div>';
491 654
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 - }
655 + do_action( 'adminify_options_after' );
656 + }
657 + }
672 658 }