Skip to:
Content

BuddyPress.org

Ticket #921: 921.05.query.diff

File 921.05.query.diff, 8.8 KB (added by boonebgorges, 10 years ago)
  • bp-groups/bp-groups-classes.php

    diff --git bp-groups/bp-groups-classes.php bp-groups/bp-groups-classes.php
    index c540a49..ddad9b2 100644
    class BP_Group_Member_Query extends BP_User_Query { 
    14361436         */
    14371437        public function setup_hooks() {
    14381438                // Take this early opportunity to set the default 'type' param
    1439                 // to 'last_modified', which will ensure that BP_User_Query
     1439                // to 'last_joined', which will ensure that BP_User_Query
    14401440                // trusts our order and does not try to apply its own
    14411441                if ( empty( $this->query_vars_raw['type'] ) ) {
    1442                         $this->query_vars_raw['type'] = 'last_modified';
     1442                        $this->query_vars_raw['type'] = 'last_joined';
    14431443                }
    14441444
    14451445                // Set the sort order
    class BP_Group_Member_Query extends BP_User_Query { 
    14711471                        'group_id'     => 0,
    14721472                        'group_role'   => array( 'member' ),
    14731473                        'is_confirmed' => true,
     1474                        'type'         => 'last_joined',
    14741475                ) );
    14751476
    14761477                $group_member_ids = $this->get_group_member_ids();
    class BP_Group_Member_Query extends BP_User_Query { 
    15081509                        'where'   => array(),
    15091510                        'orderby' => '',
    15101511                        'order'   => '',
    1511                         'limit'   => '',
    15121512                );
    15131513
    15141514                /** WHERE clauses *****************************************************/
    class BP_Group_Member_Query extends BP_User_Query { 
    15711571
    15721572                $sql['where'] = ! empty( $sql['where'] ) ? 'WHERE ' . implode( ' AND ', $sql['where'] ) : '';
    15731573
    1574                 /** ORDER BY clause ***************************************************/
    1575 
    1576                 // @todo For now, mimicking legacy behavior of
    1577                 // bp_group_has_members(), which has us order by date_modified
    1578                 // only. Should abstract it in the future
     1574                // We fetch group members in order of last_joined, regardless
     1575                // of 'type'. If the 'type' value is not 'last_joined' or
     1576                // 'first_joined', the order will be overridden in
     1577                // BP_Group_Member_Query::set_orderby()
    15791578                $sql['orderby'] = "ORDER BY date_modified";
    1580                 $sql['order']   = "DESC";
     1579                $sql['order']   = 'first_joined' === $this->query_vars['type'] ? 'ASC' : 'DESC';
     1580
     1581                $this->group_member_ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']}" );
    15811582
    1582                 /** LIMIT clause ******************************************************/
    1583                 $this->group_member_ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']} {$sql['limit']}" );
     1583                /**
     1584                 * Use this filter to build a custom query (such as when you've
     1585                 * defined a custom 'type').
     1586                 */
     1587                $this->group_member_ids = apply_filters( 'bp_group_member_query_group_member_ids', $this->group_member_ids, $this );
    15841588
    15851589                return $this->group_member_ids;
    15861590        }
    class BP_Group_Member_Query extends BP_User_Query { 
    15881592        /**
    15891593         * Tell BP_User_Query to order by the order of our query results.
    15901594         *
    1591          * This implementation assumes the 'last_modified' sort order
    1592          * hardcoded in BP_Group_Member_Query::get_group_member_ids().
     1595         * We only override BP_User_Query's native ordering in case of the
     1596         * 'last_joined' and 'first_joined' $type parameters.
    15931597         *
    15941598         * @param BP_User_Query $query BP_User_Query object.
    15951599         */
    15961600        public function set_orderby( $query ) {
     1601
    15971602                $gm_ids = $this->get_group_member_ids();
     1603
    15981604                if ( empty( $gm_ids ) ) {
    15991605                        $gm_ids = array( 0 );
    16001606                }
    16011607
    1602                 // The first param in the FIELD() clause is the sort column id
    1603                 $gm_ids = array_merge( array( 'u.id' ), wp_parse_id_list( $gm_ids ) );
    1604                 $gm_ids_sql = implode( ',', $gm_ids );
     1608                // For 'last_joined' and 'first_joined' types, we force
     1609                // the order according to the query performed in
     1610                // BP_Group_Member_Query::get_group_members(). Otherwise, fall
     1611                // through and let BP_User_Query do its own ordering.
     1612                if ( in_array( $query->query_vars['type'], array( 'last_joined', 'first_joined' ) ) ) {
     1613
     1614                        // The first param in the FIELD() clause is the sort column id
     1615                        $gm_ids = array_merge( array( 'u.id' ), wp_parse_id_list( $gm_ids ) );
     1616                        $gm_ids_sql = implode( ',', $gm_ids );
    16051617
    1606                 $query->uid_clauses['orderby'] = "ORDER BY FIELD(" . $gm_ids_sql . ")";
     1618                        $query->uid_clauses['orderby'] = "ORDER BY FIELD(" . $gm_ids_sql . ")";
     1619                }
    16071620
    16081621                // Prevent this filter from running on future BP_User_Query
    16091622                // instances on the same page
  • bp-groups/bp-groups-functions.php

    diff --git bp-groups/bp-groups-functions.php bp-groups/bp-groups-functions.php
    index a27a499..d63f980 100644
    function groups_get_group_members( $args = array() ) { 
    422422                'exclude'             => false,
    423423                'group_role'          => array(),
    424424                'search_terms'        => false,
     425                'type'                => 'last_joined',
    425426        ) );
    426427
    427428        // For legacy users. Use of BP_Groups_Member::get_all_for_group()
    function groups_get_group_members( $args = array() ) { 
    455456                        'group_role'     => $r['group_role'],
    456457                        'exclude'        => $r['exclude'],
    457458                        'search_terms'   => $r['search_terms'],
    458                         'type'           => 'last_modified',
     459                        'type'           => $r['type'],
    459460                ) );
    460461
    461462                // Structure the return value as expected by the template functions
  • bp-groups/bp-groups-template.php

    diff --git bp-groups/bp-groups-template.php bp-groups/bp-groups-template.php
    index 675409e..6850194 100644
    class BP_Groups_Group_Members_Template { 
    19821982                        'exclude_banned'      => 1,
    19831983                        'group_role'          => false,
    19841984                        'search_terms'        => false,
     1985                        'type'                => 'last_joined',
    19851986                ) );
    19861987
    19871988                // @todo No
    class BP_Groups_Group_Members_Template { 
    20852086 *     @type bool|int True (or 1) to exclude banned users from results.
    20862087 *           Default: 1.
    20872088 *     @type array $group_role Optional. Array of group roles to include.
     2089 *     @type string $type Optional. Sort order of results. 'last_joined',
     2090 *           'first_joined', or any of the $type params available in
     2091 *           {@link BP_User_Query}. Default: 'last_joined'.
    20882092 *     @type string $search_terms Optional. Search terms to match.
    20892093 * }
    20902094 */
    function bp_group_has_members( $args = '' ) { 
    21012105                'exclude_banned'      => 1,
    21022106                'group_role'          => false,
    21032107                'search_terms'        => false,
     2108                'type'                => 'last_joined',
    21042109        ) );
    21052110
    21062111        if ( empty( $r['search_terms'] ) && ! empty( $_REQUEST['s'] ) )
  • tests/testcases/groups/class-bp-group-member-query.php

    diff --git tests/testcases/groups/class-bp-group-member-query.php tests/testcases/groups/class-bp-group-member-query.php
    index 46e44f9..b38943f 100644
    class BP_Tests_BP_Group_Member_Query_TestCases extends BP_UnitTestCase { 
    334334                $this->assertEquals( array( $u2 ), $ids );
    335335        }
    336336
     337        /**
     338         * @group type
     339         */
     340        public function test_get_with_type_last_joined() {
     341                $g = $this->factory->group->create();
     342                $u1 = $this->create_user();
     343                $u2 = $this->create_user();
     344                $time = time();
     345
     346                $this->add_user_to_group( $u1, $g, array(
     347                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 500 ),
     348                ) );
     349
     350                $this->add_user_to_group( $u2, $g, array(
     351                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ),
     352                ) );
     353
     354                $query_members = new BP_Group_Member_Query( array(
     355                        'group_id' => $g,
     356                        'type' => 'last_joined',
     357                ) );
     358
     359                $ids = wp_parse_id_list( array_keys( $query_members->results ) );
     360                $this->assertEquals( array( $u2, $u1 ), $ids );
     361        }
     362
     363        /**
     364         * @group type
     365         */
     366        public function test_get_with_type_first_joined() {
     367                $g = $this->factory->group->create();
     368                $u1 = $this->create_user();
     369                $u2 = $this->create_user();
     370                $time = time();
     371
     372                $this->add_user_to_group( $u1, $g, array(
     373                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 500 ),
     374                ) );
     375
     376                $this->add_user_to_group( $u2, $g, array(
     377                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ),
     378                ) );
     379
     380                $query_members = new BP_Group_Member_Query( array(
     381                        'group_id' => $g,
     382                        'type' => 'first_joined',
     383                ) );
     384
     385                $ids = wp_parse_id_list( array_keys( $query_members->results ) );
     386                $this->assertEquals( array( $u1, $u2 ), $ids );
     387        }
     388
     389        /**
     390         * @group type
     391         */
     392        public function test_get_with_type_alphabetical() {
     393                $g = $this->factory->group->create();
     394                $u1 = $this->create_user( array(
     395                        'display_name' => 'AAA',
     396                ) );
     397                $u2 = $this->create_user( array(
     398                        'display_name' => 'CCC',
     399                ) );
     400                $u3 = $this->create_user( array(
     401                        'display_name' => 'BBB',
     402                ) );
     403                $time = time();
     404
     405                $this->add_user_to_group( $u1, $g, array(
     406                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ),
     407                ) );
     408
     409                $this->add_user_to_group( $u2, $g, array(
     410                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ),
     411                ) );
     412
     413                $this->add_user_to_group( $u3, $g, array(
     414                        'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ),
     415                ) );
     416
     417                $query_members = new BP_Group_Member_Query( array(
     418                        'group_id' => $g,
     419                        'type' => 'alphabetical',
     420                ) );
     421
     422                $ids = wp_parse_id_list( array_keys( $query_members->results ) );
     423                $this->assertEquals( array( $u1, $u3, $u2 ), $ids );
     424        }
    337425}