Completed
Push — release/2.0 ( 4d845f...d9fa8a )
by Ravinder
18:24
created

give-metabox-functions.php ➔ give_media()   F

Complexity

Conditions 12
Paths 256

Size

Total Lines 38
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 12
eloc 27
nc 256
nop 1
dl 0
loc 38
rs 3.7956
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 25 and the first side effect is on line 12.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
/**
3
 * Give Meta Box Functions
4
 *
5
 * @package     Give
6
 * @subpackage  Functions
7
 * @copyright   Copyright (c) 2016, WordImpress
8
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
9
 * @since       1.8
10
 */
11
if ( ! defined( 'ABSPATH' ) ) {
12
	exit; // Exit if accessed directly
13
}
14
15
16
/**
17
 * Check if field callback exist or not.
18
 *
19
 * @since  1.8
20
 *
21
 * @param  $field
22
 *
23
 * @return bool|string
24
 */
25
function give_is_field_callback_exist( $field ) {
26
	return ( give_get_field_callback( $field ) ? true : false );
27
}
28
29
/**
30
 * Get field callback.
31
 *
32
 * @since  1.8
33
 *
34
 * @param  $field
35
 *
36
 * @return bool|string
37
 */
38
function give_get_field_callback( $field ) {
39
	$func_name_prefix = 'give';
40
	$func_name        = '';
41
42
	// Set callback function on basis of cmb2 field name.
43
	switch ( $field['type'] ) {
44
		case 'radio_inline':
45
			$func_name = "{$func_name_prefix}_radio";
46
			break;
47
48
		case 'text':
49
		case 'text-medium':
50
		case 'text_medium':
51
		case 'text-small' :
52
		case 'text_small' :
53
			$func_name = "{$func_name_prefix}_text_input";
54
			break;
55
56
		case 'textarea' :
57
			$func_name = "{$func_name_prefix}_textarea_input";
58
			break;
59
60
		case 'colorpicker' :
61
			$func_name = "{$func_name_prefix}_{$field['type']}";
62
			break;
63
64
		case 'levels_id':
65
			$func_name = "{$func_name_prefix}_hidden_input";
66
			break;
67
68
		case 'group' :
69
			$func_name = "_{$func_name_prefix}_metabox_form_data_repeater_fields";
70
			break;
71
72
		case 'give_default_radio_inline':
73
			$func_name = "{$func_name_prefix}_radio";
74
			break;
75
76
		default:
77
78
			if (
79
				array_key_exists( 'callback', $field )
80
				&& ! empty( $field['callback'] )
81
			) {
82
				$func_name = $field['callback'];
83
			} else {
84
				$func_name = "{$func_name_prefix}_{$field['type']}";
85
			}
86
	}
87
88
	/**
89
	 * Filter the metabox setting render function
90
	 *
91
	 * @since 1.8
92
	 */
93
	$func_name = apply_filters( 'give_get_field_callback', $func_name, $field );
94
95
	// Exit if not any function exist.
96
	// Check if render callback exist or not.
97
	if ( empty( $func_name ) ) {
98
		return false;
99
	} elseif ( is_string( $func_name ) && ! function_exists( "$func_name" ) ) {
100
		return false;
101
	} elseif ( is_array( $func_name ) && ! method_exists( $func_name[0], "$func_name[1]" ) ) {
102
		return false;
103
	}
104
105
	return $func_name;
106
}
107
108
/**
109
 * This function adds backward compatibility to render cmb2 type field type.
110
 *
111
 * @since  1.8
112
 *
113
 * @param  array $field Field argument array.
114
 *
115
 * @return bool
116
 */
117
function give_render_field( $field ) {
118
119
	// Check if render callback exist or not.
120
	if ( ! ( $func_name = give_get_field_callback( $field ) ) ) {
121
		return false;
122
	}
123
124
	// CMB2 compatibility: Push all classes to attributes's class key
125
	if ( empty( $field['class'] ) ) {
126
		$field['class'] = '';
127
	}
128
129
	if ( empty( $field['attributes']['class'] ) ) {
130
		$field['attributes']['class'] = '';
131
	}
132
133
	$field['attributes']['class'] = trim( "give-field {$field['attributes']['class']} give-{$field['type']} {$field['class']}" );
134
	unset( $field['class'] );
135
136
	// CMB2 compatibility: Set wrapper class if any.
137
	if ( ! empty( $field['row_classes'] ) ) {
138
		$field['wrapper_class'] = $field['row_classes'];
139
		unset( $field['row_classes'] );
140
	}
141
142
	// Set field params on basis of cmb2 field name.
143
	switch ( $field['type'] ) {
144
		case 'radio_inline':
145
			if ( empty( $field['wrapper_class'] ) ) {
146
				$field['wrapper_class'] = '';
147
			}
148
			$field['wrapper_class'] .= ' give-inline-radio-fields';
149
150
			break;
151
152
		case 'text':
153
		case 'text-medium':
154
		case 'text_medium':
155
		case 'text-small' :
156
		case 'text_small' :
157
			// CMB2 compatibility: Set field type to text.
158
			$field['type'] = isset( $field['attributes']['type'] ) ? $field['attributes']['type'] : 'text';
159
160
			// CMB2 compatibility: Set data type to price.
161
			if (
162
				empty( $field['data_type'] )
163
				&& ! empty( $field['attributes']['class'] )
164
				&& (
165
					false !== strpos( $field['attributes']['class'], 'money' )
166
					|| false !== strpos( $field['attributes']['class'], 'amount' )
167
				)
168
			) {
169
				$field['data_type'] = 'decimal';
170
			}
171
			break;
172
173
		case 'levels_id':
174
			$field['type'] = 'hidden';
175
			break;
176
177
		case 'colorpicker' :
178
			$field['type']  = 'text';
179
			$field['class'] = 'give-colorpicker';
180
			break;
181
182
		case 'give_default_radio_inline':
183
			$field['type']    = 'radio';
184
			$field['options'] = array(
185
				'default' => __( 'Default' ),
186
			);
187
			break;
188
	}
189
190
	// CMB2 compatibility: Add support to define field description by desc & description param.
191
	// We encourage you to use description param.
192
	$field['description'] = ( ! empty( $field['description'] )
193
		? $field['description']
194
		: ( ! empty( $field['desc'] ) ? $field['desc'] : '' ) );
195
196
	// Call render function.
197
	if ( is_array( $func_name ) ) {
198
		$func_name[0]->{$func_name[1]}( $field );
199
	} else {
200
		$func_name( $field );
201
	}
202
203
	return true;
204
}
205
206
/**
207
 * Output a text input box.
208
 *
209
 * @since  1.8
210
 *
211
 * @param  array $field         {
212
 *                              Optional. Array of text input field arguments.
213
 *
214
 * @type string  $id            Field ID. Default ''.
215
 * @type string  $style         CSS style for input field. Default ''.
216
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
217
 * @type string  $value         Value of input field. Default ''.
218
 * @type string  $name          Name of input field. Default ''.
219
 * @type string  $type          Type of input field. Default 'text'.
220
 * @type string  $before_field  Text/HTML to add before input field. Default ''.
221
 * @type string  $after_field   Text/HTML to add after input field. Default ''.
222
 * @type string  $data_type     Define data type for value of input to filter it properly. Default ''.
223
 * @type string  $description   Description of input field. Default ''.
224
 * @type array   $attributes    List of attributes of input field. Default array().
225
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
226
 *                                               => '****' )
227
 * }
228
 * @return void
229
 */
230
function give_text_input( $field ) {
231
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
232
233
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
234
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
235
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
236
	$field['value']         = give_get_field_value( $field, $thepostid );
237
	$field['type']          = isset( $field['type'] ) ? $field['type'] : 'text';
238
	$field['before_field']  = '';
239
	$field['after_field']   = '';
240
	$data_type              = empty( $field['data_type'] ) ? '' : $field['data_type'];
241
242
	switch ( $data_type ) {
243
		case 'price' :
244
			$field['value'] = ( ! empty( $field['value'] ) ? give_format_amount( $field['value'] ) : $field['value'] );
245
246
			$field['before_field'] = ! empty( $field['before_field'] ) ? $field['before_field'] : ( give_get_option( 'currency_position', 'before' ) == 'before' ? '<span class="give-money-symbol give-money-symbol-before">' . give_currency_symbol() . '</span>' : '' );
247
			$field['after_field']  = ! empty( $field['after_field'] ) ? $field['after_field'] : ( give_get_option( 'currency_position', 'before' ) == 'after' ? '<span class="give-money-symbol give-money-symbol-after">' . give_currency_symbol() . '</span>' : '' );
248
			break;
249
250
		case 'decimal' :
251
			$field['attributes']['class'] .= ' give_input_decimal';
252
			$field['value'] = ( ! empty( $field['value'] ) ? give_format_decimal( $field['value'] ) : $field['value'] );
253
			break;
254
255
		default :
256
			break;
257
	}
258
259
	?>
260
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
261
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
262
	<?php echo $field['before_field']; ?>
263
	<input
264
			type="<?php echo esc_attr( $field['type'] ); ?>"
265
			style="<?php echo esc_attr( $field['style'] ); ?>"
266
			name="<?php echo give_get_field_name( $field ); ?>"
267
			id="<?php echo esc_attr( $field['id'] ); ?>"
268
			value="<?php echo esc_attr( $field['value'] ); ?>"
269
		<?php echo give_get_custom_attributes( $field ); ?>
270
	/>
271
	<?php echo $field['after_field']; ?>
272
	<?php
273
	echo give_get_field_description( $field );
274
	echo '</p>';
275
}
276
277
/**
278
 * Output a hidden input box.
279
 *
280
 * @since  1.8
281
 *
282
 * @param  array $field      {
283
 *                           Optional. Array of hidden text input field arguments.
284
 *
285
 * @type string  $id         Field ID. Default ''.
286
 * @type string  $value      Value of input field. Default ''.
287
 * @type string  $name       Name of input field. Default ''.
288
 * @type string  $type       Type of input field. Default 'text'.
289
 * @type array   $attributes List of attributes of input field. Default array().
290
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
291
 *                                               => '****' )
292
 * }
293
 * @return void
294
 */
295
function give_hidden_input( $field ) {
296
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
297
298
	$thepostid      = empty( $thepostid ) ? $post->ID : $thepostid;
299
	$field['value'] = give_get_field_value( $field, $thepostid );
300
301
	// Custom attribute handling
302
	$custom_attributes = array();
303
304
	if ( ! empty( $field['attributes'] ) && is_array( $field['attributes'] ) ) {
305
306
		foreach ( $field['attributes'] as $attribute => $value ) {
307
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
308
		}
309
	}
310
	?>
311
312
	<input
313
			type="hidden"
314
			name="<?php echo give_get_field_name( $field ); ?>"
315
			id="<?php echo esc_attr( $field['id'] ); ?>"
316
			value="<?php echo esc_attr( $field['value'] ); ?>"
317
		<?php echo give_get_custom_attributes( $field ); ?>
318
	/>
319
	<?php
320
}
321
322
/**
323
 * Output a textarea input box.
324
 *
325
 * @since  1.8
326
 * @since  1.8
327
 *
328
 * @param  array $field         {
329
 *                              Optional. Array of textarea input field arguments.
330
 *
331
 * @type string  $id            Field ID. Default ''.
332
 * @type string  $style         CSS style for input field. Default ''.
333
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
334
 * @type string  $value         Value of input field. Default ''.
335
 * @type string  $name          Name of input field. Default ''.
336
 * @type string  $description   Description of input field. Default ''.
337
 * @type array   $attributes    List of attributes of input field. Default array().
338
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
339
 *                                               => '****' )
340
 * }
341
 * @return void
342
 */
343
function give_textarea_input( $field ) {
344
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
345
346
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
347
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
348
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
349
	$field['value']         = give_get_field_value( $field, $thepostid );
350
351
	?>
352
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
353
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
354
	<textarea
355
			style="<?php echo esc_attr( $field['style'] ); ?>"
356
			name="<?php echo give_get_field_name( $field ); ?>"
357
			id="<?php echo esc_attr( $field['id'] ); ?>"
358
			rows="10"
359
			cols="20"
360
		<?php echo give_get_custom_attributes( $field ); ?>
361
	><?php echo esc_textarea( $field['value'] ); ?></textarea>
362
	<?php
363
	echo give_get_field_description( $field );
364
	echo '</p>';
365
}
366
367
/**
368
 * Output a wysiwyg.
369
 *
370
 * @since  1.8
371
 *
372
 * @param  array $field         {
373
 *                              Optional. Array of WordPress editor field arguments.
374
 *
375
 * @type string  $id            Field ID. Default ''.
376
 * @type string  $style         CSS style for input field. Default ''.
377
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
378
 * @type string  $value         Value of input field. Default ''.
379
 * @type string  $name          Name of input field. Default ''.
380
 * @type string  $description   Description of input field. Default ''.
381
 * @type array   $attributes    List of attributes of input field. Default array().
382
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
383
 *                                               => '****' )
384
 * }
385
 * @return void
386
 */
387
function give_wysiwyg( $field ) {
388
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
389
390
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
391
	$field['value']         = give_get_field_value( $field, $thepostid );
392
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
393
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
394
395
	$field['unique_field_id'] = give_get_field_name( $field );
396
	$editor_attributes        = array(
397
		'textarea_name' => isset( $field['repeatable_field_id'] ) ? $field['repeatable_field_id'] : $field['id'],
398
		'textarea_rows' => '10',
399
		'editor_css'    => esc_attr( $field['style'] ),
400
		'editor_class'  => $field['attributes']['class'],
401
	);
402
	$data_wp_editor           = ' data-wp-editor="' . base64_encode( json_encode( array(
403
			$field['value'],
404
			$field['unique_field_id'],
405
			$editor_attributes,
406
	) ) ) . '"';
407
	$data_wp_editor           = isset( $field['repeatable_field_id'] ) ? $data_wp_editor : '';
408
409
	echo '<div class="give-field-wrap ' . $field['unique_field_id'] . '_field ' . esc_attr( $field['wrapper_class'] ) . '"' . $data_wp_editor . '><label for="' . $field['unique_field_id'] . '">' . wp_kses_post( $field['name'] ) . '</label>';
410
411
	wp_editor(
412
		$field['value'],
413
		$field['unique_field_id'],
414
		$editor_attributes
415
	);
416
417
	echo give_get_field_description( $field );
418
	echo '</div>';
419
}
420
421
/**
422
 * Output a checkbox input box.
423
 *
424
 * @since  1.8
425
 *
426
 * @param  array $field         {
427
 *                              Optional. Array of checkbox field arguments.
428
 *
429
 * @type string  $id            Field ID. Default ''.
430
 * @type string  $style         CSS style for input field. Default ''.
431
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
432
 * @type string  $value         Value of input field. Default ''.
433
 * @type string  $cbvalue       Checkbox value. Default 'on'.
434
 * @type string  $name          Name of input field. Default ''.
435
 * @type string  $description   Description of input field. Default ''.
436
 * @type array   $attributes    List of attributes of input field. Default array().
437
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
438
 *                                               => '****' )
439
 * }
440
 * @return void
441
 */
442
function give_checkbox( $field ) {
443
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
444
445
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
446
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
447
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
448
	$field['value']         = give_get_field_value( $field, $thepostid );
449
	$field['cbvalue']       = isset( $field['cbvalue'] ) ? $field['cbvalue'] : 'on';
450
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
451
	?>
452
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
453
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
454
	<input
455
			type="checkbox"
456
			style="<?php echo esc_attr( $field['style'] ); ?>"
457
			name="<?php echo give_get_field_name( $field ); ?>"
458
			id="<?php echo esc_attr( $field['id'] ); ?>"
459
			value="<?php echo esc_attr( $field['cbvalue'] ); ?>"
460
		<?php echo checked( $field['value'], $field['cbvalue'], false ); ?>
461
		<?php echo give_get_custom_attributes( $field ); ?>
462
	/>
463
	<?php
464
	echo give_get_field_description( $field );
465
	echo '</p>';
466
}
467
468
/**
469
 * Output a select input box.
470
 *
471
 * @since  1.8
472
 *
473
 * @param  array $field         {
474
 *                              Optional. Array of select field arguments.
475
 *
476
 * @type string  $id            Field ID. Default ''.
477
 * @type string  $style         CSS style for input field. Default ''.
478
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
479
 * @type string  $value         Value of input field. Default ''.
480
 * @type string  $name          Name of input field. Default ''.
481
 * @type string  $description   Description of input field. Default ''.
482
 * @type array   $attributes    List of attributes of input field. Default array().
483
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
484
 *                                               => '****' )
485
 * @type array   $options       List of options. Default array().
486
 *                                               for example: 'options' => array( '' => 'None', 'yes' => 'Yes' )
487
 * }
488
 * @return void
489
 */
490
function give_select( $field ) {
491
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
492
493
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
494
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
495
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
496
	$field['value']         = give_get_field_value( $field, $thepostid );
497
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
498
	?>
499
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
500
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
501
	<select
502
	id="<?php echo esc_attr( $field['id'] ); ?>"
503
	name="<?php echo give_get_field_name( $field ); ?>"
504
	style="<?php echo esc_attr( $field['style'] ) ?>"
505
	<?php echo give_get_custom_attributes( $field ); ?>
506
	>
507
	<?php
508
	foreach ( $field['options'] as $key => $value ) {
509
		echo '<option value="' . esc_attr( $key ) . '" ' . selected( esc_attr( $field['value'] ), esc_attr( $key ), false ) . '>' . esc_html( $value ) . '</option>';
510
	}
511
	echo '</select>';
512
	echo give_get_field_description( $field );
513
	echo '</p>';
514
}
515
516
/**
517
 * Output a radio input box.
518
 *
519
 * @since  1.8
520
 *
521
 * @param  array $field         {
522
 *                              Optional. Array of radio field arguments.
523
 *
524
 * @type string  $id            Field ID. Default ''.
525
 * @type string  $style         CSS style for input field. Default ''.
526
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
527
 * @type string  $value         Value of input field. Default ''.
528
 * @type string  $name          Name of input field. Default ''.
529
 * @type string  $description   Description of input field. Default ''.
530
 * @type array   $attributes    List of attributes of input field. Default array().
531
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
532
 *                                               => '****' )
533
 * @type array   $options       List of options. Default array().
534
 *                                               for example: 'options' => array( 'enable' => 'Enable', 'disable' =>
535
 *                                               'Disable' )
536
 * }
537
 * @return void
538
 */
539
function give_radio( $field ) {
540
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
541
542
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
543
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
544
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
545
	$field['value']         = give_get_field_value( $field, $thepostid );
546
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
547
548
	echo '<fieldset class="give-field-wrap ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '"><span class="give-field-label">' . wp_kses_post( $field['name'] ) . '</span><legend class="screen-reader-text">' . wp_kses_post( $field['name'] ) . '</legend><ul class="give-radios">';
549
550
	foreach ( $field['options'] as $key => $value ) {
551
552
		echo '<li><label><input
553
				name="' . give_get_field_name( $field ) . '"
554
				value="' . esc_attr( $key ) . '"
555
				type="radio"
556
				style="' . esc_attr( $field['style'] ) . '"
557
				' . checked( esc_attr( $field['value'] ), esc_attr( $key ), false ) . ' '
558
		     . give_get_custom_attributes( $field ) . '
559
				/> ' . esc_html( $value ) . '</label>
560
		</li>';
561
	}
562
	echo '</ul>';
563
564
	echo give_get_field_description( $field );
565
	echo '</fieldset>';
566
}
567
568
/**
569
 * Output a colorpicker.
570
 *
571
 * @since  1.8
572
 *
573
 * @param  array $field         {
574
 *                              Optional. Array of colorpicker field arguments.
575
 *
576
 * @type string  $id            Field ID. Default ''.
577
 * @type string  $style         CSS style for input field. Default ''.
578
 * @type string  $wrapper_class CSS class to use for wrapper of input field. Default ''.
579
 * @type string  $value         Value of input field. Default ''.
580
 * @type string  $name          Name of input field. Default ''.
581
 * @type string  $description   Description of input field. Default ''.
582
 * @type array   $attributes    List of attributes of input field. Default array().
583
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
584
 *                                               => '****' )
585
 * }
586
 * @return void
587
 */
588
function give_colorpicker( $field ) {
589
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
590
591
	$thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
592
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
593
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
594
	$field['value']         = give_get_field_value( $field, $thepostid );
595
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
596
	$field['type']          = 'text';
597
	?>
598
	<p class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
599
	<label for="<?php echo give_get_field_name( $field ); ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
600
	<input
601
			type="<?php echo esc_attr( $field['type'] ); ?>"
602
			style="<?php echo esc_attr( $field['style'] ); ?>"
603
			name="<?php echo give_get_field_name( $field ); ?>"
604
			id="' . esc_attr( $field['id'] ) . '" value="<?php echo esc_attr( $field['value'] ); ?>"
605
		<?php echo give_get_custom_attributes( $field ); ?>
606
	/>
607
	<?php
608
	echo give_get_field_description( $field );
609
	echo '</p>';
610
}
611
612
/**
613
 * Output a file upload field.
614
 *
615
 * @since  1.8.9
616
 *
617
 * @param array $field
618
 */
619
function give_file( $field ) {
620
	give_media( $field );
621
}
622
623
624
/**
625
 * Output a media upload field.
626
 *
627
 * @since  1.8
628
 *
629
 * @param array $field
630
 */
631
function give_media( $field ) {
632
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
633
634
	$thepostid    = empty( $thepostid ) ? $post->ID : $thepostid;
635
	$button_label = esc_html__( sprintf( 'Add or Upload %s', ( 'file' === $field['type'] ? 'File' : 'Image' ) ), 'give' );
636
637
	$field['style']               = isset( $field['style'] ) ? $field['style'] : '';
638
	$field['wrapper_class']       = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
639
	$field['value']               = give_get_field_value( $field, $thepostid );
640
	$field['name']                = isset( $field['name'] ) ? $field['name'] : $field['id'];
641
	$field['attributes']['class'] = "{$field['attributes']['class']} give-text-medium";
642
643
	// Allow developer to save attachment ID or attachment url as metadata.
644
	$field['fvalue'] = isset( $field['fvalue'] ) ? $field['fvalue'] : 'url';
645
646
	$allow_media_preview_tags = array( 'jpg', 'jpeg', 'png', 'gif', 'ico' );
647
	$preview_image_src        = $field['value'] ? ( 'id' === $field['fvalue'] ? wp_get_attachment_url( $field['value'] ) : $field['value'] ) : '#';
648
	$preview_image_extension  = $preview_image_src ? pathinfo( $preview_image_src, PATHINFO_EXTENSION ) : '';
649
	$is_show_preview = in_array( $preview_image_extension, $allow_media_preview_tags );
650
	?>
651
	<fieldset class="give-field-wrap <?php echo esc_attr( $field['id'] ); ?>_field <?php echo esc_attr( $field['wrapper_class'] ); ?>">
652
		<label for="<?php echo give_get_field_name( $field ) ?>"><?php echo wp_kses_post( $field['name'] ); ?></label>
653
		<input
654
				name="<?php echo give_get_field_name( $field ); ?>"
655
				id="<?php echo esc_attr( $field['id'] ); ?>"
656
				type="text"
657
				value="<?php echo $field['value']; ?>"
658
				style="<?php echo esc_attr( $field['style'] ); ?>"
659
			<?php echo give_get_custom_attributes( $field ); ?>
660
		/>&nbsp;&nbsp;&nbsp;&nbsp;<input class="give-upload-button button" type="button" value="<?php echo $button_label; ?>" data-fvalue="<?php echo $field['fvalue']; ?>" data-field-type="<?php echo $field['type']; ?>">
661
		<?php echo give_get_field_description( $field ); ?>
662
		<div class="give-image-thumb<?php echo ! $field['value'] || ! $is_show_preview ? ' give-hidden' : ''; ?>">
663
			<span class="give-delete-image-thumb dashicons dashicons-no-alt"></span>
664
			<img src="<?php echo $preview_image_src ; ?>" alt="">
665
		</div>
666
	</fieldset>
667
	<?php
668
}
669
670
/**
671
 * Output a select field with payment options list.
672
 *
673
 * @since  1.8
674
 *
675
 * @param  array $field
676
 *
677
 * @return void
678
 */
679
function give_default_gateway( $field ) {
680
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
681
682
	// get all active payment gateways.
683
	$gateways         = give_get_enabled_payment_gateways( $thepostid );
684
	$field['options'] = array();
685
686
	// Set field option value.
687
	if ( ! empty( $gateways ) ) {
688
		foreach ( $gateways as $key => $option ) {
689
			$field['options'][ $key ] = $option['admin_label'];
690
		}
691
	}
692
693
	// Add a field to the Give Form admin single post view of this field
694
	if ( is_object( $post ) && 'give_forms' === $post->post_type ) {
695
		$field['options'] = array_merge( array( 'global' => esc_html__( 'Global Default', 'give' ) ), $field['options'] );
696
	}
697
698
	// Render select field.
699
	give_select( $field );
700
}
701
702
/**
703
 * Output the documentation link.
704
 *
705
 * @since  1.8
706
 *
707
 * @param  array $field      {
708
 *                           Optional. Array of customizable link attributes.
709
 *
710
 * @type string  $name       Name of input field. Default ''.
711
 * @type string  $type       Type of input field. Default 'text'.
712
 * @type string  $url        Value to be passed as a link. Default 'https://givewp.com/documentation'.
713
 * @type string  $title      Value to be passed as text of link. Default 'Documentation'.
714
 * @type array   $attributes List of attributes of input field. Default array().
715
 *                                               for example: 'attributes' => array( 'placeholder' => '*****', 'class'
716
 *                                               => '****' )
717
 * }
718
 * @return void
719
 */
720
721
function give_docs_link( $field ) {
722
	$field['url']   = isset( $field['url'] ) ? $field['url'] : 'https://givewp.com/documentation';
723
	$field['title'] = isset( $field['title'] ) ? $field['title'] : 'Documentation';
724
725
	echo '<p class="give-docs-link"><a href="' . esc_url( $field['url'] )
726
	     . '" target="_blank">'
727
	     . sprintf( esc_html__( 'Need Help? See docs on "%s"', 'give' ), $field['title'] )
728
	     . '<span class="dashicons dashicons-editor-help"></span></a></p>';
729
}
730
731
732
/**
733
 * Output preview buttons.
734
 *
735
 * @since 2.0
736
 * @param $field
737
 */
738
function give_email_preview_buttons( $field ) {
739
	/* @var WP_Post $post */
740
	global $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
741
742
	$field_id = str_replace( '_preview_buttons', '', $field['id'] );
743
744
	ob_start();
745
746
	echo '<p class="give-field-wrap ' . esc_attr( $field['id'] ) . '_field"><label for="' . give_get_field_name( $field ) . '">' . wp_kses_post( $field['name'] ) . '</label>';
747
748
	echo sprintf(
749
		'<a href="%1$s" class="button-secondary" target="_blank">%2$s</a>',
750
		wp_nonce_url(
751
			add_query_arg(
752
				array(
753
					'give_action' => 'preview_email',
754
					'email_type'  => $field_id,
755
					'form_id'     => $post->ID,
756
				),
757
				home_url()
758
			), 'give-preview-email'
759
		),
760
		$field['name']
761
	);
762
763
	echo sprintf(
764
		' <a href="%1$s" aria-label="%2$s" class="button-secondary">%3$s</a>',
765
		wp_nonce_url(
766
			add_query_arg(
767
				array(
768
					'give_action'  => 'send_preview_email',
769
					'email_type'   => $field_id,
770
					'give-message' => 'sent-test-email',
771
					'form_id'      => $post->ID,
772
				)
773
			), 'give-send-preview-email' ),
774
		esc_attr__( 'Send Test Email.', 'give' ),
775
		esc_html__( 'Send Test Email', 'give' )
776
	);
777
778
	if ( ! empty( $field['description'] ) ) {
779
		echo '<span class="give-field-description">' . wp_kses_post( $field['desc'] ) . '</span>';
780
	}
781
782
	echo '</p>';
783
784
	echo ob_get_clean();
785
}
786
787
/**
788
 * Get setting field value.
789
 *
790
 * Note: Use only for single post, page or custom post type.
791
 *
792
 * @since  1.8
793
 *
794
 * @param  array $field
795
 * @param  int   $postid
796
 *
797
 * @return mixed
798
 */
799
function give_get_field_value( $field, $postid ) {
800
	if ( isset( $field['attributes']['value'] ) ) {
801
		return $field['attributes']['value'];
802
	}
803
804
	// Get value from db.
805
	$field_value = give_get_meta( $postid, $field['id'], true );
806
807
	/**
808
	 * Filter the field value before apply default value.
809
	 *
810
	 * @since 1.8
811
	 *
812
	 * @param mixed $field_value Field value.
813
	 */
814
	$field_value = apply_filters( "{$field['id']}_field_value", $field_value, $field, $postid );
815
816
	// Set default value if no any data saved to db.
817
	if ( ! $field_value && isset( $field['default'] ) ) {
818
		$field_value = $field['default'];
819
	}
820
821
	return $field_value;
822
}
823
824
825
/**
826
 * Get field description html.
827
 *
828
 * @since 1.8
829
 *
830
 * @param $field
831
 *
832
 * @return string
833
 */
834
function give_get_field_description( $field ) {
835
	$field_desc_html = '';
836
	$description     = '';
837
838
	// Check for both `description` and `desc`.
0 ignored issues
show
Unused Code Comprehensibility introduced by
36% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
839
	if ( isset( $field['description'] ) ) {
840
		$description = $field['description'];
841
	} elseif ( isset( $field['desc'] ) ) {
842
		$description = $field['desc'];
843
	}
844
845
	// Set if there is a description.
846
	if ( ! empty( $description ) ) {
847
		$field_desc_html = '<span class="give-field-description">' . wp_kses_post( $description ) . '</span>';
848
	}
849
850
	return $field_desc_html;
851
}
852
853
854
/**
855
 * Get field custom attributes as string.
856
 *
857
 * @since 1.8
858
 *
859
 * @param $field
860
 *
861
 * @return string
862
 */
863
function give_get_custom_attributes( $field ) {
864
	// Custom attribute handling
865
	$custom_attributes = array();
866
867
	if ( ! empty( $field['attributes'] ) && is_array( $field['attributes'] ) ) {
868
869
		foreach ( $field['attributes'] as $attribute => $value ) {
870
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
871
		}
872
	}
873
874
	return implode( ' ', $custom_attributes );
875
}
876
877
/**
878
 * Get repeater field value.
879
 *
880
 * Note: Use only for single post, page or custom post type.
881
 *
882
 * @since  1.8
883
 *
884
 * @param array $field
885
 * @param array $field_group
886
 * @param array $fields
887
 *
888
 * @return string
889
 */
890
function give_get_repeater_field_value( $field, $field_group, $fields ) {
891
	$field_value = ( isset( $field_group[ $field['id'] ] ) ? $field_group[ $field['id'] ] : '' );
892
893
	/**
894
	 * Filter the specific repeater field value
895
	 *
896
	 * @since 1.8
897
	 *
898
	 * @param string $field_id
899
	 */
900
	$field_value = apply_filters( "give_get_repeater_field_{$field['id']}_value", $field_value, $field, $field_group, $fields );
901
902
	/**
903
	 * Filter the repeater field value
904
	 *
905
	 * @since 1.8
906
	 *
907
	 * @param string $field_id
908
	 */
909
	$field_value = apply_filters( 'give_get_repeater_field_value', $field_value, $field, $field_group, $fields );
910
911
	return $field_value;
912
}
913
914
/**
915
 * Get repeater field id.
916
 *
917
 * Note: Use only for single post, page or custom post type.
918
 *
919
 * @since  1.8
920
 *
921
 * @param array    $field
922
 * @param array    $fields
923
 * @param int|bool $default
924
 *
925
 * @return string
926
 */
927
function give_get_repeater_field_id( $field, $fields, $default = false ) {
928
	$row_placeholder = false !== $default ? $default : '{{row-count-placeholder}}';
929
930
	// Get field id.
931
	$field_id = "{$fields['id']}[{$row_placeholder}][{$field['id']}]";
932
933
	/**
934
	 * Filter the specific repeater field id
935
	 *
936
	 * @since 1.8
937
	 *
938
	 * @param string $field_id
939
	 */
940
	$field_id = apply_filters( "give_get_repeater_field_{$field['id']}_id", $field_id, $field, $fields, $default );
941
942
	/**
943
	 * Filter the repeater field id
944
	 *
945
	 * @since 1.8
946
	 *
947
	 * @param string $field_id
948
	 */
949
	$field_id = apply_filters( 'give_get_repeater_field_id', $field_id, $field, $fields, $default );
950
951
	return $field_id;
952
}
953
954
955
/**
956
 * Get field name.
957
 *
958
 * @since  1.8
959
 *
960
 * @param  array $field
961
 *
962
 * @return string
963
 */
964
function give_get_field_name( $field ) {
965
	$field_name = esc_attr( empty( $field['repeat'] ) ? $field['id'] : $field['repeatable_field_id'] );
966
967
	/**
968
	 * Filter the field name.
969
	 *
970
	 * @since 1.8
971
	 *
972
	 * @param string $field_name
973
	 */
974
	$field_name = apply_filters( 'give_get_field_name', $field_name, $field );
975
976
	return $field_name;
977
}
978
979
/**
980
 * Output repeater field or multi donation type form on donation from edit screen.
981
 * Note: internal use only.
982
 *
983
 * @TODO   : Add support for wysiwyg type field.
984
 *
985
 * @since  1.8
986
 *
987
 * @param  array $fields
988
 *
989
 * @return void
990
 */
991
function _give_metabox_form_data_repeater_fields( $fields ) {
992
	global $thepostid, $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
993
994
	// Bailout.
995
	if ( ! isset( $fields['fields'] ) || empty( $fields['fields'] ) ) {
996
		return;
997
	}
998
999
	$group_numbering = isset( $fields['options']['group_numbering'] ) ? (int) $fields['options']['group_numbering'] : 0;
1000
	$close_tabs      = isset( $fields['options']['close_tabs'] ) ? (int) $fields['options']['close_tabs'] : 0;
1001
	?>
1002
	<div class="give-repeatable-field-section" id="<?php echo "{$fields['id']}_field"; ?>"
1003
		 data-group-numbering="<?php echo $group_numbering; ?>" data-close-tabs="<?php echo $close_tabs; ?>">
1004
		<?php if ( ! empty( $fields['name'] ) ) : ?>
1005
			<p class="give-repeater-field-name"><?php echo $fields['name']; ?></p>
1006
		<?php endif; ?>
1007
1008
		<?php if ( ! empty( $fields['description'] ) ) : ?>
1009
			<p class="give-repeater-field-description"><?php echo $fields['description']; ?></p>
1010
		<?php endif; ?>
1011
1012
		<table class="give-repeatable-fields-section-wrapper" cellspacing="0">
1013
			<?php
1014
			$repeater_field_values = give_get_meta( $thepostid, $fields['id'], true );
1015
			$header_title          = isset( $fields['options']['header_title'] )
1016
				? $fields['options']['header_title']
1017
				: esc_attr__( 'Group', 'give' );
1018
1019
			$add_default_donation_field = false;
1020
1021
			// Check if level is not created or we have to add default level.
1022
			if ( is_array( $repeater_field_values ) && ( $fields_count = count( $repeater_field_values ) ) ) {
1023
				$repeater_field_values = array_values( $repeater_field_values );
1024
			} else {
1025
				$fields_count               = 1;
1026
				$add_default_donation_field = true;
1027
			}
1028
			?>
1029
			<tbody class="container"<?php echo " data-rf-row-count=\"{$fields_count}\""; ?>>
1030
			<!--Repeater field group template-->
1031
			<tr class="give-template give-row">
1032
				<td class="give-repeater-field-wrap give-column" colspan="2">
1033
					<div class="give-row-head give-move">
1034
						<button type="button" class="handlediv button-link"><span class="toggle-indicator"></span>
1035
						</button>
1036
						<span class="give-remove" title="<?php esc_html_e( 'Remove Group', 'give' ); ?>">-</span>
1037
						<h2>
1038
							<span data-header-title="<?php echo $header_title; ?>"><?php echo $header_title; ?></span>
1039
						</h2>
1040
					</div>
1041
					<div class="give-row-body">
1042
						<?php foreach ( $fields['fields'] as $field ) : ?>
1043
							<?php if ( ! give_is_field_callback_exist( $field ) ) {
1044
								continue;
1045
} ?>
1046
							<?php
1047
							$field['repeat']              = true;
1048
							$field['repeatable_field_id'] = give_get_repeater_field_id( $field, $fields );
1049
							$field['id']                  = str_replace( array( '[', ']' ), array(
1050
								'_',
1051
								'',
1052
							), $field['repeatable_field_id'] );
1053
							?>
1054
							<?php give_render_field( $field ); ?>
1055
						<?php endforeach; ?>
1056
					</div>
1057
				</td>
1058
			</tr>
1059
1060
			<?php if ( ! empty( $repeater_field_values ) ) : ?>
1061
				<!--Stored repeater field group-->
1062
				<?php foreach ( $repeater_field_values as $index => $field_group ) : ?>
1063
					<tr class="give-row">
1064
						<td class="give-repeater-field-wrap give-column" colspan="2">
1065
							<div class="give-row-head give-move">
1066
								<button type="button" class="handlediv button-link">
1067
									<span class="toggle-indicator"></span></button>
1068
								<sapn class="give-remove" title="<?php esc_html_e( 'Remove Group', 'give' ); ?>">-
1069
								</sapn>
1070
								<h2>
1071
									<span data-header-title="<?php echo $header_title; ?>"><?php echo $header_title; ?></span>
1072
								</h2>
1073
							</div>
1074
							<div class="give-row-body">
1075
								<?php foreach ( $fields['fields'] as $field ) : ?>
1076
									<?php if ( ! give_is_field_callback_exist( $field ) ) {
1077
										continue;
1078
} ?>
1079
									<?php
1080
									$field['repeat']              = true;
1081
									$field['repeatable_field_id'] = give_get_repeater_field_id( $field, $fields, $index );
1082
									$field['attributes']['value'] = give_get_repeater_field_value( $field, $field_group, $fields );
1083
									$field['id']                  = str_replace( array( '[', ']' ), array(
1084
										'_',
1085
										'',
1086
									), $field['repeatable_field_id'] );
1087
									?>
1088
									<?php give_render_field( $field ); ?>
1089
								<?php endforeach; ?>
1090
							</div>
1091
						</td>
1092
					</tr>
1093
				<?php endforeach;
1094
; ?>
1095
1096
			<?php elseif ( $add_default_donation_field ) : ?>
1097
				<!--Default repeater field group-->
1098
				<tr class="give-row">
1099
					<td class="give-repeater-field-wrap give-column" colspan="2">
1100
						<div class="give-row-head give-move">
1101
							<button type="button" class="handlediv button-link">
1102
								<span class="toggle-indicator"></span></button>
1103
							<sapn class="give-remove" title="<?php esc_html_e( 'Remove Group', 'give' ); ?>">-
1104
							</sapn>
1105
							<h2>
1106
								<span data-header-title="<?php echo $header_title; ?>"><?php echo $header_title; ?></span>
1107
							</h2>
1108
						</div>
1109
						<div class="give-row-body">
1110
							<?php
1111
							foreach ( $fields['fields'] as $field ) :
1112
								if ( ! give_is_field_callback_exist( $field ) ) {
1113
									continue;
1114
								}
1115
1116
								$field['repeat']              = true;
1117
								$field['repeatable_field_id'] = give_get_repeater_field_id( $field, $fields, 0 );
1118
								$field['attributes']['value'] = apply_filters( "give_default_field_group_field_{$field['id']}_value", ( ! empty( $field['default'] ) ? $field['default'] : '' ), $field );
1119
								$field['id']                  = str_replace( array( '[', ']' ), array(
1120
									'_',
1121
									'',
1122
								), $field['repeatable_field_id'] );
1123
								give_render_field( $field );
1124
							endforeach;
1125
							?>
1126
						</div>
1127
					</td>
1128
				</tr>
1129
			<?php endif; ?>
1130
			</tbody>
1131
			<tfoot>
1132
			<tr>
1133
				<?php
1134
				$add_row_btn_title = isset( $fields['options']['add_button'] )
1135
					? $add_row_btn_title = $fields['options']['add_button']
1136
					: esc_html__( 'Add Row', 'give' );
1137
				?>
1138
				<td colspan="2" class="give-add-repeater-field-section-row-wrap">
1139
					<span class="button button-primary give-add-repeater-field-section-row"><?php echo $add_row_btn_title; ?></span>
1140
				</td>
1141
			</tr>
1142
			</tfoot>
1143
		</table>
1144
	</div>
1145
	<?php
1146
}
1147
1148
1149
/**
1150
 * Get current setting tab.
1151
 *
1152
 * @since  1.8
1153
 * @return string
1154
 */
1155
function give_get_current_setting_tab() {
1156
	// Get current setting page.
1157
	$current_setting_page = give_get_current_setting_page();
1158
1159
	/**
1160
	 * Filter the default tab for current setting page.
1161
	 *
1162
	 * @since 1.8
1163
	 *
1164
	 * @param string
1165
	 */
1166
	$default_current_tab = apply_filters( "give_default_setting_tab_{$current_setting_page}", 'general' );
1167
1168
	// Get current tab.
1169
	$current_tab = empty( $_GET['tab'] ) ? $default_current_tab : urldecode( $_GET['tab'] );
1170
1171
	// Output.
1172
	return $current_tab;
1173
}
1174
1175
1176
/**
1177
 * Get current setting section.
1178
 *
1179
 * @since  1.8
1180
 * @return string
1181
 */
1182
function give_get_current_setting_section() {
1183
	// Get current tab.
1184
	$current_tab = give_get_current_setting_tab();
1185
1186
	/**
1187
	 * Filter the default section for current setting page tab.
1188
	 *
1189
	 * @since 1.8
1190
	 *
1191
	 * @param string
1192
	 */
1193
	$default_current_section = apply_filters( "give_default_setting_tab_section_{$current_tab}", '' );
1194
1195
	// Get current section.
1196
	$current_section = empty( $_REQUEST['section'] ) ? $default_current_section : urldecode( $_REQUEST['section'] );
1197
1198
	// Output.
1199
	return $current_section;
1200
}
1201
1202
/**
1203
 * Get current setting page.
1204
 *
1205
 * @since  1.8
1206
 * @return string
1207
 */
1208
function give_get_current_setting_page() {
1209
	// Get current page.
1210
	$setting_page = ! empty( $_GET['page'] ) ? urldecode( $_GET['page'] ) : '';
1211
1212
	// Output.
1213
	return $setting_page;
1214
}
1215
1216
/**
1217
 * Set value for Form content --> Display content field setting.
1218
 *
1219
 * Backward compatibility:  set value by _give_content_option form meta field value if _give_display_content is not set
1220
 * yet.
1221
 *
1222
 * @since  1.8
1223
 *
1224
 * @param  mixed $field_value Field Value.
1225
 * @param  array $field       Field args.
1226
 * @param  int   $postid      Form/Post ID.
1227
 *
1228
 * @return string
1229
 */
1230
function _give_display_content_field_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1231
	$show_content = give_get_meta( $postid, '_give_content_option', true );
1232
1233
	if (
1234
		! give_get_meta( $postid, '_give_display_content', true )
1235
		&& $show_content
1236
		&& ( 'none' !== $show_content )
1237
	) {
1238
		$field_value = 'enabled';
1239
	}
1240
1241
	return $field_value;
1242
}
1243
1244
add_filter( '_give_display_content_field_value', '_give_display_content_field_value', 10, 3 );
1245
1246
1247
/**
1248
 * Set value for Form content --> Content placement field setting.
1249
 *
1250
 * Backward compatibility:  set value by _give_content_option form meta field value if _give_content_placement is not
1251
 * set yet.
1252
 *
1253
 * @since  1.8
1254
 *
1255
 * @param  mixed $field_value Field Value.
1256
 * @param  array $field       Field args.
1257
 * @param  int   $postid      Form/Post ID.
1258
 *
1259
 * @return string
1260
 */
1261
function _give_content_placement_field_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1262
	$show_content = give_get_meta( $postid, '_give_content_option', true );
1263
1264
	if (
1265
		! give_get_meta( $postid, '_give_content_placement', true )
1266
		&& ( 'none' !== $show_content )
1267
	) {
1268
		$field_value = $show_content;
1269
	}
1270
1271
	return $field_value;
1272
}
1273
1274
add_filter( '_give_content_placement_field_value', '_give_content_placement_field_value', 10, 3 );
1275
1276
1277
/**
1278
 * Set value for Terms and Conditions --> Terms and Conditions field setting.
1279
 *
1280
 * Backward compatibility:  set value by _give_terms_option form meta field value if it's value is none.
1281
 *
1282
 * @since  1.8
1283
 *
1284
 * @param  mixed $field_value Field Value.
1285
 * @param  array $field       Field args.
1286
 * @param  int   $postid      Form/Post ID.
1287
 *
1288
 * @return string
1289
 */
1290
function _give_terms_option_field_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1291
	$term_option = give_get_meta( $postid, '_give_terms_option', true );
1292
1293
	if ( in_array( $term_option, array( 'none', 'yes' ) ) ) {
1294
		$field_value = ( 'yes' === $term_option ? 'enabled' : 'disabled' );
1295
	}
1296
1297
	return $field_value;
1298
}
1299
1300
add_filter( '_give_terms_option_field_value', '_give_terms_option_field_value', 10, 3 );
1301
1302
1303
/**
1304
 * Set value for Form Display --> Offline Donation --> Billing Fields.
1305
 *
1306
 * Backward compatibility:  set value by _give_offline_donation_enable_billing_fields_single form meta field value if
1307
 * it's value is on.
1308
 *
1309
 * @since  1.8
1310
 *
1311
 * @param  mixed $field_value Field Value.
1312
 * @param  array $field       Field args.
1313
 * @param  int   $postid      Form/Post ID.
1314
 *
1315
 * @return string
1316
 */
1317
function _give_offline_donation_enable_billing_fields_single_field_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1318
	$offline_donation = give_get_meta( $postid, '_give_offline_donation_enable_billing_fields_single', true );
1319
1320
	if ( 'on' === $offline_donation ) {
1321
		$field_value = 'enabled';
1322
	}
1323
1324
	return $field_value;
1325
}
1326
1327
add_filter( '_give_offline_donation_enable_billing_fields_single_field_value', '_give_offline_donation_enable_billing_fields_single_field_value', 10, 3 );
1328
1329
1330
/**
1331
 * Set value for Donation Options --> Custom Amount.
1332
 *
1333
 * Backward compatibility:  set value by _give_custom_amount form meta field value if it's value is yes or no.
1334
 *
1335
 * @since  1.8
1336
 *
1337
 * @param  mixed $field_value Field Value.
1338
 * @param  array $field       Field args.
1339
 * @param  int   $postid      Form/Post ID.
1340
 *
1341
 * @return string
1342
 */
1343
function _give_custom_amount_field_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1344
	$custom_amount = give_get_meta( $postid, '_give_custom_amount', true );
1345
1346
	if ( in_array( $custom_amount, array( 'yes', 'no' ) ) ) {
1347
		$field_value = ( 'yes' === $custom_amount ? 'enabled' : 'disabled' );
1348
	}
1349
1350
	return $field_value;
1351
}
1352
1353
add_filter( '_give_custom_amount_field_value', '_give_custom_amount_field_value', 10, 3 );
1354
1355
1356
/**
1357
 * Set value for Donation Goal --> Donation Goal.
1358
 *
1359
 * Backward compatibility:  set value by _give_goal_option form meta field value if it's value is yes or no.
1360
 *
1361
 * @since  1.8
1362
 *
1363
 * @param  mixed $field_value Field Value.
1364
 * @param  array $field       Field args.
1365
 * @param  int   $postid      Form/Post ID.
1366
 *
1367
 * @return string
1368
 */
1369
function _give_goal_option_field_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1370
	$goal_option = give_get_meta( $postid, '_give_goal_option', true );
1371
1372
	if ( in_array( $goal_option, array( 'yes', 'no' ) ) ) {
1373
		$field_value = ( 'yes' === $goal_option ? 'enabled' : 'disabled' );
1374
	}
1375
1376
	return $field_value;
1377
}
1378
1379
add_filter( '_give_goal_option_field_value', '_give_goal_option_field_value', 10, 3 );
1380
1381
/**
1382
 * Set value for Donation Goal --> close Form.
1383
 *
1384
 * Backward compatibility:  set value by _give_close_form_when_goal_achieved form meta field value if it's value is yes
1385
 * or no.
1386
 *
1387
 * @since  1.8
1388
 *
1389
 * @param  mixed $field_value Field Value.
1390
 * @param  array $field       Field args.
1391
 * @param  int   $postid      Form/Post ID.
1392
 *
1393
 * @return string
1394
 */
1395
function _give_close_form_when_goal_achieved_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1396
	$close_form = give_get_meta( $postid, '_give_close_form_when_goal_achieved', true );
1397
1398
	if ( in_array( $close_form, array( 'yes', 'no' ) ) ) {
1399
		$field_value = ( 'yes' === $close_form ? 'enabled' : 'disabled' );
1400
	}
1401
1402
	return $field_value;
1403
}
1404
1405
add_filter( '_give_close_form_when_goal_achieved_field_value', '_give_close_form_when_goal_achieved_value', 10, 3 );
1406
1407
1408
/**
1409
 * Set value for Form display --> Guest Donation.
1410
 *
1411
 * Backward compatibility:  set value by _give_logged_in_only form meta field value if it's value is yes or no.
1412
 *
1413
 * @since  1.8
1414
 *
1415
 * @param  mixed $field_value Field Value.
1416
 * @param  array $field       Field args.
1417
 * @param  int   $postid      Form/Post ID.
1418
 *
1419
 * @return string
1420
 */
1421
function _give_logged_in_only_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1422
	$guest_donation = give_get_meta( $postid, '_give_logged_in_only', true );
1423
1424
	if ( in_array( $guest_donation, array( 'yes', 'no' ) ) ) {
1425
		$field_value = ( 'yes' === $guest_donation ? 'enabled' : 'disabled' );
1426
	}
1427
1428
	return $field_value;
1429
}
1430
1431
add_filter( '_give_logged_in_only_field_value', '_give_logged_in_only_value', 10, 3 );
1432
1433
/**
1434
 * Set value for Offline Donations --> Offline Donations.
1435
 *
1436
 * Backward compatibility:  set value by _give_customize_offline_donations form meta field value if it's value is yes
1437
 * or no.
1438
 *
1439
 * @since  1.8
1440
 *
1441
 * @param  mixed $field_value Field Value.
1442
 * @param  array $field       Field args.
1443
 * @param  int   $postid      Form/Post ID.
1444
 *
1445
 * @return string
1446
 */
1447
function _give_customize_offline_donations_value( $field_value, $field, $postid ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1448
	$customize_offline_text = give_get_meta( $postid, '_give_customize_offline_donations', true );
1449
1450
	if ( in_array( $customize_offline_text, array( 'yes', 'no' ) ) ) {
1451
		$field_value = ( 'yes' === $customize_offline_text ? 'enabled' : 'disabled' );
1452
	}
1453
1454
	return $field_value;
1455
}
1456
1457
add_filter( '_give_customize_offline_donations_field_value', '_give_customize_offline_donations_value', 10, 3 );
1458
1459
1460
/**
1461
 * Set repeater field id for multi donation form.
1462
 *
1463
 * @since 1.8
1464
 *
1465
 * @param int   $field_id
1466
 * @param array $field
1467
 * @param array $fields
1468
 * @param bool  $default
1469
 *
1470
 * @return mixed
1471
 */
1472
function _give_set_multi_level_repeater_field_id( $field_id, $field, $fields, $default ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field_id 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...
1473
	$row_placeholder = false !== $default ? $default : '{{row-count-placeholder}}';
1474
	$field_id        = "{$fields['id']}[{$row_placeholder}][{$field['id']}][level_id]";
1475
1476
	return $field_id;
1477
}
1478
1479
add_filter( 'give_get_repeater_field__give_id_id', '_give_set_multi_level_repeater_field_id', 10, 4 );
1480
1481
/**
1482
 * Set repeater field value for multi donation form.
1483
 *
1484
 * @since 1.8
1485
 *
1486
 * @param string $field_value
1487
 * @param array  $field
1488
 * @param array  $field_group
1489
 * @param array  $fields
1490
 *
1491
 * @return mixed
1492
 */
1493
function _give_set_multi_level_repeater_field_value( $field_value, $field, $field_group, $fields ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field_value 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...
Unused Code introduced by
The parameter $fields 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...
1494
	$field_value = $field_group[ $field['id'] ]['level_id'];
1495
1496
	return $field_value;
1497
}
1498
1499
add_filter( 'give_get_repeater_field__give_id_value', '_give_set_multi_level_repeater_field_value', 10, 4 );
1500
1501
/**
1502
 * Set default value for _give_id field.
1503
 *
1504
 * @since 1.8
1505
 *
1506
 * @param $field
1507
 *
1508
 * @return string
0 ignored issues
show
Documentation introduced by
Should the return type not be integer?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
1509
 */
1510
function _give_set_field_give_id_default_value( $field ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1511
	return 0;
1512
}
1513
1514
add_filter( 'give_default_field_group_field__give_id_value', '_give_set_field_give_id_default_value' );
1515
1516
/**
1517
 * Set default value for _give_default field.
1518
 *
1519
 * @since 1.8
1520
 *
1521
 * @param $field
1522
 *
1523
 * @return string
1524
 */
1525
function _give_set_field_give_default_default_value( $field ) {
0 ignored issues
show
Unused Code introduced by
The parameter $field 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...
1526
	return 'default';
1527
}
1528
1529
add_filter( 'give_default_field_group_field__give_default_value', '_give_set_field_give_default_default_value' );
1530
1531
/**
1532
 * Set repeater field editor id for field type wysiwyg.
1533
 *
1534
 * @since 1.8
1535
 *
1536
 * @param $field_name
1537
 * @param $field
1538
 *
1539
 * @return string
1540
 */
1541
function give_repeater_field_set_editor_id( $field_name, $field ) {
1542
	if ( isset( $field['repeatable_field_id'] ) && 'wysiwyg' == $field['type'] ) {
1543
		$field_name = '_give_repeater_' . uniqid() . '_wysiwyg';
1544
	}
1545
1546
	return $field_name;
1547
}
1548
1549
add_filter( 'give_get_field_name', 'give_repeater_field_set_editor_id', 10, 2 );
1550