Test Failed
Push — feature/background-processing ( ddf6d7 )
by Ravinder
06:04
created

donors.php ➔ give_donor_view()   F

Complexity

Conditions 22
Paths 2304

Size

Total Lines 436
Code Lines 242

Duplication

Lines 6
Ratio 1.38 %

Importance

Changes 0
Metric Value
cc 22
eloc 242
nc 2304
nop 1
dl 6
loc 436
rs 2
c 0
b 0
f 0

How to fix   Long Method    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
2
/**
3
 * Donors.
4
 *
5
 * @package     Give
6
 * @subpackage  Admin/Donors
7
 * @copyright   Copyright (c) 2016, WordImpress
8
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
9
 * @since       1.0
10
 */
11
12
// Exit if accessed directly.
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
/**
18
 * Donors Page.
19
 *
20
 * Renders the donors page contents.
21
 *
22
 * @since  1.0
23
 * @return void
24
 */
25
function give_donors_page() {
26
	$default_views  = give_donor_views();
27
	$requested_view = isset( $_GET['view'] ) ? sanitize_text_field( $_GET['view'] ) : 'donors';
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
28
	if ( array_key_exists( $requested_view, $default_views ) && function_exists( $default_views[ $requested_view ] ) ) {
29
		give_render_donor_view( $requested_view, $default_views );
30
	} else {
31
		give_donors_list();
32
	}
33
}
34
35
/**
36
 * Register the views for donor management.
37
 *
38
 * @since  1.0
39
 * @return array Array of views and their callbacks.
40
 */
41
function give_donor_views() {
42
43
	$views = array();
44
45
	return apply_filters( 'give_donor_views', $views );
46
47
}
48
49
/**
50
 * Register the tabs for donor management.
51
 *
52
 * @since  1.0
53
 * @return array Array of tabs for the donor.
54
 */
55
function give_donor_tabs() {
56
57
	$tabs = array();
58
59
	return apply_filters( 'give_donor_tabs', $tabs );
60
61
}
62
63
/**
64
 * List table of donors.
65
 *
66
 * @since  1.0
67
 * @return void
68
 */
69
function give_donors_list() {
70
	include dirname( __FILE__ ) . '/class-donor-table.php';
71
72
	$donors_table = new Give_Donor_List_Table();
73
	$donors_table->prepare_items();
74
	?>
75
	<div class="wrap">
76
		<h1><?php echo get_admin_page_title(); ?></h1>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'get_admin_page_title'
Loading history...
77
		<?php
78
		/**
79
		 * Fires in donors screen, above the table.
80
		 *
81
		 * @since 1.0
82
		 */
83
		do_action( 'give_donors_table_top' );
84
		?>
85
		<form id="give-donors-filter" method="get" action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors' ); ?>">
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
86
			<?php
87
			$donors_table->search_box( esc_html__( 'Search Donors', 'give' ), 'give-donors' );
88
			$donors_table->display();
89
			?>
90
			<input type="hidden" name="post_type" value="give_forms" />
91
			<input type="hidden" name="page" value="give-donors" />
92
			<input type="hidden" name="view" value="donors" />
93
		</form>
94
		<?php
95
		/**
96
		 * Fires in donors screen, below the table.
97
		 *
98
		 * @since 1.0
99
		 */
100
		do_action( 'give_donors_table_bottom' );
101
		?>
102
	</div>
103
	<?php
104
}
105
106
/**
107
 * Renders the donor view wrapper.
108
 *
109
 * @since  1.0
110
 *
111
 * @param  string $view      The View being requested.
112
 * @param  array  $callbacks The Registered views and their callback functions.
113
 *
114
 * @return void
115
 */
116
function give_render_donor_view( $view, $callbacks ) {
117
118
	$render = true;
119
120
	$donor_view_role = apply_filters( 'give_view_donors_role', 'view_give_reports' );
121
122
	if ( ! current_user_can( $donor_view_role ) ) {
123
		give_set_error( 'give-no-access', __( 'You are not permitted to view this data.', 'give' ) );
124
		$render = false;
125
	}
126
127
	if ( ! isset( $_GET['id'] ) || ! is_numeric( $_GET['id'] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
128
		give_set_error( 'give-invalid_donor', __( 'Invalid Donor ID.', 'give' ) );
129
		$render = false;
130
	}
131
132
	$donor_id = (int) $_GET['id'];
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
133
	$donor    = new Give_Donor( $donor_id );
0 ignored issues
show
Documentation introduced by
$donor_id is of type integer, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
134
135
	if ( empty( $donor->id ) ) {
136
		give_set_error( 'give-invalid_donor', __( 'Invalid Donor ID.', 'give' ) );
137
		$render = false;
138
	}
139
140
	$donor_tabs = give_donor_tabs();
141
	?>
142
143
	<div class='wrap'>
144
145
		<?php if ( give_get_errors() ) : ?>
146
			<div class="error settings-error">
147
				<?php Give()->notices->render_frontend_notices( 0 ); ?>
148
			</div>
149
		<?php endif; ?>
150
151
		<h1 class="screen-reader-text"><?php esc_html_e( 'Donor', 'give' ); ?></h1>
152
153
		<?php if ( $donor && $render ) : ?>
154
155
			<h2 class="nav-tab-wrapper">
156
			<?php
157
			foreach ( $donor_tabs as $key => $tab ) :
158
				$active = $key === $view ? true : false;
159
				$class = $active ? 'nav-tab nav-tab-active' : 'nav-tab';
160
				printf(
161
					'<a href="%1$s" class="%2$s"><span class="dashicons %3$s"></span>%4$s</a>' . "\n",
162
					esc_url( admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=' . $key . '&id=' . $donor->id ) ),
163
					esc_attr( $class ),
164
					sanitize_html_class( $tab['dashicon'] ),
165
					esc_html( $tab['title'] )
166
				);
167
			endforeach;
168
			?>
169
			</h2>
170
171
			<div id="give-donor-card-wrapper">
172
				<?php $callbacks[ $view ]( $donor ) ?>
173
			</div>
174
175
		<?php endif; ?>
176
177
	</div>
178
	<?php
179
180
}
181
182
183
/**
184
 * View a donor
185
 *
186
 * @since  1.0
187
 *
188
 * @param  Give_Donor $donor The Donor object being displayed.
189
 *
190
 * @return void
191
 */
192
function give_donor_view( $donor ) {
193
194
	$donor_edit_role = apply_filters( 'give_edit_donors_role', 'edit_give_payments' );
195
196
	/**
197
	 * Fires in donor profile screen, above the donor card.
198
	 *
199
	 * @since 1.0
200
	 *
201
	 * @param object $donor The donor object being displayed.
202
	 */
203
	do_action( 'give_donor_card_top', $donor );
204
	?>
205
206
	<div id="donor-summary" class="info-wrapper donor-section postbox">
207
208
		<form id="edit-donor-info" method="post" action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor->id ); ?>">
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
209
210
			<div class="donor-info">
211
212
				<div class="donor-bio-header clearfix">
213
214
					<div class="avatar-wrap left" id="donor-avatar">
215
						<?php echo get_avatar( $donor->email ); ?>
216
					</div>
217
218
					<div id="donor-name-wrap" class="left">
219
						<span class="donor-id">#<?php echo $donor->id; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
220
						<span class="donor-name info-item edit-item"><input size="15" data-key="name" name="customerinfo[name]" type="text" value="<?php echo esc_attr( $donor->name ); ?>" placeholder="<?php esc_attr_e( 'Donor Name', 'give' ); ?>" /></span>
221
						<span class="donor-name info-item editable"><span data-key="name"><?php echo $donor->name; ?></span></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
222
					</div>
223
					<p class="donor-since info-item">
224
						<?php esc_html_e( 'Donor since', 'give' ); ?>
225
						<?php echo date_i18n( give_date_format(), strtotime( $donor->date_created ) ) ?>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'date_i18n'
Loading history...
226
					</p>
227
					<?php if ( current_user_can( $donor_edit_role ) ) : ?>
228
						<a href="#" id="edit-donor" class="button info-item editable donor-edit-link"><?php esc_html_e( 'Edit Donor', 'give' ); ?></a>
229
					<?php endif; ?>
230
				</div>
231
				<!-- /donor-bio-header -->
232
233
				<div class="donor-main-wrapper">
234
235
					<table class="widefat">
236
						<tbody>
237
						<tr class="alternate">
238
							<th scope="col"><label for="tablecell"><?php esc_html_e( 'User:', 'give' ); ?></label></th>
239
							<td>
240
								<span class="donor-user-id info-item edit-item">
241
									<?php
242
243
									$user_id   = $donor->user_id > 0 ? $donor->user_id : '';
244
245
									$data_atts = array(
246
										'key'     => 'user_login',
247
										'search-type' => 'user',
248
									);
249
									$user_args = array(
250
										'name'  => 'customerinfo[user_id]',
251
										'class' => 'give-user-dropdown',
252
										'data'  => $data_atts,
253
									);
254
255
									if ( ! empty( $user_id ) ) {
256
										$userdata           = get_userdata( $user_id );
257
										$user_args['selected'] = $user_id;
258
									}
259
260
									echo Give()->html->ajax_user_search( $user_args );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'Give'
Loading history...
261
									?>
262
								</span>
263
264
								<span class="donor-user-id info-item editable">
265
									<?php if ( ! empty( $userdata ) ) { ?>
266
										<span data-key="user_id">#<?php echo $donor->user_id . ' - ' . $userdata->display_name; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
introduced by
Expected next thing to be a escaping function, not '$userdata'
Loading history...
267
									<?php } else { ?>
268
										<span data-key="user_id"><?php esc_html_e( 'None', 'give' ); ?></span>
269
									<?php } ?>
270
									<?php if ( current_user_can( $donor_edit_role ) && intval( $donor->user_id ) > 0 ) { ?>
271
										<span class="disconnect-user"> - <a id="disconnect-donor" href="#disconnect" aria-label="<?php esc_attr_e( 'Disconnects the current user ID from this donor record.', 'give' ); ?>"><?php esc_html_e( 'Disconnect User', 'give' ); ?></a></span>
272
									<?php } ?>
273
								</span>
274
							</td>
275
						</tr>
276
						<?php if ( isset( $donor->user_id ) && $donor->user_id > 0 ) : ?>
277
278
							<tr>
279
								<th scope="col"><?php esc_html_e( 'Address:', 'give' ); ?></th>
280
								<td class="row-title">
281
282
									<div class="donor-address-wrapper">
283
284
										<?php
285
										$address  = get_user_meta( $donor->user_id, '_give_user_address', true );
0 ignored issues
show
introduced by
get_user_meta() usage is highly discouraged, check VIP documentation on "Working with wp_users"
Loading history...
286
										$defaults = array(
287
											'line1'   => '',
288
											'line2'   => '',
289
											'city'    => '',
290
											'state'   => '',
291
											'country' => '',
292
											'zip'     => '',
293
										);
294
295
										$address = wp_parse_args( $address, $defaults );
296
										?>
297
298
										<?php if ( ! empty( $address ) ) { ?>
299
											<span class="donor-address info-item editable">
300
												<span class="info-item" data-key="line1"><?php echo $address['line1']; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
301
												<span class="info-item" data-key="line2"><?php echo $address['line2']; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
302
												<span class="info-item" data-key="city"><?php echo $address['city']; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
303
												<span class="info-item" data-key="state"><?php echo $address['state']; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
304
												<span class="info-item" data-key="country"><?php echo $address['country']; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
305
												<span class="info-item" data-key="zip"><?php echo $address['zip']; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
306
											</span>
307
										<?php } ?>
308
										<span class="donor-address info-item edit-item">
309
											<input class="info-item" type="text" data-key="line1" name="customerinfo[line1]" placeholder="<?php esc_attr_e( 'Address 1', 'give' ); ?>" value="<?php echo $address['line1']; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
310
											<input class="info-item" type="text" data-key="line2" name="customerinfo[line2]" placeholder="<?php esc_attr_e( 'Address 2', 'give' ); ?>" value="<?php echo $address['line2']; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
311
											<input class="info-item" type="text" data-key="city" name="customerinfo[city]" placeholder="<?php esc_attr_e( 'City', 'give' ); ?>" value="<?php echo $address['city']; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
312
											<select data-key="country" name="customerinfo[country]" id="billing_country" class="billing_country give-select edit-item">
313
												<?php
314
315
												$selected_country = $address['country'];
316
317
												$countries = give_get_country_list();
318 View Code Duplication
												foreach ( $countries as $country_code => $country ) {
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...
319
													echo '<option value="' . esc_attr( $country_code ) . '"' . selected( $country_code, $selected_country, false ) . '>' . $country . '</option>';
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$country'
Loading history...
320
												}
321
												?>
322
											</select>
323
											<?php
324
											$selected_state = give_get_state();
325
											$states         = give_get_states( $selected_country );
326
327
											$selected_state = isset( $address['state'] ) ? $address['state'] : $selected_state;
328
329
											if ( ! empty( $states ) ) {
330
												?>
331
												<select data-key="state" name="customerinfo[state]" id="card_state" class="card_state give-select info-item">
332
													<?php
333 View Code Duplication
													foreach ( $states as $state_code => $state ) {
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...
334
														echo '<option value="' . $state_code . '"' . selected( $state_code, $selected_state, false ) . '>' . $state . '</option>';
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$state_code'
Loading history...
introduced by
Expected next thing to be a escaping function, not '$state'
Loading history...
335
													}
336
													?>
337
												</select>
338
												<?php
339
											} else {
340
												?>
341
												<input type="text" size="6" data-key="state" name="customerinfo[state]" id="card_state" class="card_state give-input info-item" placeholder="<?php esc_attr_e( 'State / Province / County', 'give' ); ?>" />
342
												<?php
343
											}
344
											?>
345
											<input class="info-item" type="text" data-key="zip" name="customerinfo[zip]" placeholder="<?php esc_attr_e( 'Zip / Postal Code', 'give' ); ?>" value="<?php echo $address['zip']; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$address'
Loading history...
346
										</span>
347
348
									</div>
349
								</td>
350
							</tr>
351
						<?php endif; ?>
352
						</tbody>
353
					</table>
354
355
				</div>
356
357
			</div>
358
359
			<span id="donor-edit-actions" class="edit-item">
360
				<input type="hidden" data-key="id" name="customerinfo[id]" value="<?php echo $donor->id; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
361
				<?php wp_nonce_field( 'edit-donor', '_wpnonce', false, true ); ?>
362
				<input type="hidden" name="give_action" value="edit-donor" />
363
				<input type="submit" id="give-edit-donor-save" class="button-secondary" value="<?php esc_attr_e( 'Update Donor', 'give' ); ?>" />
364
				<a id="give-edit-donor-cancel" href="" class="delete"><?php esc_html_e( 'Cancel', 'give' ); ?></a>
365
			</span>
366
367
		</form>
368
369
	</div>
370
371
	<?php
372
	/**
373
	 * Fires in donor profile screen, above the stats list.
374
	 *
375
	 * @since 1.0
376
	 *
377
	 * @param object $donor The donor object being displayed.
378
	 */
379
	do_action( 'give_donor_before_stats', $donor );
380
	?>
381
382
	<div id="donor-stats-wrapper" class="donor-section postbox clear">
383
		<ul>
384
			<li>
385
				<a href="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&donor=' . absint( $donor->id ) ); ?>">
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
386
					<span class="dashicons dashicons-heart"></span>
387
					<?php
388
					// Completed Donations
389
					$completed_donations_text = sprintf( _n( '%d Completed Donation', '%d Completed Donations', $donor->purchase_count, 'give' ), $donor->purchase_count );
390
					echo apply_filters( 'give_donor_completed_donations', $completed_donations_text, $donor );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'apply_filters'
Loading history...
391
					?>
392
				</a>
393
			</li>
394
			<li>
395
				<span class="dashicons dashicons-chart-area"></span>
396
				<?php echo give_currency_filter( give_format_amount( $donor->purchase_value, array( 'sanitize' => false ) ) ); ?> <?php esc_html_e( 'Lifetime Donations', 'give' ); ?>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'give_currency_filter'
Loading history...
397
			</li>
398
			<?php
399
			/**
400
			 * Fires in donor profile screen, in the stats list.
401
			 *
402
			 * Allows you to add more list items to the stats list.
403
			 *
404
			 * @since 1.0
405
			 *
406
			 * @param object $donor The donor object being displayed.
407
			 */
408
			do_action( 'give_donor_stats_list', $donor );
409
			?>
410
		</ul>
411
	</div>
412
413
	<?php
414
	/**
415
	 * Fires in donor profile screen, above the tables wrapper.
416
	 *
417
	 * @since 1.0
418
	 *
419
	 * @param object $donor The donor object being displayed.
420
	 */
421
	do_action( 'give_donor_before_tables_wrapper', $donor );
422
	?>
423
424
	<div id="donor-tables-wrapper" class="donor-section">
425
426
		<?php
427
		/**
428
		 * Fires in donor profile screen, above the tables.
429
		 *
430
		 * @since 1.0
431
		 *
432
		 * @param object $donor The donor object being displayed.
433
		 */
434
		do_action( 'give_donor_before_tables', $donor );
435
		?>
436
437
		<h3><?php _e( 'Donor Emails', 'give' ); ?></h3>
438
439
		<table class="wp-list-table widefat striped emails">
440
			<thead>
441
				<tr>
442
					<th><?php _e( 'Email', 'give' ); ?></th>
443
					<th><?php _e( 'Actions', 'give' ); ?></th>
444
				</tr>
445
			</thead>
446
447
			<tbody>
448
				<?php if ( ! empty( $donor->emails ) ) { ?>
449
450
					<?php foreach ( $donor->emails as $key => $email ) : ?>
451
						<tr data-key="<?php echo $key; ?>">
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$key'
Loading history...
452
							<td>
453
								<?php echo $email; ?>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$email'
Loading history...
454
								<?php if ( 'primary' === $key ) : ?>
455
									<span class="dashicons dashicons-star-filled primary-email-icon"></span>
456
								<?php endif; ?>
457
							</td>
458
							<td>
459
								<?php if ( 'primary' !== $key ) : ?>
460
									<?php
461
									$base_url    = admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor->id );
462
									$promote_url = wp_nonce_url( add_query_arg( array(
463
										'email' => rawurlencode( $email ),
464
										'give_action' => 'set_donor_primary_email',
465
									), $base_url ), 'give-set-donor-primary-email' );
466
									$remove_url  = wp_nonce_url( add_query_arg( array(
467
										'email' => rawurlencode( $email ),
468
										'give_action' => 'remove_donor_email',
469
									), $base_url ), 'give-remove-donor-email' );
470
									?>
471
									<a href="<?php echo $promote_url; ?>"><?php _e( 'Make Primary', 'give' ); ?></a>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$promote_url'
Loading history...
472
									&nbsp;|&nbsp;
473
									<a href="<?php echo $remove_url; ?>" class="delete"><?php _e( 'Remove', 'give' ); ?></a>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$remove_url'
Loading history...
474
								<?php endif; ?>
475
							</td>
476
						</tr>
477
					<?php endforeach; ?>
478
479
					<tr class="add-donor-email-row">
480
						<td colspan="2" class="add-donor-email-td">
481
							<div class="add-donor-email-wrapper">
482
								<input type="hidden" name="donor-id" value="<?php echo $donor->id; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
483
								<?php wp_nonce_field( 'give_add_donor_email', 'add_email_nonce', false, true ); ?>
484
								<input type="email" name="additional-email" value="" placeholder="<?php _e( 'Email Address', 'give' ); ?>" />&nbsp;
485
								<input type="checkbox" name="make-additional-primary" value="1" id="make-additional-primary" />&nbsp;<label for="make-additional-primary"><?php _e( 'Make Primary', 'give' ); ?></label>
486
								<button class="button-secondary give-add-donor-email" id="add-donor-email"><?php _e( 'Add Email', 'give' ); ?></button>
487
								<span class="spinner"></span>
488
							</div>
489
							<div class="notice-wrap"></div>
490
						</td>
491
					</tr>
492
				<?php } else { ?>
493
					<tr><td colspan="2"><?php _e( 'No Emails Found', 'give' ); ?></td></tr>
494
				<?php }// End if().
495
	?>
496
			</tbody>
497
		</table>
498
499
		<h3><?php esc_html_e( 'Recent Donations', 'give' ); ?></h3>
500
		<?php
501
		$payment_ids = explode( ',', $donor->payment_ids );
502
		$payments    = give_get_payments( array(
503
			'post__in' => $payment_ids,
504
		) );
505
		$payments    = array_slice( $payments, 0, 10 );
506
		?>
507
		<table class="wp-list-table widefat striped payments">
508
			<thead>
509
			<tr>
510
				<th scope="col"><?php esc_html_e( 'ID', 'give' ); ?></th>
511
				<th scope="col"><?php esc_html_e( 'Amount', 'give' ); ?></th>
512
				<th scope="col"><?php esc_html_e( 'Date', 'give' ); ?></th>
513
				<th scope="col"><?php esc_html_e( 'Status', 'give' ); ?></th>
514
				<th scope="col"><?php esc_html_e( 'Actions', 'give' ); ?></th>
515
			</tr>
516
			</thead>
517
			<tbody>
518
			<?php if ( ! empty( $payments ) ) { ?>
519
				<?php foreach ( $payments as $payment ) : ?>
520
					<tr>
521
						<td><?php echo $payment->ID; ?></td>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$payment'
Loading history...
522
						<td><?php echo give_payment_amount( $payment->ID ); ?></td>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'give_payment_amount'
Loading history...
523
						<td><?php echo date_i18n( give_date_format(), strtotime( $payment->post_date ) ); ?></td>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'date_i18n'
Loading history...
524
						<td><?php echo give_get_payment_status( $payment, true ); ?></td>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'give_get_payment_status'
Loading history...
525
						<td>
526
							<?php
527
							printf(
528
								'<a href="%1$s" aria-label="%2$s">%3$s</a>',
529
								admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&view=view-payment-details&id=' . $payment->ID ),
530
								sprintf(
531
									/* translators: %s: Donation ID */
532
									esc_attr__( 'View Donation %s.', 'give' ),
533
									$payment->ID
534
								),
535
								esc_html__( 'View Donation', 'give' )
536
							);
537
							?>
538
539
							<?php
540
							/**
541
							 * Fires in donor profile screen, in the recent donations tables action links.
542
							 *
543
							 * Allows you to add more action links for each donation, after the 'View Donation' action link.
544
							 *
545
							 * @since 1.0
546
							 *
547
							 * @param object $donor The donor object being displayed.
548
							 * @param object $payment  The payment object being displayed.
549
							 */
550
							do_action( 'give_donor_recent_purchases_actions', $donor, $payment );
551
							?>
552
						</td>
553
					</tr>
554
				<?php endforeach; ?>
555
			<?php } else { ?>
556
				<tr>
557
					<td colspan="5"><?php esc_html_e( 'No donations found.', 'give' ); ?></td>
558
				</tr>
559
			<?php }// End if().
560
	?>
561
			</tbody>
562
		</table>
563
564
		<h3><?php esc_html_e( 'Completed Forms', 'give' ); ?></h3>
565
		<?php
566
		$donations = give_get_users_completed_donations( $donor->email );
567
		?>
568
		<table class="wp-list-table widefat striped donations">
569
			<thead>
570
			<tr>
571
				<th scope="col"><?php esc_html_e( 'Form', 'give' ); ?></th>
572
				<th scope="col" width="120px"><?php esc_html_e( 'Actions', 'give' ); ?></th>
573
			</tr>
574
			</thead>
575
			<tbody>
576
			<?php if ( ! empty( $donations ) ) { ?>
577
				<?php foreach ( $donations as $donation ) : ?>
0 ignored issues
show
Bug introduced by
The expression $donations of type boolean|object is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
578
					<tr>
579
						<td><?php echo $donation->post_title; ?></td>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donation'
Loading history...
580
						<td>
581
							<?php
582
							printf(
583
								'<a href="%1$s" aria-label="%2$s">%3$s</a>',
584
								esc_url( admin_url( 'post.php?action=edit&post=' . $donation->ID ) ),
585
								sprintf(
586
									/* translators: %s: form name */
587
									esc_attr__( 'View Form %s.', 'give' ),
588
									$donation->post_title
589
								),
590
								esc_html__( 'View Form', 'give' )
591
							);
592
							?>
593
						</td>
594
					</tr>
595
				<?php endforeach; ?>
596
			<?php } else { ?>
597
				<tr>
598
					<td colspan="2"><?php esc_html_e( 'No completed donations found.', 'give' ); ?></td>
599
				</tr>
600
			<?php } ?>
601
			</tbody>
602
		</table>
603
604
		<?php
605
		/**
606
		 * Fires in donor profile screen, below the tables.
607
		 *
608
		 * @since 1.0
609
		 *
610
		 * @param object $donor The donor object being displayed.
611
		 */
612
		do_action( 'give_donor_after_tables', $donor );
613
		?>
614
615
	</div>
616
617
	<?php
618
	/**
619
	 * Fires in donor profile screen, below the donor card.
620
	 *
621
	 * @since 1.0
622
	 *
623
	 * @param object $donor The donor object being displayed.
624
	 */
625
	do_action( 'give_donor_card_bottom', $donor );
626
627
}
628
629
/**
630
 * View the notes of a donor.
631
 *
632
 * @since  1.0
633
 *
634
 * @param  object $donor The donor object being displayed.
635
 *
636
 * @return void
637
 */
638
function give_donor_notes_view( $donor ) {
639
640
	$paged          = isset( $_GET['paged'] ) && is_numeric( $_GET['paged'] ) ? $_GET['paged'] : 1;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
641
	$paged          = absint( $paged );
642
	$note_count     = $donor->get_notes_count();
643
	$per_page       = apply_filters( 'give_donor_notes_per_page', 20 );
644
	$total_pages    = ceil( $note_count / $per_page );
645
	$donor_notes = $donor->get_notes( $per_page, $paged );
646
	?>
647
648
	<div id="donor-notes-wrapper">
649
		<div class="donor-notes-header">
650
			<?php echo get_avatar( $donor->email, 30 ); ?> <span><?php echo $donor->name; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
651
		</div>
652
		<h3><?php esc_html_e( 'Notes', 'give' ); ?></h3>
653
654
		<?php if ( 1 == $paged ) : ?>
655
			<div style="display: block; margin-bottom: 55px;">
656
				<form id="give-add-donor-note" method="post" action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=notes&id=' . $donor->id ); ?>">
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
657
					<textarea id="donor-note" name="donor_note" class="donor-note-input" rows="10"></textarea>
658
					<br />
659
					<input type="hidden" id="donor-id" name="customer_id" value="<?php echo $donor->id; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
660
					<input type="hidden" name="give_action" value="add-donor-note" />
661
					<?php wp_nonce_field( 'add-donor-note', 'add_donor_note_nonce', true, true ); ?>
662
					<input id="add-donor-note" class="right button-primary" type="submit" value="Add Note" />
663
				</form>
664
			</div>
665
		<?php endif; ?>
666
667
		<?php
668
		$pagination_args = array(
669
			'base'     => '%_%',
670
			'format'   => '?paged=%#%',
671
			'total'    => $total_pages,
672
			'current'  => $paged,
673
			'show_all' => true,
674
		);
675
676
		echo paginate_links( $pagination_args );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'paginate_links'
Loading history...
677
		?>
678
679
		<div id="give-donor-notes" class="postbox">
680
			<?php if ( count( $donor_notes ) > 0 ) { ?>
681
				<?php foreach ( $donor_notes as $key => $note ) : ?>
682
					<div class="donor-note-wrapper dashboard-comment-wrap comment-item">
683
					<span class="note-content-wrap">
684
						<?php echo stripslashes( $note ); ?>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'stripslashes'
Loading history...
685
					</span>
686
					</div>
687
				<?php endforeach; ?>
688
			<?php } else { ?>
689
				<div class="give-no-donor-notes">
690
					<?php esc_html_e( 'No donor notes found.', 'give' ); ?>
691
				</div>
692
			<?php } ?>
693
		</div>
694
695
		<?php echo paginate_links( $pagination_args ); ?>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'paginate_links'
Loading history...
696
697
	</div>
698
699
	<?php
700
}
701
702
/**
703
 * Thw donor delete view.
704
 *
705
 * @since  1.0
706
 *
707
 * @param  object $donor The donor object being displayed.
708
 *
709
 * @return void
710
 */
711
function give_donor_delete_view( $donor ) {
712
713
	$donor_edit_role = apply_filters( 'give_edit_donors_role', 'edit_give_payments' );
0 ignored issues
show
Unused Code introduced by
$donor_edit_role 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...
714
715
	/**
716
	 * Fires in donor delete screen, above the content.
717
	 *
718
	 * @since 1.0
719
	 *
720
	 * @param object $donor The donor object being displayed.
721
	 */
722
	do_action( 'give_donor_delete_top', $donor );
723
	?>
724
725
	<div class="info-wrapper donor-section">
726
727
		<form id="delete-donor" method="post" action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=delete&id=' . $donor->id ); ?>">
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
728
729
			<div class="donor-notes-header">
730
				<?php echo get_avatar( $donor->email, 30 ); ?> <span><?php echo $donor->name; ?></span>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
731
			</div>
732
733
734
			<div class="donor-info delete-donor">
735
736
				<span class="delete-donor-options">
737
					<p>
738
						<?php echo Give()->html->checkbox( array(
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'Give'
Loading history...
739
							'name' => 'give-donor-delete-confirm',
740
						) ); ?>
741
						<label for="give-donor-delete-confirm"><?php esc_html_e( 'Are you sure you want to delete this donor?', 'give' ); ?></label>
742
					</p>
743
744
					<p>
745
						<?php echo Give()->html->checkbox( array(
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'Give'
Loading history...
746
							'name'    => 'give-donor-delete-records',
747
							'options' => array(
748
								'disabled' => true,
749
							),
750
						) ); ?>
751
						<label for="give-donor-delete-records"><?php esc_html_e( 'Delete all associated donations and records?', 'give' ); ?></label>
752
					</p>
753
754
					<?php
755
					/**
756
					 * Fires in donor delete screen, bellow the delete inputs.
757
					 *
758
					 * Allows you to add custom delete inputs.
759
					 *
760
					 * @since 1.0
761
					 *
762
					 * @param object $donor The donor object being displayed.
763
					 */
764
					do_action( 'give_donor_delete_inputs', $donor );
765
					?>
766
				</span>
767
768
				<span id="donor-edit-actions">
769
					<input type="hidden" name="customer_id" value="<?php echo $donor->id; ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$donor'
Loading history...
770
					<?php wp_nonce_field( 'delete-donor', '_wpnonce', false, true ); ?>
771
					<input type="hidden" name="give_action" value="delete-donor" />
772
					<input type="submit" disabled="disabled" id="give-delete-donor" class="button-primary" value="<?php esc_attr_e( 'Delete Donor', 'give' ); ?>" />
773
					<a id="give-delete-donor-cancel" href="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor->id ); ?>" class="delete"><?php esc_html_e( 'Cancel', 'give' ); ?></a>
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'admin_url'
Loading history...
774
				</span>
775
776
			</div>
777
778
		</form>
779
	</div>
780
781
	<?php
782
	/**
783
	 * Fires in donor delete screen, bellow the content.
784
	 *
785
	 * @since 1.0
786
	 *
787
	 * @param object $donor The donor object being displayed.
788
	 */
789
	do_action( 'give_donor_delete_bottom', $donor );
790
}
791