PluginProbe
Darkify – Dark Mode & Night Mode for Website & Admin (Dark Theme Included) / 1.3.0
Darkify – Dark Mode & Night Mode for Website & Admin (Dark Theme Included) v1.3.0
2.1.3 2.1.2 2.1.1 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 1.5.5 1.5.4 1.5.3 1.5.2 1.5.1 1.5.0 trunk 1.0.1 1.1.0 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 All 57 releases
darkify / src / Admin / Framework / Classes / DarkifyOptions.php

DarkifyOptions.php in Darkify – Dark Mode & Night Mode for Website & Admin (Dark Theme Included) 1.3.0, at src/Admin/Framework/Classes/DarkifyOptions.php

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