PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.4.7
GiveWP – Donation Plugin and Fundraising Platform v2.4.7
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / donors / donors.php
give / includes / admin / donors Last commit date
class-donor-table.php 7 years ago donor-actions.php 7 years ago donor-functions.php 7 years ago donors.php 7 years ago
donors.php
1132 lines
1 <?php
2 /**
3 * Donors.
4 *
5 * @package Give
6 * @subpackage Admin/Donors
7 * @copyright Copyright (c) 2016, GiveWP
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 /**
19 * Get formatted address
20 *
21 * @since 2.0
22 *
23 * @param array $address
24 * @param array $address_args
25 *
26 * @return string
27 */
28 function __give_get_format_address( $address, $address_args = array() ) {
29 $address_html = '';
30 $address_args = wp_parse_args(
31 $address_args,
32 array(
33 'type' => '',
34 'id' => null,
35 'index' => null,
36 'default_address' => false,
37 )
38 );
39
40 $address_id = $address_args['type'];
41
42 // Bailout.
43 if ( empty( $address ) || ! is_array( $address ) ) {
44 return $address_html;
45 }
46
47 // Address html.
48 $address_html = '';
49 $address_html .= sprintf(
50 '<span data-address-type="line1">%1$s</span>%2$s',
51 $address['line1'],
52 ( ! empty( $address['line2'] ) ? '<br>' : '' )
53 );
54 $address_html .= sprintf(
55 '<span data-address-type="line2">%1$s</span>%2$s',
56 $address['line2'],
57 ( ! empty( $address['city'] ) ? '<br>' : '' )
58 );
59 $address_html .= sprintf(
60 '<span data-address-type="city">%1$s</span><span data-address-type="state">%2$s</span><span data-address-type="zip">%3$s</span>%4$s',
61 $address['city'],
62 ( ! empty( $address['state'] ) ? ", {$address['state']}" : '' ),
63 ( ! empty( $address['zip'] ) ? " {$address['zip']}" : '' ),
64 ( ! empty( $address['country'] ) ? '<br>' : '' )
65 );
66 $address_html .= sprintf(
67 '<span data-address-type="country">%s</span><br>',
68 $address['country']
69 );
70
71 // Address action.
72 $address_html .= sprintf(
73 '<br><a href="#" class="js-edit">%1$s</a> | <a href="#" class="js-remove">%2$s</a>',
74 __( 'Edit', 'give' ),
75 __( 'Remove', 'give' )
76 );
77
78 /**
79 * Filter the address label
80 *
81 * @since 2.0
82 */
83 $address_label = apply_filters( "give_donor_{$address_args['type']}_address_label", ucfirst( $address_args['type'] ), $address_args );
84
85 // Set unique id and index for multi type address.
86 if ( isset( $address_args['index'] ) ) {
87 $address_label = "{$address_label} #{$address_args['index']}";
88 }
89
90 if ( isset( $address_args['id'] ) ) {
91 $address_id = "{$address_id}_{$address_args['id']}";
92 }
93
94 // Add address wrapper.
95 $address_html = sprintf(
96 '<div class="give-grid-col-4"><div data-address-id="%s" class="address"><span class="alignright address-number-label">%s</span>%s</div></div>',
97 $address_id,
98 $address_label,
99 $address_html
100 );
101
102 return $address_html;
103 }
104
105 /**
106 * Donors Page.
107 *
108 * Renders the donors page contents.
109 *
110 * @since 1.0
111 * @return void
112 */
113 function give_donors_page() {
114 $default_views = give_donor_views();
115 $requested_view = isset( $_GET['view'] ) ? sanitize_text_field( $_GET['view'] ) : 'donors';
116 if ( array_key_exists( $requested_view, $default_views ) && function_exists( $default_views[ $requested_view ] ) ) {
117 give_render_donor_view( $requested_view, $default_views );
118 } else {
119 give_donors_list();
120 }
121 }
122
123 /**
124 * Register the views for donor management.
125 *
126 * @since 1.0
127 * @return array Array of views and their callbacks.
128 */
129 function give_donor_views() {
130
131 $views = array();
132
133 return apply_filters( 'give_donor_views', $views );
134
135 }
136
137 /**
138 * Register the tabs for donor management.
139 *
140 * @since 1.0
141 * @return array Array of tabs for the donor.
142 */
143 function give_donor_tabs() {
144
145 $tabs = array();
146
147 return apply_filters( 'give_donor_tabs', $tabs );
148
149 }
150
151 /**
152 * List table of donors.
153 *
154 * @since 1.0
155 * @return void
156 */
157 function give_donors_list() {
158
159 include GIVE_PLUGIN_DIR . 'includes/admin/donors/class-donor-table.php';
160
161 $donors_table = new Give_Donor_List_Table();
162 $donors_table->prepare_items();
163 ?>
164 <div class="wrap">
165 <h1 class="wp-heading-inline"><?php echo get_admin_page_title(); ?></h1>
166 <?php
167 /**
168 * Fires in donors screen, above the table.
169 *
170 * @since 1.0
171 */
172 do_action( 'give_donors_table_top' );
173 ?>
174
175 <hr class="wp-header-end">
176 <form id="give-donors-filter" method="get" action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors' ); ?>">
177 <?php
178 $donors_table->advanced_filters();
179 $donors_table->display();
180 ?>
181 <input type="hidden" name="post_type" value="give_forms"/>
182 <input type="hidden" name="page" value="give-donors"/>
183 <input type="hidden" name="view" value="donors"/>
184 </form>
185 <?php
186 /**
187 * Fires in donors screen, below the table.
188 *
189 * @since 1.0
190 */
191 do_action( 'give_donors_table_bottom' );
192 ?>
193 </div>
194 <?php
195 }
196
197 /**
198 * Renders the donor view wrapper.
199 *
200 * @since 1.0
201 *
202 * @param string $view The View being requested.
203 * @param array $callbacks The Registered views and their callback functions.
204 *
205 * @return void
206 */
207 function give_render_donor_view( $view, $callbacks ) {
208
209 $render = true;
210
211 $donor_view_role = apply_filters( 'give_view_donors_role', 'view_give_reports' );
212
213 if ( ! current_user_can( $donor_view_role ) ) {
214 give_set_error( 'give-no-access', __( 'You are not permitted to view this data.', 'give' ) );
215 $render = false;
216 }
217
218 if ( ! isset( $_GET['id'] ) || ! is_numeric( $_GET['id'] ) ) {
219 give_set_error( 'give-invalid_donor', __( 'Invalid Donor ID.', 'give' ) );
220 $render = false;
221 }
222
223 $donor_id = (int) $_GET['id'];
224 $reconnect_user_id = ! empty( $_GET['user_id'] ) ? (int) $_GET['user_id'] : '';
225 $donor = new Give_Donor( $donor_id );
226
227 // Reconnect User with Donor profile.
228 if ( $reconnect_user_id ) {
229 give_connect_user_donor_profile( $donor, array( 'user_id' => $reconnect_user_id ), array() );
230 }
231
232 if ( empty( $donor->id ) ) {
233 give_set_error( 'give-invalid_donor', __( 'Invalid Donor ID.', 'give' ) );
234 $render = false;
235 }
236
237 $donor_tabs = give_donor_tabs();
238 ?>
239
240 <div class='wrap'>
241
242 <?php if ( give_get_errors() ) : ?>
243 <div class="error settings-error">
244 <?php Give()->notices->render_frontend_notices( 0 ); ?>
245 </div>
246 <?php endif; ?>
247
248 <h1 class="wp-heading-inline">
249 <?php
250 printf(
251 /* translators: %s: donor first name */
252 __( 'Edit Donor: %s %s', 'give' ),
253 $donor->get_first_name(),
254 $donor->get_last_name()
255 );
256 ?>
257 </h1>
258
259 <hr class="wp-header-end">
260
261 <?php if ( $donor && $render ) : ?>
262
263 <h2 class="nav-tab-wrapper">
264 <?php
265 foreach ( $donor_tabs as $key => $tab ) :
266 $active = $key === $view ? true : false;
267 $class = $active ? 'nav-tab nav-tab-active' : 'nav-tab';
268 printf(
269 '<a href="%1$s" class="%2$s"><span class="dashicons %3$s"></span>%4$s</a>' . "\n",
270 esc_url( admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=' . $key . '&id=' . $donor->id ) ),
271 esc_attr( $class ),
272 sanitize_html_class( $tab['dashicon'] ),
273 esc_html( $tab['title'] )
274 );
275 endforeach;
276 ?>
277 </h2>
278
279 <div id="give-donor-card-wrapper">
280 <?php $callbacks[ $view ]( $donor ) ?>
281 </div>
282
283 <?php endif; ?>
284
285 </div>
286 <?php
287
288 }
289
290
291 /**
292 * View a donor
293 *
294 * @since 1.0
295 *
296 * @param Give_Donor $donor The Donor object being displayed.
297 *
298 * @return void
299 */
300 function give_donor_view( $donor ) {
301
302 $donor_edit_role = apply_filters( 'give_edit_donors_role', 'edit_give_payments' );
303
304 /**
305 * Fires in donor profile screen, above the donor card.
306 *
307 * @since 1.0
308 *
309 * @param object $donor The donor object being displayed.
310 */
311 do_action( 'give_donor_card_top', $donor );
312
313 // Set Read only to the fields which needs to be locked.
314 $read_only = '';
315 if ( $donor->user_id ) {
316 $read_only = 'readonly="readonly"';
317 }
318
319 // List of title prefixes.
320 $title_prefixes = give_get_name_title_prefixes();
321
322 // Prepend title prefix to name if it is set.
323 $title_prefix = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
324 $donor_name_without_prefix = $donor->name;
325 $donor->name = give_get_donor_name_with_title_prefixes( $title_prefix, $donor->name );
326 ?>
327 <div id="donor-summary" class="info-wrapper donor-section postbox">
328 <form id="edit-donor-info" method="post"
329 action="<?php echo esc_url( admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor->id ) ); ?>">
330 <div class="donor-info">
331 <div class="donor-bio-header clearfix">
332 <div class="avatar-wrap left" id="donor-avatar">
333 <?php
334
335 // Check whether a Gravatar exists for a donor or not.
336 $validate_gravatar_image = give_validate_gravatar( $donor->email );
337
338 // Get donor's initials for non-gravatars
339 $donor_name_array = explode( " ", $donor_name_without_prefix );
340 $donor_name_args['firstname'] = ! empty( $donor_name_array[0] ) ? $donor_name_array[0] : '';
341 $donor_name_args['lastname'] = ! empty( $donor_name_array[1] ) ? $donor_name_array[1] : '';
342 $donor_name_initial = give_get_name_initial( $donor_name_args );
343
344 // Gravatars image for donor
345 if ( $validate_gravatar_image ) {
346 $donor_gravatar_image = get_avatar( $donor->email );
347 } else {
348 $donor_gravatar_image = '<div class="give-donor-admin-avatar">' . $donor_name_initial . '</div>';
349 }
350
351 echo $donor_gravatar_image;
352 ?>
353 </div>
354 <div id="donor-name-wrap" class="left">
355 <span class="donor-name info-item edit-item">
356 <select name="donor_info[title]">
357 <option disabled value="0"><?php esc_html_e( 'Title', 'give' ); ?></option>
358 <?php
359 if ( is_array( $title_prefixes ) && count( $title_prefixes ) > 0 ) {
360 foreach ( $title_prefixes as $title ) {
361 echo sprintf(
362 '<option %1$s value="%2$s">%2$s</option>',
363 selected( $title_prefix, $title, false ),
364 esc_html( $title )
365 );
366 }
367 }
368 ?>
369 </select>
370 <input <?php echo $read_only; ?> size="15" data-key="first_name"
371 name="donor_info[first_name]" type="text"
372 value="<?php echo esc_html( $donor->get_first_name() ); ?>"
373 placeholder="<?php esc_html_e( 'First Name', 'give' ); ?>"/>
374 <?php if ( $donor->user_id ) : ?>
375 <a href="#" class="give-lock-block">
376 <i class="give-icon give-icon-locked"></i>
377 </a>
378 <?php endif; ?>
379 <input <?php echo $read_only; ?> size="15" data-key="last_name"
380 name="donor_info[last_name]" type="text"
381 value="<?php echo esc_html( $donor->get_last_name() ); ?>"
382 placeholder="<?php esc_html_e( 'Last Name', 'give' ); ?>"/>
383 <?php if ( $donor->user_id ) : ?>
384 <a href="#" class="give-lock-block">
385 <i class="give-icon give-icon-locked"></i>
386 </a>
387 <?php endif; ?>
388 </span>
389 <span class="donor-name info-item editable">
390 <span data-key="name"><?php echo esc_html( $donor->name ); ?></span>
391 </span>
392 </div>
393 <p class="donor-since info-item">
394 <?php esc_html_e( 'Donor since', 'give' ); ?>
395 <?php echo date_i18n( give_date_format(), strtotime( $donor->date_created ) ) ?>
396 </p>
397 <?php if ( current_user_can( $donor_edit_role ) ) : ?>
398 <a href="#" id="edit-donor" class="button info-item editable donor-edit-link">
399 <?php esc_html_e( 'Edit Donor', 'give' ); ?>
400 </a>
401 <?php endif; ?>
402 </div>
403 <!-- /donor-bio-header -->
404
405 <div class="donor-main-wrapper">
406
407 <table class="widefat striped">
408 <tbody>
409 <tr>
410 <th scope="col"><label for="tablecell"><?php esc_html_e( 'Donor ID:', 'give' ); ?></label>
411 </th>
412 <td><?php echo intval( $donor->id ); ?></td>
413 </tr>
414 <tr>
415 <th scope="col"><label for="tablecell"><?php esc_html_e( 'User ID:', 'give' ); ?></label>
416 </th>
417 <td>
418 <span class="donor-user-id info-item edit-item">
419 <?php
420
421 $user_id = $donor->user_id > 0 ? $donor->user_id : '';
422
423 $data_atts = array(
424 'key' => 'user_login',
425 'search-type' => 'user',
426 );
427 $user_args = array(
428 'name' => 'donor_info[user_id]',
429 'class' => 'give-user-dropdown',
430 'data' => $data_atts,
431 );
432
433 if ( ! empty( $user_id ) ) {
434 $userdata = get_userdata( $user_id );
435 $user_args['selected'] = $user_id;
436 }
437
438 echo Give()->html->ajax_user_search( $user_args );
439 ?>
440 </span>
441
442 <span class="donor-user-id info-item editable">
443 <?php if ( ! empty( $userdata ) ) : ?>
444 <span
445 data-key="user_id">#<?php echo $donor->user_id . ' - ' . $userdata->display_name; ?></span>
446 <?php else : ?>
447 <span
448 data-key="user_id"><?php esc_html_e( 'Unregistered', 'give' ); ?></span>
449 <?php endif; ?>
450 <?php if ( current_user_can( $donor_edit_role ) && intval( $donor->user_id ) > 0 ) :
451
452 echo sprintf(
453 '- <span class="disconnect-user">
454 <a id="disconnect-donor" href="#disconnect" aria-label="%1$s">%2$s</a>
455 </span> |
456 <span class="view-user-profile">
457 <a id="view-user-profile" href="%3$s" aria-label="%4$s">%5$s</a>
458 </span>',
459 esc_html__( 'Disconnects the current user ID from this donor record.', 'give' ),
460 esc_html__( 'Disconnect User', 'give' ),
461 esc_url( 'user-edit.php?user_id=' . $donor->user_id ),
462 esc_html__( 'View User Profile of current user ID.', 'give' ),
463 esc_html__( 'View User Profile', 'give' )
464 );
465
466 endif; ?>
467 </span>
468 </td>
469 </tr>
470
471 <?php
472 $donor_company = $donor->get_meta( '_give_donor_company', true );
473 ?>
474 <tr class="alternate">
475 <th scope="col">
476 <label for="tablecell"><?php esc_html_e( 'Company Name:', 'give' ); ?></label>
477 </th>
478 <td>
479 <span class="donor-user-id info-item edit-item">
480 <input name="give_donor_company" value="<?php echo $donor_company ?>" type="text">
481 </span>
482
483 <span class="donor-user-id info-item editable">
484 <?php echo $donor_company; ?>
485 </span>
486 </td>
487 </tr>
488 </tbody>
489 </table>
490 </div>
491
492 </div>
493
494 <span id="donor-edit-actions" class="edit-item">
495 <input type="hidden" data-key="id" name="donor_info[id]" value="<?php echo intval( $donor->id ); ?>"/>
496 <?php wp_nonce_field( 'edit-donor', '_wpnonce', false, true ); ?>
497 <input type="hidden" name="give_action" value="edit-donor"/>
498 <input type="submit" id="give-edit-donor-save" class="button-secondary"
499 value="<?php esc_html_e( 'Update Donor', 'give' ); ?>"/>
500 <a id="give-edit-donor-cancel" href="" class="delete"><?php esc_html_e( 'Cancel', 'give' ); ?></a>
501 </span>
502
503 </form>
504
505 </div>
506
507 <?php
508 /**
509 * Fires in donor profile screen, above the stats list.
510 *
511 * @since 1.0
512 *
513 * @param Give_Donor $donor The donor object being displayed.
514 */
515 do_action( 'give_donor_before_stats', $donor );
516 ?>
517
518 <div id="donor-stats-wrapper" class="donor-section postbox clear">
519 <ul>
520 <li>
521 <a href="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&donor=' . absint( $donor->id ) ); ?>">
522 <span class="dashicons dashicons-heart"></span>
523 <?php
524 // Completed Donations.
525 $completed_donations_text = sprintf( _n( '%d Completed Donation', '%d Completed Donations', $donor->purchase_count, 'give' ), $donor->purchase_count );
526 echo apply_filters( 'give_donor_completed_donations', $completed_donations_text, $donor );
527 ?>
528 </a>
529 </li>
530 <li>
531 <span class="dashicons dashicons-chart-area"></span>
532 <?php echo give_currency_filter( give_format_amount( $donor->get_total_donation_amount(), array( 'sanitize' => false ) ) ); ?> <?php _e( 'Lifetime Donations', 'give' ); ?>
533 </li>
534 <?php
535 /**
536 * Fires in donor profile screen, in the stats list.
537 *
538 * Allows you to add more list items to the stats list.
539 *
540 * @since 1.0
541 *
542 * @param object $donor The donor object being displayed.
543 */
544 do_action( 'give_donor_stats_list', $donor );
545 ?>
546 </ul>
547 </div>
548
549 <?php
550 /**
551 * Fires in donor profile screen, above the address list.
552 *
553 * @since 1.8.14
554 *
555 * @param Give_Donor $donor The donor object being displayed.
556 */
557 do_action( 'give_donor_before_address', $donor );
558 ?>
559
560 <div id="donor-address-wrapper" class="donor-section clear">
561 <h3><?php _e( 'Addresses', 'give' ); ?></h3>
562
563 <div class="postbox">
564 <div class="give-spinner-wrapper">
565 <span class="give-spinner spinner aligncenter"></span>
566 </div>
567 <div class="inside">
568 <div class="all-address">
569 <div class="give-grid-row">
570 <?php
571 if ( ! empty( $donor->address ) ) :
572 // Default address always will be at zero array index.
573 $is_set_as_default = null;
574
575 foreach ( $donor->address as $address_type => $addresses ) {
576
577 switch ( true ) {
578 case is_array( end( $addresses ) ):
579 $index = 1;
580 foreach ( $addresses as $id => $address ) {
581 echo __give_get_format_address(
582 $address,
583 array(
584 'type' => $address_type,
585 'id' => $id,
586 'index' => $index,
587 )
588 );
589
590 $index ++;
591 }
592 break;
593
594 case is_string( end( $addresses ) ):
595 echo __give_get_format_address(
596 $addresses,
597 array(
598 'type' => $address_type,
599 )
600 );
601 break;
602 }
603 }
604 endif;
605 ?>
606 </div>
607 <span class="give-no-address-message<?php if ( ! empty( $donor->address ) ) {
608 echo ' give-hidden';
609 } ?>">
610 <?php _e( 'This donor does not have any addresses saved.', 'give' ); ?>
611 </span>
612 <button class="button add-new-address">
613 <?php _e( 'Add Address', 'give' ); ?>
614 </button>
615 </div>
616
617 <div class="address-form add-new-address-form-hidden">
618 <form action="" method="post">
619 <table class="widefat striped">
620 <tbody>
621 <tr>
622 <th class="col">
623 <label class="country"><?php esc_html_e( 'Country:', 'give' ); ?></label>
624 </th>
625 <td>
626 <?php
627 echo Give()->html->select( array(
628 'options' => give_get_country_list(),
629 'name' => 'country',
630 'selected' => give_get_option( 'base_country' ),
631 'show_option_all' => false,
632 'show_option_none' => false,
633 'chosen' => true,
634 'placeholder' => esc_attr__( 'Select a country', 'give' ),
635 'data' => array( 'search-type' => 'no_ajax' ),
636 'autocomplete' => 'country',
637 ) );
638 ?>
639 </td>
640 </tr>
641 <tr>
642 <th class="col">
643 <label for="line1"><?php esc_html_e( 'Address 1:', 'give' ); ?></label>
644 </th>
645 <td>
646 <input id="line1" name="line1" type="text" class="medium-text"/>
647 </td>
648 </tr>
649 <tr>
650 <th class="col">
651 <label for="line2"><?php esc_html_e( 'Address 2:', 'give' ); ?></label>
652 </th>
653 <td>
654 <input id="line2" type="text" name="line2" value="" class="medium-text"/>
655
656 </td>
657 </tr>
658 <tr>
659 <th class="col">
660 <label for="city"><?php esc_html_e( 'City:', 'give' ); ?></label>
661 </th>
662 <td>
663 <input id="city" type="text" name="city" value="" class="medium-text"/>
664 </td>
665 </tr>
666 <?php
667 $no_states_country = give_no_states_country_list();
668 $base_country = give_get_option( 'base_country' );
669 if ( ! array_key_exists( $base_country, $no_states_country ) ) {
670 ?>
671 <tr class="give-field-wrap">
672 <th class="col">
673 <label
674 for="state"><?php esc_html_e( 'State / Province / County:', 'give' ); ?></label>
675 </th>
676 <td>
677 <?php
678 $states = give_get_states( $base_country );
679 $state_args = array(
680 'name' => 'state',
681 'class' => 'regular-text',
682 'autocomplete' => 'address-level1',
683 );
684
685 if ( empty( $states ) ) {
686
687 // Show Text field, if empty states.
688 $state_args = wp_parse_args( $state_args, array(
689 'value' => give_get_option( 'base_state' ),
690 ) );
691 echo Give()->html->text( $state_args );
692 } else {
693
694 // Show Chosen DropDown, if states are not empty.
695 $state_args = wp_parse_args( $state_args, array(
696 'options' => $states,
697 'selected' => give_get_option( 'base_state' ),
698 'show_option_all' => false,
699 'show_option_none' => false,
700 'chosen' => true,
701 'placeholder' => __( 'Select a state', 'give' ),
702 'data' => array( 'search-type' => 'no_ajax' ),
703 ) );
704 echo Give()->html->select( $state_args );
705 }
706 ?>
707 </td>
708 </tr>
709 <?php
710 }
711 ?>
712 <tr>
713 <th class="col">
714 <label for="zip"><?php esc_html_e( 'Zip / Postal Code:', 'give' ); ?></label>
715 </th>
716 <td>
717 <input id="zip" type="text" name="zip" value="" class="medium-text"/>
718 </td>
719 </tr>
720 <tr>
721 <td colspan="2">
722 <?php wp_nonce_field( 'give-manage-donor-addresses', '_wpnonce', false ); ?>
723 <input type="hidden" name="address-action" value="add">
724 <input type="hidden" name="address-id" value="">
725 <input type="submit" class="button button-primary js-save"
726 value="<?php _e( 'Save', 'give' ); ?>">&nbsp;&nbsp;<button
727 class="button js-cancel"><?php _e( 'Cancel', 'give' ); ?></button>
728 </td>
729 </tr>
730 </tbody>
731 </table>
732 </form>
733 </div>
734 </div>
735 </div>
736 </div>
737
738 <?php
739 /**
740 * Fires in donor profile screen, above the tables wrapper.
741 *
742 * @since 1.0
743 *
744 * @param Give_Donor $donor The donor object being displayed.
745 */
746 do_action( 'give_donor_before_tables_wrapper', $donor );
747 ?>
748
749 <div id="donor-tables-wrapper" class="donor-section">
750
751 <?php
752 /**
753 * Fires in donor profile screen, above the tables.
754 *
755 * @since 1.0
756 *
757 * @param object $donor The donor object being displayed.
758 */
759 do_action( 'give_donor_before_tables', $donor );
760 ?>
761
762 <h3><?php _e( 'Donor Emails', 'give' ); ?></h3>
763
764 <table class="wp-list-table widefat striped emails">
765 <thead>
766 <tr>
767 <th><?php _e( 'Email', 'give' ); ?></th>
768 <th><?php _e( 'Actions', 'give' ); ?></th>
769 </tr>
770 </thead>
771
772 <tbody>
773 <?php if ( ! empty( $donor->emails ) ) { ?>
774
775 <?php foreach ( $donor->emails as $key => $email ) : ?>
776 <tr data-key="<?php echo $key; ?>">
777 <td>
778 <?php echo $email; ?>
779 <?php if ( 'primary' === $key ) : ?>
780 <span class="dashicons dashicons-star-filled primary-email-icon"></span>
781 <?php endif; ?>
782 </td>
783 <td>
784 <?php if ( 'primary' !== $key ) : ?>
785 <?php
786 $base_url = admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor->id );
787 $promote_url = wp_nonce_url( add_query_arg( array(
788 'email' => rawurlencode( $email ),
789 'give_action' => 'set_donor_primary_email',
790 ), $base_url ), 'give-set-donor-primary-email' );
791 $remove_url = wp_nonce_url( add_query_arg( array(
792 'email' => rawurlencode( $email ),
793 'give_action' => 'remove_donor_email',
794 ), $base_url ), 'give-remove-donor-email' );
795 ?>
796 <a href="<?php echo $promote_url; ?>"><?php _e( 'Make Primary', 'give' ); ?></a>
797 &nbsp;|&nbsp;
798 <a href="<?php echo $remove_url; ?>" class="delete"><?php _e( 'Remove', 'give' ); ?></a>
799 <?php endif; ?>
800 </td>
801 </tr>
802 <?php endforeach; ?>
803
804 <tr class="add-donor-email-row">
805 <td colspan="2" class="add-donor-email-td">
806 <div class="add-donor-email-wrapper">
807 <input type="hidden" name="donor-id" value="<?php echo $donor->id; ?>"/>
808 <?php wp_nonce_field( 'give_add_donor_email', 'add_email_nonce', false, true ); ?>
809 <input type="email" name="additional-email" value=""
810 placeholder="<?php _e( 'Email Address', 'give' ); ?>"/>&nbsp;
811 <input type="checkbox" name="make-additional-primary" value="1"
812 id="make-additional-primary"/>&nbsp;<label
813 for="make-additional-primary"><?php _e( 'Make Primary', 'give' ); ?></label>
814 <button class="button-secondary give-add-donor-email"
815 id="add-donor-email"><?php _e( 'Add Email', 'give' ); ?></button>
816 <span class="spinner"></span>
817 </div>
818 <div class="notice-wrap"></div>
819 </td>
820 </tr>
821 <?php } else { ?>
822 <tr>
823 <td colspan="2"><?php _e( 'No Emails Found', 'give' ); ?></td>
824 </tr>
825 <?php }// End if().
826 ?>
827 </tbody>
828 </table>
829
830 <h3><?php _e( 'Recent Donations', 'give' ); ?></h3>
831 <?php
832 $payment_ids = explode( ',', $donor->payment_ids );
833 $payments = give_get_payments( array(
834 'post__in' => $payment_ids,
835 ) );
836 $payments = array_slice( $payments, 0, 10 );
837 ?>
838 <table class="wp-list-table widefat striped payments">
839 <thead>
840 <tr>
841 <th scope="col"><?php _e( 'ID', 'give' ); ?></th>
842 <th scope="col"><?php _e( 'Amount', 'give' ); ?></th>
843 <th scope="col"><?php _e( 'Date', 'give' ); ?></th>
844 <th scope="col"><?php _e( 'Status', 'give' ); ?></th>
845 <th scope="col"><?php _e( 'Actions', 'give' ); ?></th>
846 </tr>
847 </thead>
848 <tbody>
849 <?php if ( ! empty( $payments ) ) { ?>
850 <?php foreach ( $payments as $payment ) : ?>
851 <tr>
852 <td><?php echo Give()->seq_donation_number->get_serial_code( $payment->ID ); ?></td>
853 <td><?php echo give_donation_amount( $payment->ID, array(
854 'currency' => true,
855 'amount' => true,
856 'type' => 'donor'
857 ) ); ?></td>
858 <td><?php echo date_i18n( give_date_format(), strtotime( $payment->post_date ) ); ?></td>
859 <td><?php echo give_get_payment_status( $payment, true ); ?></td>
860 <td>
861 <?php
862 printf(
863 '<a href="%1$s" aria-label="%2$s">%3$s</a>',
864 admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&view=view-payment-details&id=' . $payment->ID ),
865 sprintf(
866 /* translators: %s: Donation ID */
867 esc_attr__( 'View Donation %s.', 'give' ),
868 $payment->ID
869 ),
870 __( 'View Donation', 'give' )
871 );
872 ?>
873
874 <?php
875 /**
876 * Fires in donor profile screen, in the recent donations tables action links.
877 *
878 * Allows you to add more action links for each donation, after the 'View Donation' action link.
879 *
880 * @since 1.0
881 *
882 * @param object $donor The donor object being displayed.
883 * @param object $payment The payment object being displayed.
884 */
885 do_action( 'give_donor_recent_purchases_actions', $donor, $payment );
886 ?>
887 </td>
888 </tr>
889 <?php endforeach; ?>
890 <?php } else { ?>
891 <tr>
892 <td colspan="5"><?php _e( 'No donations found.', 'give' ); ?></td>
893 </tr>
894 <?php }// End if().
895 ?>
896 </tbody>
897 </table>
898
899 <h3><?php _e( 'Completed Forms', 'give' ); ?></h3>
900 <?php
901 $donations = give_get_users_completed_donations( $donor->email );
902 ?>
903 <table class="wp-list-table widefat striped donations">
904 <thead>
905 <tr>
906 <th scope="col"><?php _e( 'Form', 'give' ); ?></th>
907 <th scope="col" width="120px"><?php _e( 'Actions', 'give' ); ?></th>
908 </tr>
909 </thead>
910 <tbody>
911 <?php if ( ! empty( $donations ) ) { ?>
912 <?php foreach ( $donations as $donation ) : ?>
913 <tr>
914 <td><?php echo $donation->post_title; ?></td>
915 <td>
916 <?php
917 printf(
918 '<a href="%1$s" aria-label="%2$s">%3$s</a>',
919 esc_url( admin_url( 'post.php?action=edit&post=' . $donation->ID ) ),
920 sprintf(
921 /* translators: %s: form name */
922 esc_attr__( 'View Form %s.', 'give' ),
923 $donation->post_title
924 ),
925 __( 'View Form', 'give' )
926 );
927 ?>
928 </td>
929 </tr>
930 <?php endforeach; ?>
931 <?php } else { ?>
932 <tr>
933 <td colspan="2"><?php _e( 'No completed donations found.', 'give' ); ?></td>
934 </tr>
935 <?php } ?>
936 </tbody>
937 </table>
938 <?php
939 /**
940 * Fires in donor profile screen, below the tables.
941 *
942 * @since 1.0
943 *
944 * @param object $donor The donor object being displayed.
945 */
946 do_action( 'give_donor_after_tables', $donor );
947 ?>
948
949 </div>
950
951 <?php
952 /**
953 * Fires in donor profile screen, below the donor card.
954 *
955 * @since 1.0
956 *
957 * @param object $donor The donor object being displayed.
958 */
959 do_action( 'give_donor_card_bottom', $donor );
960
961 }
962
963 /**
964 * View the notes of a donor.
965 *
966 * @since 1.0
967 *
968 * @param Give_Donor $donor The donor object being displayed.
969 *
970 * @return void
971 */
972 function give_donor_notes_view( $donor ) {
973
974 $paged = isset( $_GET['paged'] ) && is_numeric( $_GET['paged'] ) ? $_GET['paged'] : 1;
975 $paged = absint( $paged );
976 $note_count = $donor->get_notes_count();
977 $per_page = apply_filters( 'give_donor_notes_per_page', 20 );
978 $total_pages = ceil( $note_count / $per_page );
979 $donor_notes = $donor->get_notes( $per_page, $paged );
980 ?>
981
982 <div id="donor-notes-wrapper">
983 <div class="donor-notes-header">
984 <?php echo get_avatar( $donor->email, 30 ); ?> <span><?php echo $donor->name; ?></span>
985 </div>
986 <h3><?php _e( 'Notes', 'give' ); ?></h3>
987
988 <?php if ( 1 == $paged ) : ?>
989 <div style="display: block; margin-bottom: 55px;">
990 <form id="give-add-donor-note" method="post"
991 action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=notes&id=' . $donor->id ); ?>">
992 <textarea id="donor-note" name="donor_note" class="donor-note-input" rows="10"></textarea>
993 <br/>
994 <input type="hidden" id="donor-id" name="customer_id" value="<?php echo $donor->id; ?>"/>
995 <input type="hidden" name="give_action" value="add-donor-note"/>
996 <?php wp_nonce_field( 'add-donor-note', 'add_donor_note_nonce', true, true ); ?>
997 <input id="add-donor-note" class="right button-primary" type="submit" value="Add Note"/>
998 </form>
999 </div>
1000 <?php endif; ?>
1001
1002 <?php
1003 $pagination_args = array(
1004 'base' => '%_%',
1005 'format' => '?paged=%#%',
1006 'total' => $total_pages,
1007 'current' => $paged,
1008 'show_all' => true,
1009 );
1010
1011 echo paginate_links( $pagination_args );
1012 ?>
1013
1014 <div id="give-donor-notes" class="postbox">
1015 <?php if ( count( $donor_notes ) > 0 ) { ?>
1016 <?php foreach ( $donor_notes as $key => $note ) : ?>
1017 <div class="donor-note-wrapper dashboard-comment-wrap comment-item">
1018 <span class="note-content-wrap">
1019 <?php echo stripslashes( $note ); ?>
1020 </span>
1021 </div>
1022 <?php endforeach; ?>
1023 <?php } else { ?>
1024 <div class="give-no-donor-notes">
1025 <?php _e( 'No donor notes found.', 'give' ); ?>
1026 </div>
1027 <?php } ?>
1028 </div>
1029
1030 <?php echo paginate_links( $pagination_args ); ?>
1031
1032 </div>
1033
1034 <?php
1035 }
1036
1037 /**
1038 * Thw donor delete view.
1039 *
1040 * @since 1.0
1041 *
1042 * @param object $donor The donor object being displayed.
1043 *
1044 * @return void
1045 */
1046 function give_donor_delete_view( $donor ) {
1047
1048 $donor_edit_role = apply_filters( 'give_edit_donors_role', 'edit_give_payments' );
1049
1050 /**
1051 * Fires in donor delete screen, above the content.
1052 *
1053 * @since 1.0
1054 *
1055 * @param object $donor The donor object being displayed.
1056 */
1057 do_action( 'give_donor_delete_top', $donor );
1058 ?>
1059
1060 <div class="info-wrapper donor-section">
1061
1062 <form id="delete-donor" method="post"
1063 action="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=delete&id=' . $donor->id ); ?>">
1064
1065 <div class="donor-notes-header">
1066 <?php echo get_avatar( $donor->email, 30 ); ?> <span><?php echo $donor->name; ?></span>
1067 </div>
1068
1069
1070 <div class="donor-info delete-donor">
1071
1072 <span class="delete-donor-options">
1073 <p>
1074 <?php echo Give()->html->checkbox( array(
1075 'name' => 'give-donor-delete-confirm',
1076 ) ); ?>
1077 <label
1078 for="give-donor-delete-confirm"><?php _e( 'Are you sure you want to delete this donor?', 'give' ); ?></label>
1079 </p>
1080
1081 <p>
1082 <?php echo Give()->html->checkbox( array(
1083 'name' => 'give-donor-delete-records',
1084 'options' => array(
1085 'disabled' => true,
1086 ),
1087 ) ); ?>
1088 <label
1089 for="give-donor-delete-records"><?php _e( 'Delete all associated donations and records?', 'give' ); ?></label>
1090 </p>
1091
1092 <?php
1093 /**
1094 * Fires in donor delete screen, bellow the delete inputs.
1095 *
1096 * Allows you to add custom delete inputs.
1097 *
1098 * @since 1.0
1099 *
1100 * @param object $donor The donor object being displayed.
1101 */
1102 do_action( 'give_donor_delete_inputs', $donor );
1103 ?>
1104 </span>
1105
1106 <span id="donor-edit-actions">
1107 <input type="hidden" name="donor_id" value="<?php echo $donor->id; ?>"/>
1108 <?php wp_nonce_field( 'give-delete-donor', '_wpnonce', false, true ); ?>
1109 <input type="hidden" name="give_action" value="delete_donor"/>
1110 <input type="submit" disabled="disabled" id="give-delete-donor" class="button-primary"
1111 value="<?php _e( 'Delete Donor', 'give' ); ?>"/>
1112 <a id="give-delete-donor-cancel"
1113 href="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor->id ); ?>"
1114 class="delete"><?php _e( 'Cancel', 'give' ); ?></a>
1115 </span>
1116
1117 </div>
1118
1119 </form>
1120 </div>
1121
1122 <?php
1123 /**
1124 * Fires in donor delete screen, bellow the content.
1125 *
1126 * @since 1.0
1127 *
1128 * @param object $donor The donor object being displayed.
1129 */
1130 do_action( 'give_donor_delete_bottom', $donor );
1131 }
1132