Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
07/03/2014 08:02:18 PM (11 years ago)
Author:
djpaul
Message:

at-mentions: overhaul the mentions implementation for Private Messages and Groups (admin) components.

Previously, these components had seperate implementations of username auto-suggestions, which weren't
reusable outside of where they'd been built, nor easily extended by developers, or other plugins.
This change creates a central API for auto-suggestions, currently only for usernames, but easily
extensible for other kinds of auto-suggestions in the future (i.e. group names, or #hashtags).

See #3278

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-groups/bp-groups-classes.php

    r8541 r8557  
    40774077    ' ), 11 );
    40784078}
     4079
     4080/**
     4081 * Adds support for user at-mentions (for users in a specific Group) to the Suggestions API.
     4082 *
     4083 * @since BuddyPress (2.1.0)
     4084 */
     4085class BP_Groups_Member_Suggestions extends BP_Members_Suggestions {
     4086
     4087    /**
     4088     * Default arguments for this suggestions service.
     4089     *
     4090     * @since BuddyPress (2.1.0)
     4091     * @var array $args {
     4092     *     @type int $group_id Positive integers will restrict the search to members in that group.
     4093     *           Negative integers will restrict the search to members in every other group.
     4094     *     @type int $limit Maximum number of results to display. Default: 16.
     4095     *     @type bool $only_friends If true, only match the current user's friends. Default: false.
     4096     *     @type string $term The suggestion service will try to find results that contain this string.
     4097     *           Mandatory.
     4098     * }
     4099     */
     4100    protected $default_args = array(
     4101        'group_id'     => 0,
     4102        'limit'        => 16,
     4103        'only_friends' => false,
     4104        'term'         => '',
     4105        'type'         => '',
     4106    );
     4107
     4108
     4109    /**
     4110     * Validate and sanitise the parameters for the suggestion service query.
     4111     *
     4112     * @return true|WP_Error If validation fails, return a WP_Error object. On success, return true (bool).
     4113     * @since BuddyPress (2.1.0)
     4114     */
     4115    public function validate() {
     4116        $this->args['group_id'] = (int) $this->args['group_id'];
     4117        $this->args             = apply_filters( 'bp_groups_member_suggestions_args', $this->args, $this );
     4118
     4119        // Check for invalid or missing mandatory parameters.
     4120        if ( ! $this->args['group_id'] || ! bp_is_active( 'groups' ) ) {
     4121            return new WP_Error( 'missing_requirement' );
     4122        }
     4123
     4124        // Check that the specified group_id exists, and that the current user can access it.
     4125        $the_group = groups_get_group( array(
     4126            'group_id'        => absint( $this->args['group_id'] ),
     4127            'populate_extras' => true,
     4128        ) );
     4129
     4130        if ( $the_group->id === 0 || ! $the_group->user_has_access ) {
     4131            return new WP_Error( 'access_denied' );
     4132        }
     4133
     4134        return apply_filters( 'bp_groups_member_suggestions_validate_args', parent::validate(), $this );
     4135    }
     4136
     4137    /**
     4138     * Find and return a list of username suggestions that match the query.
     4139     *
     4140     * @return array|WP_Error Array of results. If there were problems, returns a WP_Error object.
     4141     * @since BuddyPress (2.1.0)
     4142     */
     4143    public function get_suggestions() {
     4144        $user_query = array(
     4145            'count_total'     => '',  // Prevents total count
     4146            'populate_extras' => false,
     4147            'type'            => 'alphabetical',
     4148
     4149            'group_role'      => array( 'admin', 'member', 'mod' ),
     4150            'page'            => 1,
     4151            'per_page'        => $this->args['limit'],
     4152            'search_terms'    => $this->args['term'],
     4153        );
     4154
     4155        // Only return matches of friends of this user.
     4156        if ( $this->args['only_friends'] && is_user_logged_in() ) {
     4157            $user_query['user_id'] = get_current_user_id();
     4158        }
     4159
     4160        // Positive Group IDs will restrict the search to members in that group.
     4161        if ( $this->args['group_id'] > 0 ) {
     4162            $user_query['group_id'] = $this->args['group_id'];
     4163
     4164        // Negative Group IDs will restrict the search to members in every other group.
     4165        } else {
     4166            $group_query = array(
     4167                'count_total'     => '',  // Prevents total count
     4168                'populate_extras' => false,
     4169                'type'            => 'alphabetical',
     4170
     4171                'group_id'        => absint( $this->args['group_id'] ),
     4172                'group_role'      => array( 'admin', 'member', 'mod' ),
     4173                'page'            => 1,
     4174            );
     4175            $group_users = new BP_Group_Member_Query( $group_query );
     4176
     4177            if ( $group_users->results ) {
     4178                $user_query['exclude'] = wp_list_pluck( $group_users->results, 'ID' );
     4179            } else {
     4180                $user_query['include'] = array( 0 );
     4181            }
     4182        }
     4183
     4184        $user_query = apply_filters( 'bp_groups_member_suggestions_query_args', $user_query, $this );
     4185        if ( is_wp_error( $user_query ) ) {
     4186            return $user_query;
     4187        }
     4188
     4189
     4190        if ( isset( $user_query['group_id'] ) ) {
     4191            $user_query = new BP_Group_Member_Query( $user_query );
     4192        } else {
     4193            $user_query = new BP_User_Query( $user_query );
     4194        }
     4195
     4196        $results = array();
     4197        foreach ( $user_query->results as $user ) {
     4198            $result        = new stdClass();
     4199            $result->ID    = $user->user_nicename;
     4200            $result->image = bp_core_fetch_avatar( array( 'html' => false, 'item_id' => $user->ID ) );
     4201            $result->name  = bp_core_get_user_displayname( $user->ID );
     4202
     4203            $results[] = $result;
     4204        }
     4205
     4206        return apply_filters( 'bp_groups_member_suggestions_get_suggestions', $results, $this );
     4207    }
     4208}
Note: See TracChangeset for help on using the changeset viewer.