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