Skip to:
Content

BuddyPress.org

source: trunk/bp-themes/bp-default/_inc/ajax.php @ 4367

Last change on this file since 4367 was 4367, checked in by boonebgorges, 11 years ago

Reconfigures the way that new activity mentions are stored and incremented, so that counts more accurately reflect new and deleted activity items. Fixes #2082

  • Property svn:eol-style set to native
File size: 24.4 KB
Line 
1<?php
2/***
3 * AJAX Functions
4 *
5 * All of these functions enhance the responsiveness of the user interface in the default
6 * theme by adding AJAX functionality.
7 */
8
9/***
10 * This function looks scarier than it actually is. :)
11 * Each object loop (activity/members/groups/blogs/forums) contains default parameters to
12 * show specific information based on the page we are currently looking at.
13 * The following function will take into account any cookies set in the JS and allow us
14 * to override the parameters sent. That way we can change the results returned without reloading the page.
15 * By using cookies we can also make sure that user settings are retained across page loads.
16 */
17function bp_dtheme_ajax_querystring( $query_string, $object ) {
18        global $bp;
19
20        if ( empty( $object ) )
21                return false;
22
23        /* Set up the cookies passed on this AJAX request. Store a local var to avoid conflicts */
24        if ( !empty( $_POST['cookie'] ) )
25                $_BP_COOKIE = wp_parse_args( str_replace( '; ', '&', urldecode( $_POST['cookie'] ) ) );
26        else
27                $_BP_COOKIE = &$_COOKIE;
28
29        $qs = false;
30
31        /***
32         * Check if any cookie values are set. If there are then override the default params passed to the
33         * template loop
34         */
35        if ( !empty( $_BP_COOKIE['bp-' . $object . '-filter'] ) && '-1' != $_BP_COOKIE['bp-' . $object . '-filter'] ) {
36                $qs[] = 'type=' . $_BP_COOKIE['bp-' . $object . '-filter'];
37                $qs[] = 'action=' . $_BP_COOKIE['bp-' . $object . '-filter']; // Activity stream filtering on action
38        }
39
40        if ( !empty( $_BP_COOKIE['bp-' . $object . '-scope'] ) ) {
41                if ( 'personal' == $_BP_COOKIE['bp-' . $object . '-scope'] ) {
42                        $user_id = ( $bp->displayed_user->id ) ? $bp->displayed_user->id : $bp->loggedin_user->id;
43                        $qs[] = 'user_id=' . $user_id;
44                }
45                if ( 'all' != $_BP_COOKIE['bp-' . $object . '-scope'] && empty( $bp->displayed_user->id ) && !$bp->is_single_item )
46                        $qs[] = 'scope=' . $_BP_COOKIE['bp-' . $object . '-scope']; // Activity stream scope only on activity directory.
47        }
48
49        /* If page and search_terms have been passed via the AJAX post request, use those */
50        if ( !empty( $_POST['page'] ) && '-1' != $_POST['page'] )
51                $qs[] = 'page=' . $_POST['page'];
52
53        $object_search_text = bp_get_search_default_text( $object );
54        if ( !empty( $_POST['search_terms'] ) && $object_search_text != $_POST['search_terms'] && 'false' != $_POST['search_terms'] && 'undefined' != $_POST['search_terms'] )
55                $qs[] = 'search_terms=' . $_POST['search_terms'];
56
57        /* Now pass the querystring to override default values. */
58        $query_string = empty( $qs ) ? '' : join( '&', (array)$qs );
59
60        $object_filter = '';
61        if ( isset( $_BP_COOKIE['bp-' . $object . '-filter'] ) )
62                $object_filter = $_BP_COOKIE['bp-' . $object . '-filter'];
63
64        $object_scope = '';
65        if ( isset( $_BP_COOKIE['bp-' . $object . '-scope'] ) )
66                $object_scope = $_BP_COOKIE['bp-' . $object . '-scope'];
67
68        $object_page = '';
69        if ( isset( $_BP_COOKIE['bp-' . $object . '-page'] ) )
70                $object_page = $_BP_COOKIE['bp-' . $object . '-page'];
71
72        $object_search_terms = '';
73        if ( isset( $_BP_COOKIE['bp-' . $object . '-search-terms'] ) )
74                $object_search_terms = $_BP_COOKIE['bp-' . $object . '-search-terms'];
75
76        $object_extras = '';
77        if ( isset( $_BP_COOKIE['bp-' . $object . '-extras'] ) )
78                $object_extras = $_BP_COOKIE['bp-' . $object . '-extras'];
79
80        return apply_filters( 'bp_dtheme_ajax_querystring', $query_string, $object, $object_filter, $object_scope, $object_page, $object_search_terms, $object_extras );
81}
82add_filter( 'bp_ajax_querystring', 'bp_dtheme_ajax_querystring', 10, 2 );
83
84/* This function will simply load the template loop for the current object. On an AJAX request */
85function bp_dtheme_object_template_loader() {
86        $object = esc_attr( $_POST['object'] );
87        locate_template( array( "$object/$object-loop.php" ), true );
88}
89add_action( 'wp_ajax_members_filter', 'bp_dtheme_object_template_loader' );
90add_action( 'wp_ajax_groups_filter', 'bp_dtheme_object_template_loader' );
91add_action( 'wp_ajax_blogs_filter', 'bp_dtheme_object_template_loader' );
92add_action( 'wp_ajax_forums_filter', 'bp_dtheme_object_template_loader' );
93
94// This function will load the activity loop template when activity is requested via AJAX
95function bp_dtheme_activity_template_loader() {
96        global $bp;
97
98        $scope = '';
99        if ( !empty( $_POST['scope'] ) )
100                $scope = $_POST['scope'];
101
102        // We need to calculate and return the feed URL for each scope
103        switch ( $scope ) {
104                case 'friends':
105                        $feed_url = $bp->loggedin_user->domain . bp_get_activity_slug() . '/friends/feed/';
106                        break;
107                case 'groups':
108                        $feed_url = $bp->loggedin_user->domain . bp_get_activity_slug() . '/groups/feed/';
109                        break;
110                case 'favorites':
111                        $feed_url = $bp->loggedin_user->domain . bp_get_activity_slug() . '/favorites/feed/';
112                        break;
113                case 'mentions':
114                        $feed_url = $bp->loggedin_user->domain . bp_get_activity_slug() . '/mentions/feed/';
115                        bp_activity_clear_new_mentions( $bp->loggedin_user->id );
116                        break;
117                default:
118                        $feed_url = home_url( bp_get_activity_root_slug() . '/feed/' );
119                        break;
120        }
121
122        /* Buffer the loop in the template to a var for JS to spit out. */
123        ob_start();
124        locate_template( array( 'activity/activity-loop.php' ), true );
125        $result['contents'] = ob_get_contents();
126        $result['feed_url'] = apply_filters( 'bp_dtheme_activity_feed_url', $feed_url, $scope );
127        ob_end_clean();
128
129        echo json_encode( $result );
130}
131add_action( 'wp_ajax_activity_widget_filter', 'bp_dtheme_activity_template_loader' );
132add_action( 'wp_ajax_activity_get_older_updates', 'bp_dtheme_activity_template_loader' );
133
134/* AJAX update posting */
135function bp_dtheme_post_update() {
136        global $bp;
137
138        // Check the nonce
139        check_admin_referer( 'post_update', '_wpnonce_post_update' );
140
141        if ( !is_user_logged_in() ) {
142                echo '-1';
143                return false;
144        }
145
146        if ( empty( $_POST['content'] ) ) {
147                echo '-1<div id="message" class="error"><p>' . __( 'Please enter some content to post.', 'buddypress' ) . '</p></div>';
148                return false;
149        }
150
151        $activity_id = 0;
152        if ( empty( $_POST['object'] ) && bp_is_active( 'activity' ) ) {
153                $activity_id = bp_activity_post_update( array( 'content' => $_POST['content'] ) );
154
155        } elseif ( $_POST['object'] == 'groups' ) {
156                if ( !empty( $_POST['item_id'] ) && bp_is_active( 'groups' ) )
157                        $activity_id = groups_post_update( array( 'content' => $_POST['content'], 'group_id' => $_POST['item_id'] ) );
158
159        } else {
160                $activity_id = apply_filters( 'bp_activity_custom_update', $_POST['object'], $_POST['item_id'], $_POST['content'] );
161        }
162
163        if ( empty( $activity_id ) ) {
164                echo '-1<div id="message" class="error"><p>' . __( 'There was a problem posting your update, please try again.', 'buddypress' ) . '</p></div>';
165                return false;
166        }
167
168        if ( bp_has_activities ( 'include=' . $activity_id ) ) : ?>
169                <?php while ( bp_activities() ) : bp_the_activity(); ?>
170                        <?php locate_template( array( 'activity/entry.php' ), true ) ?>
171                <?php endwhile; ?>
172         <?php endif;
173}
174add_action( 'wp_ajax_post_update', 'bp_dtheme_post_update' );
175
176/* AJAX activity comment posting */
177function bp_dtheme_new_activity_comment() {
178        global $bp;
179
180        /* Check the nonce */
181        check_admin_referer( 'new_activity_comment', '_wpnonce_new_activity_comment' );
182
183        if ( !is_user_logged_in() ) {
184                echo '-1';
185                return false;
186        }
187
188        if ( empty( $_POST['content'] ) ) {
189                echo '-1<div id="message" class="error"><p>' . __( 'Please do not leave the comment area blank.', 'buddypress' ) . '</p></div>';
190                return false;
191        }
192
193        if ( empty( $_POST['form_id'] ) || empty( $_POST['comment_id'] ) || !is_numeric( $_POST['form_id'] ) || !is_numeric( $_POST['comment_id'] ) ) {
194                echo '-1<div id="message" class="error"><p>' . __( 'There was an error posting that reply, please try again.', 'buddypress' ) . '</p></div>';
195                return false;
196        }
197
198        $comment_id = bp_activity_new_comment( array(
199                'activity_id' => $_POST['form_id'],
200                'content' => $_POST['content'],
201                'parent_id' => $_POST['comment_id']
202        ));
203
204        if ( !$comment_id ) {
205                echo '-1<div id="message" class="error"><p>' . __( 'There was an error posting that reply, please try again.', 'buddypress' ) . '</p></div>';
206                return false;
207        }
208
209        if ( bp_has_activities ( 'display_comments=stream&include=' . $comment_id ) ) : ?>
210                <?php while ( bp_activities() ) : bp_the_activity(); ?>
211                        <li id="acomment-<?php bp_activity_id() ?>">
212                                <div class="acomment-avatar">
213                                        <a href="<?php echo bp_core_get_userlink( bp_get_activity_user_id(), false, true ); ?>"><?php bp_activity_avatar( array( 'height' => 30, 'width' => 30 ) ); ?></a>
214                                </div>
215
216                                <div class="acomment-meta">
217                                        <?php echo bp_core_get_userlink( bp_get_activity_user_id() ) ?> &middot; <?php printf( __( '%s ago', 'buddypress' ), bp_core_time_since( bp_core_current_time() ) ) ?>
218                                        <span class="acomment-replylink"> &middot; <a class="acomment-reply" href="#acomment-<?php bp_activity_id() ?>" id="acomment-reply-<?php echo esc_attr( $_POST['form_id'] ) ?>"><?php _e( 'Reply', 'buddypress' ) ?></a></span>
219                                         &middot; <a href="<?php echo wp_nonce_url( bp_get_root_domain() . '/' . $bp->activity->slug . '/delete/' . bp_get_activity_id() . '?cid=' . $comment_id, 'bp_activity_delete_link' ) ?>" class="delete acomment-delete confirm" rel="nofollow"><?php _e( 'Delete', 'buddypress' ) ?></a>
220                                </div>
221
222                                <div class="acomment-content">
223                                        <?php bp_activity_content_body() ?>
224                                </div>
225                        </li>
226                <?php endwhile; ?>
227         <?php endif;
228}
229add_action( 'wp_ajax_new_activity_comment', 'bp_dtheme_new_activity_comment' );
230
231/* AJAX delete an activity */
232function bp_dtheme_delete_activity() {
233        global $bp;
234
235        // Check the nonce
236        check_admin_referer( 'bp_activity_delete_link' );
237
238        if ( !is_user_logged_in() ) {
239                echo '-1';
240                return false;
241        }
242
243        if ( empty( $_POST['id'] ) || !is_numeric( $_POST['id'] ) )
244                return false;
245
246        $activity = new BP_Activity_Activity( (int) $_POST['id'] );
247
248        // Check access
249        if ( !is_super_admin() && ( $activity->user_id != bp_loggedin_user_id() ) )
250                return false;
251
252        // Call the action before the delete so plugins can still fetch information about it
253        do_action( 'bp_activity_before_action_delete_activity', $activity->id, $activity->user_id );
254
255        if ( !bp_activity_delete( array( 'id' => $activity->id, 'user_id' => $activity->user_id ) ) ) {
256                echo '-1<div id="message" class="error"><p>' . __( 'There was a problem when deleting. Please try again.', 'buddypress' ) . '</p></div>';
257                return false;
258        }
259
260        do_action( 'bp_activity_action_delete_activity', $activity->id, $activity->user_id );
261
262        return true;
263}
264add_action( 'wp_ajax_delete_activity', 'bp_dtheme_delete_activity' );
265
266/* AJAX delete an activity comment */
267function bp_dtheme_delete_activity_comment() {
268        global $bp;
269
270        /* Check the nonce */
271        check_admin_referer( 'bp_activity_delete_link' );
272
273        if ( !is_user_logged_in() ) {
274                echo '-1';
275                return false;
276        }
277
278        $comment = new BP_Activity_Activity( $_POST['id'] );
279
280        /* Check access */
281        if ( !is_super_admin() && $comment->user_id != $bp->loggedin_user->id )
282                return false;
283
284        if ( empty( $_POST['id'] ) || !is_numeric( $_POST['id'] ) )
285                return false;
286
287        /* Call the action before the delete so plugins can still fetch information about it */
288        do_action( 'bp_activity_before_action_delete_activity', $_POST['id'], $comment->user_id );
289
290        if ( !bp_activity_delete_comment( $comment->item_id, $comment->id ) ) {
291                echo '-1<div id="message" class="error"><p>' . __( 'There was a problem when deleting. Please try again.', 'buddypress' ) . '</p></div>';
292                return false;
293        }
294
295        do_action( 'bp_activity_action_delete_activity', $_POST['id'], $comment->user_id );
296
297        return true;
298}
299add_action( 'wp_ajax_delete_activity_comment', 'bp_dtheme_delete_activity_comment' );
300
301/* AJAX mark an activity as a favorite */
302function bp_dtheme_mark_activity_favorite() {
303        global $bp;
304
305        bp_activity_add_user_favorite( $_POST['id'] );
306        _e( 'Remove Favorite', 'buddypress' );
307}
308add_action( 'wp_ajax_activity_mark_fav', 'bp_dtheme_mark_activity_favorite' );
309
310/* AJAX mark an activity as not a favorite */
311function bp_dtheme_unmark_activity_favorite() {
312        global $bp;
313
314        bp_activity_remove_user_favorite( $_POST['id'] );
315        _e( 'Favorite', 'buddypress' );
316}
317add_action( 'wp_ajax_activity_mark_unfav', 'bp_dtheme_unmark_activity_favorite' );
318
319/**
320 * AJAX handler for Read More link on long activity items
321 *
322 * @package BuddyPress
323 * @since 1.3
324 */
325function bp_dtheme_get_single_activity_content() {
326        $activity_array = bp_activity_get_specific( array(
327                'activity_ids'          => $_POST['activity_id'],
328                'display_comments'      => 'stream'
329        ) );
330
331        $activity = !empty( $activity_array['activities'][0] ) ? $activity_array['activities'][0] : false;
332
333        if ( !$activity )
334                exit(); // todo: error?
335
336        // Activity content retrieved through AJAX should run through normal filters, but not be
337        // truncated
338        remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
339        $content = apply_filters( 'bp_get_activity_content_body', $activity->content );
340
341        echo $content;
342
343        exit();
344}
345add_action( 'wp_ajax_get_single_activity_content', 'bp_dtheme_get_single_activity_content' );
346
347/* AJAX invite a friend to a group functionality */
348function bp_dtheme_ajax_invite_user() {
349        global $bp;
350
351        check_ajax_referer( 'groups_invite_uninvite_user' );
352
353        if ( !$_POST['friend_id'] || !$_POST['friend_action'] || !$_POST['group_id'] )
354                return false;
355
356        if ( !groups_is_user_admin( $bp->loggedin_user->id, $_POST['group_id'] ) )
357                return false;
358
359        if ( !friends_check_friendship( $bp->loggedin_user->id, $_POST['friend_id'] ) )
360                return false;
361
362        if ( 'invite' == $_POST['friend_action'] ) {
363
364                if ( !groups_invite_user( array( 'user_id' => $_POST['friend_id'], 'group_id' => $_POST['group_id'] ) ) )
365                        return false;
366
367                $user = new BP_Core_User( $_POST['friend_id'] );
368
369                echo '<li id="uid-' . $user->id . '">';
370                echo $user->avatar_thumb;
371                echo '<h4>' . $user->user_link . '</h4>';
372                echo '<span class="activity">' . esc_attr( $user->last_active ) . '</span>';
373                echo '<div class="action">
374                                <a class="button remove" href="' . wp_nonce_url( $bp->loggedin_user->domain . $bp->groups->slug . '/' . $_POST['group_id'] . '/invites/remove/' . $user->id, 'groups_invite_uninvite_user' ) . '" id="uid-' . esc_attr( $user->id ) . '">' . __( 'Remove Invite', 'buddypress' ) . '</a>
375                          </div>';
376                echo '</li>';
377
378        } else if ( 'uninvite' == $_POST['friend_action'] ) {
379
380                if ( !groups_uninvite_user( $_POST['friend_id'], $_POST['group_id'] ) )
381                        return false;
382
383                return true;
384
385        } else {
386                return false;
387        }
388}
389add_action( 'wp_ajax_groups_invite_user', 'bp_dtheme_ajax_invite_user' );
390
391/* AJAX add/remove a user as a friend when clicking the button */
392function bp_dtheme_ajax_addremove_friend() {
393        global $bp;
394
395        if ( 'is_friend' == BP_Friends_Friendship::check_is_friend( $bp->loggedin_user->id, $_POST['fid'] ) ) {
396
397                check_ajax_referer('friends_remove_friend');
398
399                if ( !friends_remove_friend( $bp->loggedin_user->id, $_POST['fid'] ) ) {
400                        echo __("Friendship could not be canceled.", 'buddypress');
401                } else {
402                        echo '<a id="friend-' . $_POST['fid'] . '" class="add" rel="add" title="' . __( 'Add Friend', 'buddypress' ) . '" href="' . wp_nonce_url( $bp->loggedin_user->domain . $bp->friends->slug . '/add-friend/' . $_POST['fid'], 'friends_add_friend' ) . '">' . __( 'Add Friend', 'buddypress' ) . '</a>';
403                }
404
405        } else if ( 'not_friends' == BP_Friends_Friendship::check_is_friend( $bp->loggedin_user->id, $_POST['fid'] ) ) {
406
407                check_ajax_referer('friends_add_friend');
408
409                if ( !friends_add_friend( $bp->loggedin_user->id, $_POST['fid'] ) ) {
410                        echo __("Friendship could not be requested.", 'buddypress');
411                } else {
412                        echo '<a href="' . $bp->loggedin_user->domain . $bp->friends->slug . '/requests" class="requested">' . __( 'Friendship Requested', 'buddypress' ) . '</a>';
413                }
414        } else {
415                echo __( 'Request Pending', 'buddypress' );
416        }
417
418        return false;
419}
420add_action( 'wp_ajax_addremove_friend', 'bp_dtheme_ajax_addremove_friend' );
421
422/* AJAX accept a user as a friend when clicking the "accept" button */
423function bp_dtheme_ajax_accept_friendship() {
424        check_admin_referer( 'friends_accept_friendship' );
425
426        if ( !friends_accept_friendship( $_POST['id'] ) )
427                echo "-1<div id='message' class='error'><p>" . __( 'There was a problem accepting that request. Please try again.', 'buddypress' ) . '</p></div>';
428
429        return true;
430}
431add_action( 'wp_ajax_accept_friendship', 'bp_dtheme_ajax_accept_friendship' );
432
433/* AJAX reject a user as a friend when clicking the "reject" button */
434function bp_dtheme_ajax_reject_friendship() {
435        check_admin_referer( 'friends_reject_friendship' );
436
437        if ( !friends_reject_friendship( $_POST['id'] ) )
438                echo "-1<div id='message' class='error'><p>" . __( 'There was a problem rejecting that request. Please try again.', 'buddypress' ) . '</p></div>';
439
440        return true;
441}
442add_action( 'wp_ajax_reject_friendship', 'bp_dtheme_ajax_reject_friendship' );
443
444/* AJAX join or leave a group when clicking the "join/leave" button */
445function bp_dtheme_ajax_joinleave_group() {
446        global $bp;
447
448        if ( groups_is_user_banned( $bp->loggedin_user->id, $_POST['gid'] ) )
449                return false;
450
451        if ( !$group = new BP_Groups_Group( $_POST['gid'], false, false ) )
452                return false;
453
454        if ( !groups_is_user_member( $bp->loggedin_user->id, $group->id ) ) {
455
456                if ( 'public' == $group->status ) {
457
458                        check_ajax_referer( 'groups_join_group' );
459
460                        if ( !groups_join_group( $group->id ) ) {
461                                _e( 'Error joining group', 'buddypress' );
462                        } else {
463                                echo '<a id="group-' . esc_attr( $group->id ) . '" class="leave-group" rel="leave" title="' . __( 'Leave Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'leave-group', 'groups_leave_group' ) . '">' . __( 'Leave Group', 'buddypress' ) . '</a>';
464                        }
465
466                } else if ( 'private' == $group->status ) {
467
468                        check_ajax_referer( 'groups_request_membership' );
469
470                        if ( !groups_send_membership_request( $bp->loggedin_user->id, $group->id ) ) {
471                                _e( 'Error requesting membership', 'buddypress' );
472                        } else {
473                                echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
474                        }
475                }
476
477        } else {
478
479                check_ajax_referer( 'groups_leave_group' );
480
481                if ( !groups_leave_group( $group->id ) ) {
482                        _e( 'Error leaving group', 'buddypress' );
483                } else {
484                        if ( 'public' == $group->status ) {
485                                echo '<a id="group-' . esc_attr( $group->id ) . '" class="join-group" rel="join" title="' . __( 'Join Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'join', 'groups_join_group' ) . '">' . __( 'Join Group', 'buddypress' ) . '</a>';
486                        } else if ( 'private' == $group->status ) {
487                                echo '<a id="group-' . esc_attr( $group->id ) . '" class="request-membership" rel="join" title="' . __( 'Request Membership', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_send_membership_request' ) . '">' . __( 'Request Membership', 'buddypress' ) . '</a>';
488                        }
489                }
490        }
491}
492add_action( 'wp_ajax_joinleave_group', 'bp_dtheme_ajax_joinleave_group' );
493
494/* AJAX close and keep closed site wide notices from an admin in the sidebar */
495function bp_dtheme_ajax_close_notice() {
496        global $userdata;
497
498        if ( !isset( $_POST['notice_id'] ) ) {
499                echo "-1<div id='message' class='error'><p>" . __('There was a problem closing the notice.', 'buddypress') . '</p></div>';
500        } else {
501                $notice_ids = get_user_meta( $userdata->ID, 'closed_notices', true );
502
503                $notice_ids[] = (int) $_POST['notice_id'];
504
505                update_user_meta( $userdata->ID, 'closed_notices', $notice_ids );
506        }
507}
508add_action( 'wp_ajax_messages_close_notice', 'bp_dtheme_ajax_close_notice' );
509
510/* AJAX send a private message reply to a thread */
511function bp_dtheme_ajax_messages_send_reply() {
512        global $bp;
513
514        check_ajax_referer( 'messages_send_message' );
515
516        $result = messages_new_message( array( 'thread_id' => $_REQUEST['thread_id'], 'content' => $_REQUEST['content'] ) );
517
518        if ( $result ) { ?>
519                <div class="message-box new-message">
520                        <div class="message-metadata">
521                                <?php do_action( 'bp_before_message_meta' ) ?>
522                                <?php echo bp_loggedin_user_avatar( 'type=thumb&width=30&height=30' ); ?>
523
524                                <strong><a href="<?php echo $bp->loggedin_user->domain ?>"><?php echo $bp->loggedin_user->fullname ?></a> <span class="activity"><?php printf( __( 'Sent %s ago', 'buddypress' ), bp_core_time_since( bp_core_current_time() ) ) ?></span></strong>
525
526                                <?php do_action( 'bp_after_message_meta' ) ?>
527                        </div>
528
529                        <?php do_action( 'bp_before_message_content' ) ?>
530
531                        <div class="message-content">
532                                <?php echo stripslashes( apply_filters( 'bp_get_the_thread_message_content', $_REQUEST['content'] ) ) ?>
533                        </div>
534
535                        <?php do_action( 'bp_after_message_content' ) ?>
536
537                        <div class="clear"></div>
538                </div>
539        <?php
540        } else {
541                echo "-1<div id='message' class='error'><p>" . __( 'There was a problem sending that reply. Please try again.', 'buddypress' ) . '</p></div>';
542        }
543}
544add_action( 'wp_ajax_messages_send_reply', 'bp_dtheme_ajax_messages_send_reply' );
545
546/* AJAX mark a private message as unread in your inbox */
547function bp_dtheme_ajax_message_markunread() {
548        global $bp;
549
550        if ( !isset($_POST['thread_ids']) ) {
551                echo "-1<div id='message' class='error'><p>" . __('There was a problem marking messages as unread.', 'buddypress' ) . '</p></div>';
552        } else {
553                $thread_ids = explode( ',', $_POST['thread_ids'] );
554
555                for ( $i = 0; $i < count($thread_ids); $i++ ) {
556                        BP_Messages_Thread::mark_as_unread($thread_ids[$i]);
557                }
558        }
559}
560add_action( 'wp_ajax_messages_markunread', 'bp_dtheme_ajax_message_markunread' );
561
562/* AJAX mark a private message as read in your inbox */
563function bp_dtheme_ajax_message_markread() {
564        global $bp;
565
566        if ( !isset($_POST['thread_ids']) ) {
567                echo "-1<div id='message' class='error'><p>" . __('There was a problem marking messages as read.', 'buddypress' ) . '</p></div>';
568        } else {
569                $thread_ids = explode( ',', $_POST['thread_ids'] );
570
571                for ( $i = 0; $i < count($thread_ids); $i++ ) {
572                        BP_Messages_Thread::mark_as_read($thread_ids[$i]);
573                }
574        }
575}
576add_action( 'wp_ajax_messages_markread', 'bp_dtheme_ajax_message_markread' );
577
578/* AJAX delete a private message or array of messages in your inbox */
579function bp_dtheme_ajax_messages_delete() {
580        global $bp;
581
582        if ( !isset($_POST['thread_ids']) ) {
583                echo "-1<div id='message' class='error'><p>" . __( 'There was a problem deleting messages.', 'buddypress' ) . '</p></div>';
584        } else {
585                $thread_ids = explode( ',', $_POST['thread_ids'] );
586
587                for ( $i = 0; $i < count($thread_ids); $i++ )
588                        BP_Messages_Thread::delete($thread_ids[$i]);
589
590                _e('Messages deleted.', 'buddypress');
591        }
592}
593add_action( 'wp_ajax_messages_delete', 'bp_dtheme_ajax_messages_delete' );
594
595/**
596 * bp_dtheme_ajax_messages_autocomplete_results()
597 *
598 * AJAX handler for autocomplete. Displays friends only, unless BP_MESSAGES_AUTOCOMPLETE_ALL is defined
599 *
600 * @global object $bp The global BuddyPress settings variable created in bp_core_setup_globals()
601 * @return none
602 */
603function bp_dtheme_ajax_messages_autocomplete_results() {
604        global $bp;
605
606        // Include everyone in the autocomplete, or just friends?
607        if ( $bp->messages->slug == $bp->current_component )
608                $autocomplete_all = $bp->messages->autocomplete_all;
609
610        $friends  = false;
611        $pag_page = 1;
612
613        $limit = $_GET['limit'] ? $_GET['limit'] : apply_filters( 'bp_autocomplete_max_results', 10 );
614
615        // Get the user ids based on the search terms
616        if ( !empty( $autocomplete_all ) ) {
617                $users = BP_Core_User::search_users( $_GET['q'], $limit, $pag_page );
618
619                if ( !empty( $users['users'] ) ) {
620                        // Build an array with the correct format
621                        $user_ids = array();
622                        foreach( $users['users'] as $user ) {
623                                if ( $user->id != $bp->loggedin_user->id )
624                                        $user_ids[] = $user->id;
625                        }
626
627                        $user_ids = apply_filters( 'bp_core_autocomplete_ids', $user_ids, $_GET['q'], $limit );
628                }
629        } else {
630                if ( bp_is_active( 'friends' ) ) {
631                        $users = friends_search_friends( $_GET['q'], $bp->loggedin_user->id, $limit, 1 );
632
633                        // Keeping the bp_friends_autocomplete_list filter for backward compatibility
634                        $users = apply_filters( 'bp_friends_autocomplete_list', $users, $_GET['q'], $limit );
635
636                        if ( !empty( $users['friends'] ) )
637                                $user_ids = apply_filters( 'bp_friends_autocomplete_ids', $users['friends'], $_GET['q'], $limit );
638                }
639        }
640
641        if ( !empty( $user_ids ) ) {
642                foreach ( $user_ids as $user_id ) {
643                        $ud = get_userdata( $user_id );
644                        if ( !$ud )
645                                continue;
646
647                        if ( defined( 'BP_ENABLE_USERNAME_COMPATIBILITY_MODE' ) )
648                                $username = $ud->user_login;
649                        else
650                                $username = $ud->user_nicename;
651
652                        echo '<span id="link-' . $username . '" value="' . bp_core_get_user_domain( $user_id ) . '"></span>' . bp_core_fetch_avatar( array( 'item_id' => $user_id, 'type' => 'thumb', 'width' => 15, 'height' => 15 ) ) . ' &nbsp;' . bp_core_get_user_displayname( $user_id ) . ' (' . $username . ')
653                        ';
654                }
655        }
656}
657add_action( 'wp_ajax_messages_autocomplete_results', 'bp_dtheme_ajax_messages_autocomplete_results' );
658
659?>
Note: See TracBrowser for help on using the repository browser.