Give_CMB2_Settings_Loader::output()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Give CMB2 settings backward compatibility.
4
 *
5
 * @package     Give
6
 * @subpackage  Classes/Give_CMB2_Settings_Loader
7
 * @copyright   Copyright (c) 2016, GiveWP
8
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
9
 * @since       1.8
10
 */
11
12
if ( ! class_exists( 'Give_CMB2_Settings_Loader' ) ) :
13
14
	/**
15
	 * This class loads the cmb2 settings.
16
	 *
17
	 * @since 1.8
18
	 */
19
	class Give_CMB2_Settings_Loader {
20
21
		/**
22
		 * @since 1.8
23
		 * @var   Give_Plugin_Settings $prev_settings Previous setting class object.
24
		 */
25
		private $id;
26
27
		/**
28
		 * @since 1.8
29
		 * @var   Give_Plugin_Settings $prev_settings Previous setting class object.
30
		 */
31
		private $prev_settings;
32
33
		/**
34
		 * @since 1.8
35
		 * @var   string $current_tab Current setting section.
36
		 */
37
		protected $current_tab;
38
39
		/**
40
		 * @since 1.8
41
		 * @var   string $current_tab Current setting section.
42
		 */
43
		private $current_section;
44
45
46
		/**
47
		 * Give_CMB2_Settings_Loader constructor.
48
		 */
49
		function __construct() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
50
			// Get previous setting class object.
51
			$this->prev_settings = new Give_Plugin_Settings();
52
53
			// Get current tab.
54
			$this->current_tab     = give_get_current_setting_tab();
55
			$this->current_section = empty( $_REQUEST['section'] ) ? ( current( array_keys( $this->get_sections() ) ) ) : sanitize_title( $_REQUEST['section'] );
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
56
57
			// Tab ID.
58
			$this->id = $this->current_tab;
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->current_tab of type string is incompatible with the declared type object<Give_Plugin_Settings> of property $id.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
59
60
			// Add addon tabs.
61
			add_filter( 'give-settings_tabs_array', array( $this, 'add_addon_settings_page' ), 999999 );
62
63
			// Add save hook to addons.
64
			add_action( 'give-settings_get_settings_pages', array( $this, 'setup_addon_save_hook' ), 999999 );
65
66
			// Add backward compatibility filters plugin settings.
67
			$setting_tabs = array( 'general', 'gateways', 'display', 'emails', 'addons', 'licenses' );
68
69
			// Filter Payment Gateways settings.
70
			if ( in_array( $this->current_tab, $setting_tabs ) ) {
71
				add_filter( "give_get_settings_{$this->current_tab}", array(
72
					$this,
73
					'get_filtered_addon_settings',
74
				), 999999, 1 );
75
				add_filter( "give_get_sections_{$this->current_tab}", array(
76
					$this,
77
					'get_filtered_addon_sections',
78
				), 999999, 1 );
79
			}
80
		}
81
82
		/**
83
		 * Default setting tab.
84
		 *
85
		 * @since  1.8
86
		 *
87
		 * @param  $setting_tab
88
		 *
89
		 * @return string
90
		 */
91 View Code Duplication
		function set_default_setting_tab( $setting_tab ) {
0 ignored issues
show
Unused Code introduced by
The parameter $setting_tab is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
92
			$default_tab = '';
93
94
			// Set default tab to first setting tab.
95
			if ( $sections = array_keys( $this->get_sections() ) ) {
96
				$default_tab = current( $sections );
97
			}
98
99
			return $default_tab;
100
		}
101
102
		/**
103
		 * Add addon setting pages.
104
		 *
105
		 * @since  1.8
106
		 *
107
		 * @param  $pages
108
		 *
109
		 * @return mixed
110
		 */
111
		function add_addon_settings_page( $pages ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
112
			// Previous setting page.
113
			$previous_pages = $this->prev_settings->give_get_settings_tabs();
114
115
			// API and System Info setting tab merge to Tools setting tab, so remove them from tabs.
116
			unset( $previous_pages['api'] );
117
			unset( $previous_pages['system_info'] );
118
119
			// Tab is not register.
120
			$pages_diff = array_keys( array_diff( $previous_pages, $pages ) );
121
122
			// Merge old settings with new settings.
123
			$pages = array_merge( $pages, $previous_pages );
124
125
			if ( in_array( $this->current_tab, $pages_diff ) ) {
126
				// Filter & actions.
127
				add_filter( "give_default_setting_tab_section_{$this->current_tab}", array(
128
					$this,
129
					'set_default_setting_tab',
130
				), 10 );
131
				add_action( "give-settings_sections_{$this->current_tab}_page", array( $this, 'output_sections' ) );
132
				add_action( "give-settings_settings_{$this->current_tab}_page", array( $this, 'output' ), 10 );
133
				add_action( "give-settings_save_{$this->current_tab}", array( $this, 'save' ) );
134
			}
135
136
			return $pages;
137
		}
138
139
140
		/**
141
		 * Setup save addon data hook.
142
		 *
143
		 * @since  1.8
144
		 *
145
		 * @param  $pages
146
		 *
147
		 * @return mixed
148
		 */
149
		function setup_addon_save_hook( $pages ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
150
			$page_ids = array();
151
152
			foreach ( $pages as $page ) {
153
				$page_ids = $page->add_settings_page( $page_ids );
154
			}
155
156
			// Previous setting page.
157
			$previous_pages = $this->prev_settings->give_get_settings_tabs();
158
159
			// API and System Info setting tab merge to Tools setting tab, so remove them from tabs.
160
			unset( $previous_pages['api'] );
161
			unset( $previous_pages['system_info'] );
162
163
			// Tab is not register.
164
			$pages_diff = array_keys( array_diff( $previous_pages, $page_ids ) );
165
166
			// Merge old settings with new settings.
167
			// $pages = array_merge( $page_ids, $previous_pages );
168
169
			if ( in_array( $this->current_tab, $pages_diff ) ) {
170
				// Filter & actions.
171
				add_action( "give-settings_save_{$this->current_tab}", array( $this, 'save' ) );
172
			}
173
174
			return $pages;
175
		}
176
177
		/**
178
		 * Get section name from section title
179
		 *
180
		 * @since  1.8
181
		 *
182
		 * @param  $field_name
183
		 *
184
		 * @return string
185
		 */
186
		function get_section_name( $field_name ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
187
			// Bailout.
188
			if ( empty( $field_name ) ) {
189
				return $field_name;
190
			}
191
192
			$section_name = explode( ' ', $field_name );
193
194
			// Output.
195
			return strip_tags( implode( ' ', $section_name ) );
196
		}
197
198
199
		/**
200
		 * Do not translate string
201
		 *
202
		 * @since  1.0
203
		 * @access public
204
		 *
205
		 * @param $translation
206
		 * @param $text
207
		 *
208
		 * @return mixed
209
		 */
210
		public function en_translation( $translation, $text ) {
211
			return $text;
212
		}
213
214
215
		/**
216
		 * Get addon sections.
217
		 *
218
		 * @since  1.8
219
		 *
220
		 * @param  array $sections Array of setting fields (Optional).
221
		 *
222
		 * @return mixed
223
		 */
224
		function get_filtered_addon_sections( $sections = array() ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
225
			// New sections.
226
			$new_sections = array();
227
			$sections_ID  = array_keys( $sections );
228
			$setting_fields = $this->prev_settings->give_settings( $this->current_tab );
229
230
			// We need untranslated settings for backward compatibility.
231
			add_filter( 'gettext', array( $this, 'en_translation' ), 10, 2 );
232
			$en_setting_fields = $this->prev_settings->give_settings( $this->current_tab );
233
			remove_filter( 'gettext', array( $this, 'en_translation' ), 10 );
234
235
			if ( ! empty( $setting_fields ) && ! empty( $setting_fields['fields'] ) ) {
236
237
				foreach ( $setting_fields['fields'] as $index => $field ) {
238
					// Collect new sections from addons.
239
					if ( 'give_title' !== $field['type'] ) {
240
						continue;
241
					}
242
243
					// Untranslated setting name.
244
					$en_setting_field_name = isset( $en_setting_fields['fields'][ $index ]['name'] ) ? $en_setting_fields['fields'][ $index ]['name'] : '';
245
246
					// Section name.
247
					$field['name'] = isset( $field['name'] ) ? $field['name'] : '';
248
					$section_name  = $this->get_section_name( $field['name'] );
249
250
					// Check if section name exit and section title array is not empty.
251
					if ( ! empty( $sections ) && ! empty( $en_setting_field_name ) ) {
252
253
						// Bailout: Do not load section if it is already exist.
254
						if (
255
							in_array( sanitize_title( $en_setting_field_name ), $sections_ID ) // Check section id.
256
							|| in_array( $section_name, $sections )                            // Check section name.
257
						) {
258
							continue;
259
						}
260
					}
261
262
					// Collect new sections from addons.
263
					$new_sections[ sanitize_title( $field['name'] ) ] = $section_name;
264
				}
265
			}
266
267
			// Add new section.
268
			if ( ! empty( $new_sections ) ) {
269
				$sections = array_merge( $sections, $new_sections );
270
			}
271
272
			// Remove section tab conditionally.
273
			switch ( give_get_current_setting_tab() ) {
274
				case 'emails':
275
					// unset( $sections['donation-receipt'] );
276
					unset( $sections['new-donation-notification'] );
277
			}
278
279
			// Output.
280
			return $sections;
281
		}
282
283
284
		/**
285
		 * Get setting fields.
286
		 *
287
		 * @since  1.8
288
		 *
289
		 * @param  array $settings       List of settings.
290
		 * @param  array $setting_fields Main tab settings data.
291
		 *
292
		 * @return array
293
		 */
294
		function get_filtered_addon_settings( $settings, $setting_fields = array() ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
295
			global $wp_filter;
296
297
			$new_setting_fields = array();
298
299
			if ( ! empty( $settings ) ) {
300
				// Bailout: If setting array contain first element of type title then it means it is already created with new setting api (skip this section ).
301
				if ( isset( $settings[0]['type'] ) && 'title' == $settings[0]['type'] ) {
302
					$last_sectionend_pos = 0;
303
					foreach ( $settings as $index => $setting ) {
304
						// We need setting till last section end.
305
						if ( 'sectionend' === $setting['type'] ) {
306
							$last_sectionend_pos = ++ $index;
307
						}
308
					}
309
310
					$settings = array_slice( $settings, 0, $last_sectionend_pos );
311
312
					return $settings;
313
				}
314
315
				// Store title field id.
316
				$prev_title_field_id = '';
317
318
				// Create new setting fields.
319
				foreach ( $settings as $index => $field ) {
320
321
					// Bailout: Must need field type to process.
322
					if ( ! isset( $field['type'] ) ) {
323
						continue;
324
					}
325
326
					// Set wrapper class if any.
327 View Code Duplication
					if ( ! empty( $field['row_classes'] ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
328
						$field['wrapper_class'] = $field['row_classes'];
329
						unset( $field['row_classes'] );
330
					}
331
332
					$field['name'] = ! isset( $field['name'] ) ? '' : $field['name'];
333
					$field['desc'] = ! isset( $field['desc'] ) ? '' : $field['desc'];
334
335
					// Modify cmb2 setting fields.
336
					switch ( $field['type'] ) {
337
						case 'text' :
338
						case 'file' :
339
							$field['css'] = 'width:25em;';
340
							break;
341
342
						case 'text_small' :
343
							$field['type'] = 'text';
344
							break;
345
346
						case 'text_email' :
347
							$field['type'] = 'email';
348
							$field['css']  = 'width:25em;';
349
							break;
350
351
						case 'radio_inline' :
352
							$field['type']  = 'radio';
353
							$field['class'] = 'give-radio-inline';
354
							break;
355
356
						case 'give_title' :
357
							$field['type'] = 'title';
358
359
							// Since we are showing sections, so there now ned to show horizontal rules.
360
							if ( '<hr>' === $field['desc'] ) {
361
								$field['desc'] = '';
362
							}
363
364
							break;
365
					}
366
367
					if ( 'title' === $field['type'] ) {
368
369
						// If we do not have first element as title then these field will be skip from frontend
370
						// because there are not belong to any section, so put all abandon fields under first section.
371
						if ( $index && empty( $prev_title_field_id ) ) {
372
							array_unshift(
373
								$new_setting_fields,
374
								array(
375
									'title' => $field['name'],
376
									'type'  => $field['type'],
377
									'desc'  => $field['desc'],
378
									'id'    => $field['id'],
379
								)
380
							);
381
382
							$prev_title_field_id = $field['id'];
383
384
							continue;
385
						} elseif ( $index ) {
386
							// Section end.
387
							$new_setting_fields[] = array(
388
								'type' => 'sectionend',
389
								'id'   => $prev_title_field_id,
390
							);
391
						}
392
393
						// Section start.
394
						$new_setting_fields[] = array(
395
							'title' => $field['name'],
396
							'type'  => $field['type'],
397
							'desc'  => $field['desc'],
398
							'id'    => $field['id'],
399
						);
400
401
						$prev_title_field_id = $field['id'];
402
					} else {
403
404
						// setting fields
405
						$new_setting_fields[] = $field;
406
					}// End if().
407
				}// End foreach().
408
409
				// Section end.
410
				$new_setting_fields[] = array(
411
					'type' => 'sectionend',
412
					'id'   => $prev_title_field_id,
413
				);
414
415
				// Check if setting page has title section or not.
416
				// If setting page does not have title section  then add title section to it and fix section end array id.
417
				if ( 'title' !== $new_setting_fields[0]['type'] ) {
418
					array_unshift(
419
						$new_setting_fields,
420
						array(
421
							'title' => ( isset( $settings['give_title'] ) ? $settings['give_title'] : '' ),
422
							'type'  => 'title',
423
							'desc'  => ! empty( $setting_fields['desc'] ) ? $setting_fields['desc'] : '',
424
							'id'    => ( isset( $settings['id'] ) ? $settings['id'] : '' ),
425
						)
426
					);
427
428
					// Update id in section end array if does not contain.
429
					if ( empty( $new_setting_fields[ count( $new_setting_fields ) - 1 ]['id'] ) ) {
430
						$new_setting_fields[ count( $new_setting_fields ) - 1 ]['id'] = ( isset( $settings['id'] ) ? $settings['id'] : '' );
431
					}
432
				}
433
434
				// Return only section related settings.
435
				if ( $sections = $this->get_filtered_addon_sections() ) {
0 ignored issues
show
Unused Code introduced by
$sections is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
436
					$new_setting_fields = $this->get_section_settings( $new_setting_fields );
437
				}
438
439
				// Third party plugin backward compatibility.
440
				$wp_filter_keys = array_keys( $wp_filter );
441
				foreach ( $new_setting_fields as $index => $field ) {
442
					if ( ! isset( $field['type'] ) || in_array( $field['type'], array( 'title', 'sectionend' ) ) ) {
443
						continue;
444
					}
445
446
					$cmb2_filter_name = "cmb2_render_{$field['type']}";
447
448
					if ( in_array( $cmb2_filter_name, $wp_filter_keys ) ) {
449
450
						if ( 0 >= version_compare( 4.7, get_bloginfo( 'version' ) ) && ! empty( $wp_filter[ $cmb2_filter_name ]->callbacks ) ) {
451
							$cmb2_filter_arr = current( $wp_filter[ $cmb2_filter_name ]->callbacks );
452
						} else {
453
							$cmb2_filter_arr = current( $wp_filter[ $cmb2_filter_name ] );
454
						}
455
456
						if ( ! empty( $cmb2_filter_arr ) ) {
457
							// Note: function can be called either globally or with class object, it depends on how developer invoke it.
458
							$new_setting_fields[ $index ]['func'] = current( $cmb2_filter_arr );
459
							add_action( "give_admin_field_{$field['type']}", array(
460
								$this,
461
								'addon_setting_field',
462
							), 10, 2 );
463
						}
464
					}
465
				}
466
467
				return $new_setting_fields;
468
			}// End if().
469
470
			return $settings;
471
		}
472
473
474
		/**
475
		 * Get section related setting.
476
		 *
477
		 * @since 1.8
478
		 *
479
		 * @param $tab_settings
480
		 *
481
		 * @return array
482
		 */
483
		function get_section_settings( $tab_settings ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
484
			$current_section = give_get_current_setting_section();
485
486
			// Note: If we are opening default tab for addon setting then it is possible that we will get empty string as current section
487
			// because default section filter added after save hook fire, so we will always get problem to save first section [default] or if there are only on section
488
			// This is hack to fix this.
489
			if ( empty( $current_section ) ) {
490
				$current_section = $this->set_default_setting_tab( $current_section );
491
			}
492
493
			$section_start               = false;
494
			$section_end                 = false;
495
			$section_only_setting_fields = array();
496
497
			foreach ( $tab_settings as $field ) {
498
				if ( 'title' == $field['type'] && $current_section == sanitize_title( $field['title'] ) ) {
499
					$section_start = true;
500
				}
501
502
				if ( ! $section_start || $section_end ) {
503
					continue;
504
				}
505
506
				if ( $section_start && ! $section_end ) {
507
					if ( 'sectionend' == $field['type'] ) {
508
						$section_end = true;
509
					}
510
					$section_only_setting_fields[] = $field;
511
				}
512
			}
513
514
			// Remove title from setting, prevent it from render in setting tab.
515
			$section_only_setting_fields[0]['title'] = '';
516
517
			return apply_filters( "give_get_settings_{$this->current_tab}_{$current_section}", $section_only_setting_fields, $tab_settings );
518
		}
519
520
521
		/**
522
		 * CMB2 addon setting fields backward compatibility.
523
		 *
524
		 * @since  1.8
525
		 *
526
		 * @param  array $field
527
		 * @param  mixed $saved_value
528
		 *
529
		 * @return void
530
		 */
531
		function addon_setting_field( $field, $saved_value ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
532
			// Create object for cmb2  function callback backward compatibility.
533
			// Note: Do not call any cmb2 function on these objects
534
			$field_obj      = (object) array( 'args' => $field );
535
			$field_type_obj = (object) array( 'field' => $field_obj );
536
537
			switch ( $this->current_tab ) :
538
				case 'licenses':
539
					?>
540
					<div class="give-settings-wrap give-settings-wrap-<?php echo $this->current_tab; ?>">
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$this'
Loading history...
541
						<?php $field['func']['function']( $field_obj, $saved_value, '', '', $field_type_obj ); ?>
542
					</div>
543
					<?php break;
544
545
				default :
546
					$colspan = 'colspan="2"';
547
					?>
548
					<tr valign="top">
549
						<?php if ( ! empty( $field['name'] ) && ! in_array( $field['name'], array( '&nbsp;' ) ) ) : ?>
550
							<th scope="row" class="titledesc">
551
								<label for="<?php echo esc_attr( $field['name'] ); ?>"><?php echo $field['title']; ?></label>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$field'
Loading history...
552
							</th>
553
							<?php $colspan = ''; ?>
554
						<?php endif; ?>
555
						<td class="give-forminp" <?php echo $colspan; ?>>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$colspan'
Loading history...
556
							<?php
557
							if ( is_array( $field['func']['function'] ) ) {
558
								$classname = $field['func']['function'][0];
559
								$function_name = $field['func']['function'][1];
560
								$classname->$function_name( $field_obj, $saved_value, '', '', $field_type_obj );
561
							} else {
562
								$function_name = $field['func']['function'];
563
								$function_name( $field_obj, $saved_value, '', '', $field_type_obj );
564
							}
565
							?>
566
						</td>
567
					</tr>
568
					<?php
569
			endswitch;
570
		}
571
572
		/**
573
		 * Get sections.
574
		 *
575
		 * @since  1.8
576
		 * @return array
577
		 */
578
		public function get_sections() {
579
			$sections = array();
580
581
			if ( ( $setting_fields = $this->prev_settings->give_settings( $this->current_tab ) ) && ! empty( $setting_fields['fields'] ) ) {
582
				foreach ( $setting_fields['fields'] as $field ) {
583
					if ( 'give_title' == $field['type'] ) {
584
						$sections[ sanitize_title( $field['name'] ) ] = $this->get_section_name( $field['name'] );
585
					}
586
				}
587
			}
588
589
			return $sections;
590
		}
591
592
593
		/**
594
		 * Get setting fields.
595
		 *
596
		 * @since  1.8
597
		 * @return array
598
		 */
599
		function get_settings() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
600
			global $wp_filter;
601
602
			$new_setting_fields = array();
603
604
			if ( $setting_fields = $this->prev_settings->give_settings( $this->current_tab ) ) {
605
				if ( isset( $setting_fields['fields'] ) ) {
606
607
					$tab_data = array(
608
						'id'         => $setting_fields['id'],
609
						'give_title' => $setting_fields['give_title'],
610
						'desc'       => ( isset( $setting_fields['desc'] ) ? $setting_fields['desc'] : '' ),
611
					);
612
613
					$new_setting_fields = $this->get_filtered_addon_settings( $setting_fields['fields'], $tab_data );
614
				}
615
			}
616
617
			return $new_setting_fields;
618
		}
619
620
		/**
621
		 * Output sections.
622
		 *
623
		 * @since  1.8
624
		 * @return void
625
		 */
626
		public function output_sections() {
627
			$sections = $this->get_sections();
628
629
			// Show section settings only if setting section exist.
630
			if ( $this->current_section && ! in_array( $this->current_section, array_keys( $sections ) ) ) {
631
				echo '<div class="error"><p>' . __( 'Oops, this settings page does not exist.', 'give' ) . '</p></div>';
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw '__'
Loading history...
632
				$GLOBALS['give_hide_save_button'] = true;
633
634
				return;
635
			}
636
637
			// Bailout.
638
			if ( empty( $sections ) ) {
639
				return;
640
			}
641
642
			echo '<ul class="give-subsubsub">';
643
644
			$array_keys = array_keys( $sections );
645
646
			foreach ( $sections as $id => $label ) {
647
				echo '<li><a href="' . admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=' . $this->current_tab . '&section=' . sanitize_title( $id ) ) . '" class="' . ( $this->current_section == $id ? 'current' : '' ) . '">' . strip_tags( $label ) . '</a> ' . ( end( $array_keys ) == $id ? '' : '|' ) . ' </li>';
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
introduced by
Expected next thing to be a escaping function, not '('
Loading history...
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'strip_tags'
Loading history...
648
			}
649
650
			echo '</ul><br class="clear" /><hr>';
651
		}
652
653
		/**
654
		 * Output the settings.
655
		 *
656
		 * @since  1.8
657
		 * @return void
658
		 */
659
		public function output() {
660
			$settings = $this->get_settings();
661
662
			Give_Admin_Settings::output_fields( $settings, 'give_settings' );
663
		}
664
665
		/**
666
		 * Save settings.
667
		 *
668
		 * @since  1.8
669
		 * @return void
670
		 */
671
		public function save() {
672
			$settings = $this->get_settings();
673
674
			Give_Admin_Settings::save_fields( $settings, 'give_settings' );
675
		}
676
	}
677
endif;
678
679
new Give_CMB2_Settings_Loader();
680