Ticket #4482: 4482.2.patch
File 4482.2.patch, 25.4 KB (added by , 12 years ago) |
---|
-
bp-core/bp-core-classes.php
48 48 /** Variables *************************************************************/ 49 49 50 50 /** 51 * Unaltered params as passed to the constructor 52 * 53 * @since BuddyPress (1.8) 54 * @var array 55 */ 56 public $query_vars_raw = array(); 57 58 /** 51 59 * Array of variables to query with 52 60 * 53 61 * @since BuddyPress (1.7) … … 119 127 * @param string|array $query The query variables 120 128 */ 121 129 public function __construct( $query = null ) { 122 if ( ! empty( $query ) ) { 123 $this->query_vars = wp_parse_args( $query, array( 130 131 // Store the raw query vars for later access 132 $this->query_vars_raw = $query; 133 134 // Allow extending classes to register action/filter hooks 135 $this->setup_hooks(); 136 137 if ( ! empty( $this->query_vars_raw ) ) { 138 $this->query_vars = wp_parse_args( $this->query_vars_raw, array( 124 139 'type' => 'newest', 125 140 'per_page' => 0, 126 141 'page' => 1, … … 162 177 } 163 178 164 179 /** 180 * Allow extending classes to set up action/filter hooks 181 * 182 * When extending BP_User_Query, you may need to use some of its 183 * internal hooks to modify the output. It's not convenient to call 184 * add_action() or add_filter() in your class constructor, because 185 * BP_User_Query::__construct() contains a fair amount of logic that 186 * you may not want to override in your class. Define this method in 187 * your own class if you need a place where your extending class can 188 * add its hooks early in the query-building process. See 189 * BP_Group_Member_Query::setup_hooks() for an example. 190 * 191 * @since BuddyPress (1.8) 192 */ 193 public function setup_hooks() {} 194 195 /** 165 196 * Prepare the query for user_ids 166 197 * 167 198 * @since BuddyPress (1.7) … … 284 315 /** WHERE *************************************************************/ 285 316 286 317 // 'include' - User ids to include in the results 287 if ( false !== $include ) { 288 $include = wp_parse_id_list( $include ); 289 $include_ids = $wpdb->escape( implode( ',', (array) $include ) ); 318 $include = ! empty( $include ) ? wp_parse_id_list( $include ) : array(); 319 $include_ids = $this->get_include_ids( $include ); 320 if ( ! empty( $include_ids ) ) { 321 $include_ids = implode( ',', wp_parse_id_list( $include_ids ) ); 290 322 $sql['where'][] = "u.{$this->uid_name} IN ({$include_ids})"; 291 323 } 292 324 … … 430 462 } 431 463 432 464 /** 465 * Fetches the ids of users to put in the IN clause of the main query 466 * 467 * By default, returns the value passed to it 468 * ($this->query_vars['include']). Having this abstracted into a 469 * standalone method means that extending classes can override the 470 * logic, parsing together their own user_id limits with the 'include' 471 * ids passed to the class constructor. See BP_Group_Member_Query for 472 * an example. 473 * 474 * @since BuddyPress (1.8) 475 * @param array Sanitized array of user ids, as passed to the 'include' 476 * parameter of the class constructor 477 * @return array The list of users to which the main query should be 478 * limited 479 */ 480 public function get_include_ids( $include = array() ) { 481 return $include; 482 } 483 484 /** 433 485 * Perform a database query to populate any extra metadata we might need. 434 486 * Different components will hook into the 'bp_user_query_populate_extras' 435 487 * action to loop in the things they want. -
bp-groups/bp-groups-classes.php
947 947 } 948 948 } 949 949 950 /** 951 * Query for the members of a group 952 * 953 * @since BuddyPress (1.8) 954 */ 955 class BP_Group_Member_Query extends BP_User_Query { 956 /** 957 * Set up action hooks 958 * 959 * @since BuddyPress (1.8) 960 */ 961 public function setup_hooks() { 962 // Take this early opportunity to set the default 'type' param 963 // to 'last_modified', which will ensure that BP_User_Query 964 // trusts our order and does not try to apply its own 965 if ( empty( $this->query_vars_raw['type'] ) ) { 966 $this->query_vars_raw['type'] = 'last_modified'; 967 } 968 969 // Set up our populate_extras method 970 add_action( 'bp_user_query_populate_extras', array( $this, 'populate_group_member_extras' ), 10, 2 ); 971 } 972 973 /** 974 * Get a list of user_ids to include in the IN clause of the main query 975 * 976 * Overrides BP_User_Query::get_include_ids(), adding our additional 977 * group-member logic. 978 * 979 * @since BuddyPress (1.8) 980 * @param array 981 * @return array 982 */ 983 public function get_include_ids( $include ) { 984 // The following args are specific to group member queries, and 985 // are not present in the query_vars of a normal BP_User_Query. 986 // We loop through to make sure that defaults are set (though 987 // values passed to the constructor will, as usual, override 988 // these defaults). 989 $this->query_vars = wp_parse_args( $this->query_vars, array( 990 'group_id' => 0, 991 'group_role' => array( 'member' ), 992 'exclude_banned' => true, 993 ) ); 994 995 $group_member_ids = $this->get_group_member_ids(); 996 997 if ( ! empty( $include ) ) { 998 $group_member_ids = array_intersect( $include, $group_member_ids ); 999 } 1000 1001 return $group_member_ids; 1002 } 1003 1004 /** 1005 * Get the members of the queried group 1006 * 1007 * @since BuddyPress (1.8) 1008 * @return array $ids User IDs of relevant group member ids 1009 */ 1010 protected function get_group_member_ids() { 1011 global $wpdb; 1012 1013 $bp = buddypress(); 1014 $sql = array( 1015 'select' => "SELECT user_id FROM {$bp->groups->table_name_members}", 1016 'where' => array(), 1017 'orderby' => '', 1018 'order' => '', 1019 'limit' => '', 1020 ); 1021 1022 /** WHERE clauses *****************************************************/ 1023 1024 $sql['where'][] = $wpdb->prepare( "group_id = %d", $this->query_vars['group_id'] ); 1025 1026 // Role information is stored as follows: admins have 1027 // is_admin = 1, mods have is_mod = 1, and members have both 1028 // set to 0. 1029 $roles = !empty( $this->query_vars['group_role'] ) ? $this->query_vars['group_role'] : array(); 1030 if ( is_string( $roles ) ) { 1031 $roles = explode( ',', $roles ); 1032 } 1033 1034 // Sanitize: Only 'admin', 'mod', and 'member' are valid 1035 foreach ( $roles as $role_key => $role_value ) { 1036 if ( ! in_array( $role_value, array( 'admin', 'mod', 'member' ) ) ) { 1037 unset( $roles[ $role_key ] ); 1038 } 1039 } 1040 1041 // Remove dupes to make the count accurate, and flip for faster 1042 // isset() lookups 1043 $roles = array_flip( array_unique( $roles ) ); 1044 1045 switch ( count( $roles ) ) { 1046 1047 // All three roles means we don't limit results 1048 case 3 : 1049 default : 1050 $roles_sql = ''; 1051 break; 1052 1053 case 2 : 1054 1055 // member + mod = no admins 1056 // member + admin = no mods 1057 if ( isset( $roles['member'] ) ) { 1058 $roles_sql = isset( $roles['admin'] ) ? "is_mod = 0" : "is_admin = 0"; 1059 1060 // Two non-member roles must be 'admin' 1061 // and 'mod' 1062 } else { 1063 $roles_sql = "(is_admin = 1 OR is_mod = 1)"; 1064 } 1065 break; 1066 1067 case 1 : 1068 1069 // member only means no admins or mods 1070 if ( isset( $roles['member'] ) ) { 1071 $roles_sql = "is_admin = 0 AND is_mod = 0"; 1072 1073 // Filter by that role only 1074 } else { 1075 $roles_sql = isset( $roles['admin'] ) ? "is_admin = 1" : "is_mod = 1"; 1076 } 1077 break; 1078 1079 // No roles means no users should be returned 1080 case 0 : 1081 $roles_sql = $this->no_results['where']; 1082 break; 1083 } 1084 1085 if ( ! empty( $roles_sql ) ) { 1086 $sql['where'][] = $roles_sql; 1087 } 1088 1089 if ( ! empty( $this->query_vars['exclude_banned'] ) ) { 1090 $sql['where'][] = "is_banned = 0"; 1091 } 1092 1093 $sql['where'] = ! empty( $sql['where'] ) ? 'WHERE ' . implode( ' AND ', $sql['where'] ) : ''; 1094 1095 /** ORDER BY clause ***************************************************/ 1096 1097 // @todo For now, mimicking legacy behavior of 1098 // bp_group_has_members(), which has us order by date_modified 1099 // only. Should abstract it in the future 1100 $sql['orderby'] = "ORDER BY date_modified"; 1101 $sql['order'] = "DESC"; 1102 1103 /** LIMIT clause ******************************************************/ 1104 1105 // Technically, this is also handled by BP_User_Query, but 1106 // repeating the limit here helps to make the query more 1107 // efficient, by not fetching every single matching user 1108 if ( ! empty( $this->query_vars['per_page'] ) && ! empty( $this->query_vars['page'] ) ) { 1109 $sql['limit'] = $wpdb->prepare( "LIMIT %d, %d", absint( ( $this->query_vars['page'] - 1 ) * $this->query_vars['per_page'] ), absint( $this->query_vars['per_page'] ) ); 1110 } 1111 1112 $ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']} {$sql['limit']}" ); 1113 1114 return $ids; 1115 } 1116 1117 /** 1118 * Fetch additional data required in bp_group_has_members() loops 1119 * 1120 * @since BuddyPress (1.8) 1121 * @param object $query BP_User_Query object. Because we're filtering 1122 * the current object, we use $this inside of the method instead 1123 * @param string $user_ids_sql Sanitized, comma-separated string of 1124 * the user ids returned by the main query 1125 */ 1126 public function populate_group_member_extras( $query, $user_ids_sql ) { 1127 global $wpdb; 1128 1129 $bp = buddypress(); 1130 $extras = $wpdb->get_results( $wpdb->prepare( "SELECT user_id, date_modified, is_banned FROM {$bp->groups->table_name_members} WHERE user_id IN ({$user_ids_sql}) AND group_id = %d", $this->query_vars['group_id'] ) ); 1131 1132 foreach ( (array) $extras as $extra ) { 1133 if ( isset( $this->results[ $extra->user_id ] ) ) { 1134 // user_id is provided for backward compatibility 1135 $this->results[ $extra->user_id ]->user_id = (int) $extra->user_id; 1136 $this->results[ $extra->user_id ]->is_banned = (int) $extra->is_banned; 1137 $this->results[ $extra->user_id ]->date_modified = $extra->date_modified; 1138 } 1139 } 1140 1141 // Don't filter other BP_User_Query objects on the same page 1142 remove_action( 'bp_user_query_populate_extras', array( $this, 'populate_group_member_extras' ), 10, 2 ); 1143 } 1144 } 1145 950 1146 class BP_Groups_Member { 951 1147 var $id; 952 1148 var $group_id; … … 1399 1595 function get_all_for_group( $group_id, $limit = false, $page = false, $exclude_admins_mods = true, $exclude_banned = true, $exclude = false ) { 1400 1596 global $bp, $wpdb; 1401 1597 1598 _deprecated_function( __METHOD__, '1.8', 'BP_Group_Member_Query' ); 1599 1402 1600 $pag_sql = ''; 1403 1601 if ( !empty( $limit ) && !empty( $page ) ) 1404 1602 $pag_sql = $wpdb->prepare( "LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ); -
bp-groups/bp-groups-functions.php
382 382 /** 383 383 * Fetch the members of a group 384 384 * 385 * Procedural wrapper for BP_Groups_Member::get_all_for_group(). 385 * Since BuddyPress 1.8, a procedural wrapper for BP_Group_Member_Query. 386 * Previously called BP_Groups_Member::get_all_for_group(). 386 387 * 388 * To use the legacy query, filter 'bp_use_legacy_group_member_query', 389 * returning true. 390 * 387 391 * @param int $group_id 388 392 * @param int $limit Maximum members to return 389 393 * @param int $page The page of results to return (requires $limit) … … 392 396 * @param array|string $exclude Array or comma-sep list of users to exclude 393 397 * @return array Multi-d array of 'members' list and 'count' 394 398 */ 395 function groups_get_group_members( $group_id, $limit = false, $page = false, $exclude_admins_mods = true, $exclude_banned = true, $exclude = false ) { 396 return BP_Groups_Member::get_all_for_group( $group_id, $limit, $page, $exclude_admins_mods, $exclude_banned, $exclude ); 399 function groups_get_group_members( $group_id, $limit = false, $page = false, $exclude_admins_mods = true, $exclude_banned = true, $exclude = false, $group_role = false ) { 400 401 // For legacy users. Use of BP_Groups_Member::get_all_for_group() 402 // is deprecated. 403 if ( apply_filters( 'bp_use_legacy_group_member_query', false, __FUNCTION__, func_get_args() ) ) { 404 $retval = BP_Groups_Member::get_all_for_group( $group_id, $limit, $page, $exclude_admins_mods, $exclude_banned, $exclude ); 405 } else { 406 407 // exclude_admins_mods is a legacy argument. Convert to group_role 408 if ( empty( $group_role ) ) { 409 $group_role = $exclude_admins_mods ? array( 'member' ) : array( 'member', 'mod', 'admin' ); 410 } 411 412 // Perform the group member query (extends BP_User_Query) 413 $members = new BP_Group_Member_Query( array( 414 'group_id' => $group_id, 415 'per_page' => $limit, 416 'page' => $page, 417 'group_role' => $group_role, 418 'exclude_banned' => $exclude_banned, 419 'exclude' => $exclude, 420 'type' => 'last_modified', 421 ) ); 422 423 // Structure the return value as expected by the template functions 424 $retval = array( 425 'members' => array_values( $members->results ), 426 'count' => $members->total_users 427 ); 428 } 429 430 return $retval; 397 431 } 398 432 399 433 function groups_get_total_member_count( $group_id ) { -
bp-groups/bp-groups-template.php
1897 1897 var $pag_links; 1898 1898 var $total_group_count; 1899 1899 1900 function __construct( $group_id, $per_page, $max, $exclude_admins_mods, $exclude_banned, $exclude ) {1900 function __construct( $group_id, $per_page, $max, $exclude_admins_mods, $exclude_banned, $exclude, $group_role = false ) { 1901 1901 1902 1902 $this->pag_page = isset( $_REQUEST['mlpage'] ) ? intval( $_REQUEST['mlpage'] ) : 1; 1903 1903 $this->pag_num = isset( $_REQUEST['num'] ) ? intval( $_REQUEST['num'] ) : $per_page; 1904 $this->members = BP_Groups_Member::get_all_for_group( $group_id, $this->pag_num, $this->pag_page, $exclude_admins_mods, $exclude_banned, $exclude );1904 $this->members = groups_get_group_members( $group_id, $this->pag_num, $this->pag_page, $exclude_admins_mods, $exclude_banned, $exclude, $group_role ); 1905 1905 1906 1906 if ( !$max || $max >= (int) $this->members['count'] ) 1907 1907 $this->total_member_count = (int) $this->members['count']; … … 1983 1983 'max' => false, 1984 1984 'exclude' => false, 1985 1985 'exclude_admins_mods' => 1, 1986 'exclude_banned' => 1 1986 'exclude_banned' => 1, 1987 'group_role' => false, 1987 1988 ) ); 1988 1989 1989 $members_template = new BP_Groups_Group_Members_Template( $r['group_id'], $r['per_page'], $r['max'], (int) $r['exclude_admins_mods'], (int) $r['exclude_banned'], $r['exclude'] );1990 $members_template = new BP_Groups_Group_Members_Template( $r['group_id'], $r['per_page'], $r['max'], (int) $r['exclude_admins_mods'], (int) $r['exclude_banned'], $r['exclude'], $r['group_role'] ); 1990 1991 return apply_filters( 'bp_group_has_members', $members_template->has_members(), $members_template ); 1991 1992 } 1992 1993 -
tests/includes/testcase.php
223 223 return $user_id; 224 224 } 225 225 226 public static function add_user_to_group( $user_id, $group_id ) { 226 public static function add_user_to_group( $user_id, $group_id, $args = array() ) { 227 $r = wp_parse_args( $args, array( 228 'date_modified' => bp_core_current_time(), 229 ) ); 230 227 231 $new_member = new BP_Groups_Member; 228 232 $new_member->group_id = $group_id; 229 233 $new_member->user_id = $user_id; 230 234 $new_member->inviter_id = 0; 231 235 $new_member->is_admin = 0; 232 236 $new_member->user_title = ''; 233 $new_member->date_modified = bp_core_current_time();237 $new_member->date_modified = $r['date_modified']; 234 238 $new_member->is_confirmed = 1; 235 239 236 240 $new_member->save(); -
tests/testcases/groups/class-bp-group-member-query.php
1 <?php 2 /** 3 * @group groups 4 * @group BP_Group_Member_Query 5 */ 6 class BP_Tests_BP_Group_Member_Query_TestCases extends BP_UnitTestCase { 7 /** 8 * Make sure that a manual 'include' param is parsed correctly with 9 * BP_Group_Member_Query's limiting of the query to group members 10 */ 11 public function test_with_include() { 12 $g = $this->factory->group->create(); 13 $u1 = $this->create_user(); 14 $u2 = $this->create_user(); 15 $u3 = $this->create_user(); 16 17 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 18 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 19 20 $query = new BP_Group_Member_Query( array( 21 'group_id' => $g, 22 'include' => array( $u2 ), 23 ) ); 24 25 $ids = wp_parse_id_list( array_keys( $query->results ) ); 26 $this->assertEquals( array( $u2, ), $ids ); 27 } 28 29 // Make sure we're falling back on 'member' 30 public function test_with_group_role_null() { 31 $g = $this->factory->group->create(); 32 $u1 = $this->create_user(); 33 $u2 = $this->create_user(); 34 $u3 = $this->create_user(); 35 36 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 37 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 38 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 39 40 $m1 = new BP_Groups_Member( $u1, $g ); 41 $m1->promote( 'admin' ); 42 $m2 = new BP_Groups_Member( $u2, $g ); 43 $m2->promote( 'mod' ); 44 45 $query = new BP_Group_Member_Query( array( 46 'group_id' => $g, 47 ) ); 48 49 $expected = new BP_Group_Member_Query( array( 50 'group_id' => $g, 51 'group_role' => array( 'member' ), 52 ) ); 53 54 $this->assertEquals( $expected->results, $query->results ); 55 } 56 57 public function test_with_group_role_member() { 58 $g = $this->factory->group->create(); 59 $u1 = $this->create_user(); 60 $u2 = $this->create_user(); 61 $u3 = $this->create_user(); 62 63 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 64 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 65 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 66 67 $m1 = new BP_Groups_Member( $u1, $g ); 68 $m1->promote( 'admin' ); 69 $m2 = new BP_Groups_Member( $u2, $g ); 70 $m2->promote( 'mod' ); 71 72 $query_members = new BP_Group_Member_Query( array( 73 'group_id' => $g, 74 'group_role' => array( 'member' ), 75 ) ); 76 77 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 78 $this->assertEquals( array( $u3, ), $ids ); 79 } 80 81 public function test_with_group_role_mod() { 82 $g = $this->factory->group->create(); 83 $u1 = $this->create_user(); 84 $u2 = $this->create_user(); 85 $u3 = $this->create_user(); 86 87 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 88 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 89 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 90 91 $m1 = new BP_Groups_Member( $u1, $g ); 92 $m1->promote( 'admin' ); 93 $m2 = new BP_Groups_Member( $u2, $g ); 94 $m2->promote( 'mod' ); 95 96 $query_members = new BP_Group_Member_Query( array( 97 'group_id' => $g, 98 'group_role' => array( 'mod' ), 99 ) ); 100 101 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 102 $this->assertEquals( array( $u2, ), $ids ); 103 } 104 105 public function test_with_group_role_admin() { 106 $g = $this->factory->group->create(); 107 $u1 = $this->create_user(); 108 $u2 = $this->create_user(); 109 $u3 = $this->create_user(); 110 111 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 112 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 113 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 114 115 $m1 = new BP_Groups_Member( $u1, $g ); 116 $m1->promote( 'admin' ); 117 $m2 = new BP_Groups_Member( $u2, $g ); 118 $m2->promote( 'mod' ); 119 120 $query_members = new BP_Group_Member_Query( array( 121 'group_id' => $g, 122 'group_role' => array( 'admin' ), 123 ) ); 124 125 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 126 $this->assertEquals( array( $u1, ), $ids ); 127 } 128 129 public function test_with_group_role_member_mod() { 130 $g = $this->factory->group->create(); 131 $u1 = $this->create_user(); 132 $u2 = $this->create_user(); 133 $u3 = $this->create_user(); 134 135 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 136 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 137 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 138 139 $m1 = new BP_Groups_Member( $u1, $g ); 140 $m1->promote( 'admin' ); 141 $m2 = new BP_Groups_Member( $u2, $g ); 142 $m2->promote( 'mod' ); 143 144 $query_members = new BP_Group_Member_Query( array( 145 'group_id' => $g, 146 'group_role' => array( 'member', 'mod' ), 147 ) ); 148 149 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 150 $this->assertEquals( array( $u2, $u3, ), $ids ); 151 } 152 153 public function test_with_group_role_member_admin() { 154 $g = $this->factory->group->create(); 155 $u1 = $this->create_user(); 156 $u2 = $this->create_user(); 157 $u3 = $this->create_user(); 158 159 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 160 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 161 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 162 163 $m1 = new BP_Groups_Member( $u1, $g ); 164 $m1->promote( 'admin' ); 165 $m2 = new BP_Groups_Member( $u2, $g ); 166 $m2->promote( 'mod' ); 167 168 $query_members = new BP_Group_Member_Query( array( 169 'group_id' => $g, 170 'group_role' => array( 'member', 'admin' ), 171 ) ); 172 173 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 174 $this->assertEquals( array( $u1, $u3, ), $ids ); 175 } 176 177 public function test_with_group_role_mod_admin() { 178 $g = $this->factory->group->create(); 179 $u1 = $this->create_user(); 180 $u2 = $this->create_user(); 181 $u3 = $this->create_user(); 182 183 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 184 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 185 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 186 187 $m1 = new BP_Groups_Member( $u1, $g ); 188 $m1->promote( 'admin' ); 189 $m2 = new BP_Groups_Member( $u2, $g ); 190 $m2->promote( 'mod' ); 191 192 $query_members = new BP_Group_Member_Query( array( 193 'group_id' => $g, 194 'group_role' => array( 'mod', 'admin' ), 195 ) ); 196 197 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 198 $this->assertEquals( array( $u1, $u2, ), $ids ); 199 } 200 201 public function test_with_group_role_member_mod_admin() { 202 $g = $this->factory->group->create(); 203 $u1 = $this->create_user(); 204 $u2 = $this->create_user(); 205 $u3 = $this->create_user(); 206 207 $this->add_user_to_group( $u1, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 100 ) ) ); 208 $this->add_user_to_group( $u2, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 200 ) ) ); 209 $this->add_user_to_group( $u3, $g, array( 'date_modified' => gmdate( 'Y-m-d H:i:s', $time - 300 ) ) ); 210 211 $m1 = new BP_Groups_Member( $u1, $g ); 212 $m1->promote( 'admin' ); 213 $m2 = new BP_Groups_Member( $u2, $g ); 214 $m2->promote( 'mod' ); 215 216 $query_members = new BP_Group_Member_Query( array( 217 'group_id' => $g, 218 'group_role' => array( 'member', 'mod', 'admin' ), 219 ) ); 220 221 $ids = wp_parse_id_list( array_keys( $query_members->results ) ); 222 $this->assertEquals( array( $u1, $u2, $u3, ), $ids ); 223 } 224 225 226 } -
tests/testcases/groups/template.php
118 118 } 119 119 120 120 /** 121 * Switching from BP_Groups_Member to BP_Group_Member_Query meant a 122 * change in the format of the values returned from the query. For 123 * backward compatibility, we translate some of the return values 124 * of BP_Group_Member_Query to the older format. This test makes sure 125 * that the translation happens properly. 126 * 121 127 * @group bp_group_has_members 122 128 */ 129 public function test_bp_group_has_members_backpat_retval_format() { 130 $g = $this->factory->group->create(); 131 $u1 = $this->create_user(); 132 $u2 = $this->create_user(); 133 134 $date_modified = gmdate( 'Y-m-d H:i:s', time() - 100 ); 135 136 $new_member = new BP_Groups_Member; 137 $new_member->group_id = $g; 138 $new_member->user_id = $u1; 139 $new_member->inviter_id = $u2; 140 $new_member->is_admin = 0; 141 $new_member->user_title = ''; 142 $new_member->date_modified = $date_modified; 143 $new_member->is_confirmed = 1; 144 $new_member->save(); 145 146 global $members_template; 147 bp_group_has_members( array( 148 'group_id' => $g, 149 ) ); 150 151 $u1_object = new WP_User( $u1 ); 152 153 $expected = new stdClass; 154 $expected->user_id = $u1; 155 $expected->date_modified = $date_modified; 156 $expected->is_banned = 0; 157 $expected->user_login = $u1_object->user_login; 158 $expected->user_nicename = $u1_object->user_nicename; 159 $expected->user_email = $u1_object->user_email; 160 $expected->display_name = $u1_object->display_name; 161 162 // In order to use assertEquals, we need to discard the 163 // irrelevant properties of the found object. Hack alert 164 $found = new stdClass; 165 foreach ( array( 'user_id', 'date_modified', 'is_banned', 'user_login', 'user_nicename', 'user_email', 'display_name' ) as $key ) { 166 if ( isset( $members_template->members[0]->{$key} ) ) { 167 $found->{$key} = $members_template->members[0]->{$key}; 168 } 169 } 170 171 $this->assertEquals( $expected, $found ); 172 } 173 174 /** 175 * @group bp_group_has_members 176 */ 123 177 public function test_bp_group_has_members_with_per_page() { 124 178 $g = $this->factory->group->create(); 125 179