Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
05/19/2013 12:09:30 AM (12 years ago)
Author:
boonebgorges
Message:

Introduces 'order' and 'orderby' parameters for the bp_has_groups() stack

'order' and 'orderby' are more specific and flexible versions of the existing
'type' parameter ('popular', 'newest', etc). Backward compatibility is
maintained by always obeying 'type' when it is passed, and by internally
converting the legacy 'type' values into the corresponding 'order' and
'orderby' values.

Adds unit tests to ensure that the adjusted default values for functions in
the stack are backward compatibile (in particular, the fact that the 'type'
parameter is now empty by default, replaced with the corresponding default
values for 'order' and 'orderby'). Unit tests are also added for the new
params, as well as some internal utility methods.

See #4483

File:
1 edited

Legend:

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

    r7084 r7087  
    333333
    334334        $defaults = array(
    335             'type'            => 'newest',
     335            'type'            => null,
     336            'orderby'         => 'date_created',
     337            'order'           => 'DESC',
    336338            'per_page'        => null,
    337339            'page'            => null,
     
    342344            'populate_extras' => true,
    343345            'exclude'         => false,
    344             'show_hidden'     => false
     346            'show_hidden'     => false,
    345347        );
    346348
     
    401403        }
    402404
    403         switch ( $r['type'] ) {
    404             case 'newest':
    405             default:
    406                 $sql['order'] = " ORDER BY g.date_created DESC";
    407                 break;
    408             case 'active':
    409                 $sql[] = "ORDER BY last_activity DESC";
    410                 break;
    411             case 'popular':
    412                 $sql[] = "ORDER BY CONVERT(gm1.meta_value, SIGNED) DESC";
    413                 break;
    414             case 'alphabetical':
    415                 $sql[] = "ORDER BY g.name ASC";
    416                 break;
    417             case 'random':
    418                 $sql[] = "ORDER BY rand()";
    419                 break;
     405        /** Order/orderby ********************************************/
     406
     407        $order   = $r['order'];
     408        $orderby = $r['orderby'];
     409
     410        // If a 'type' parameter was passed, parse it and overwrite
     411        // 'order' and 'orderby' params passed to the function
     412        if (  ! empty( $r['type'] ) ) {
     413            $order_orderby = self::convert_type_to_order_orderby( $r['type'] );
     414
     415            // If an invalid type is passed, $order_orderby will be
     416            // an array with empty values. In this case, we stick
     417            // with the default values of $order and $orderby
     418            if ( ! empty( $order_orderby['order'] ) ) {
     419                $order = $order_orderby['order'];
     420            }
     421
     422            if ( ! empty( $order_orderby['orderby'] ) ) {
     423                $orderby = $order_orderby['orderby'];
     424            }
     425        }
     426
     427        // Sanitize 'order'
     428        $order = bp_esc_sql_order( $order );
     429
     430        // Convert 'orderby' into the proper ORDER BY term
     431        $orderby = self::convert_orderby_to_order_by_term( $orderby );
     432
     433        // Random order is a special case
     434        if ( 'rand()' === $orderby ) {
     435            $sql[] = "ORDER BY rand()";
     436        } else {
     437            $sql[] = "ORDER BY {$orderby} {$order}";
    420438        }
    421439
     
    541559    }
    542560
     561    /**
     562     * Convert the 'type' parameter to 'order' and 'orderby'
     563     *
     564     * @since BuddyPress (1.8)
     565     * @access protected
     566     * @param string $type The 'type' shorthand param
     567     * @return array 'order' and 'orderby'
     568     */
     569    protected function convert_type_to_order_orderby( $type = '' ) {
     570        $order = $orderby = '';
     571
     572        switch ( $type ) {
     573            case 'newest' :
     574                $order   = 'DESC';
     575                $orderby = 'date_created';
     576                break;
     577
     578            case 'active' :
     579                $order   = 'DESC';
     580                $orderby = 'last_activity';
     581                break;
     582
     583            case 'popular' :
     584                $order   = 'DESC';
     585                $orderby = 'total_member_count';
     586                break;
     587
     588            case 'alphabetical' :
     589                $order   = 'ASC';
     590                $orderby = 'name';
     591                break;
     592
     593            case 'random' :
     594                $order   = '';
     595                $orderby = 'random';
     596                break;
     597        }
     598
     599        return array( 'order' => $order, 'orderby' => $orderby );
     600    }
     601
     602    /**
     603     * Convert the 'orderby' param into a proper SQL term/column
     604     *
     605     * @since BuddyPress (1.8)
     606     * @access protected
     607     * @param string $orderby
     608     * @return string $order_by_term
     609     */
     610    protected function convert_orderby_to_order_by_term( $orderby ) {
     611        $order_by_term = '';
     612
     613        switch ( $orderby ) {
     614            case 'date_created' :
     615            default :
     616                $order_by_term = 'g.date_created';
     617                break;
     618
     619            case 'last_activity' :
     620                $order_by_term = 'last_activity';
     621                break;
     622
     623            case 'total_group_members' :
     624                $order_by_term = 'CONVERT(gm1.meta_value, SIGNED)';
     625                break;
     626
     627            case 'name' :
     628                $order_by_term = 'g.name';
     629                break;
     630
     631            case 'random' :
     632                $order_by_term = 'rand()';
     633                break;
     634        }
     635
     636        return $order_by_term;
     637    }
    543638
    544639    function get_by_most_forum_topics( $limit = null, $page = null, $user_id = 0, $search_terms = false, $populate_extras = true, $exclude = false ) {
Note: See TracChangeset for help on using the changeset viewer.