Skip to:
Content

BuddyPress.org

Changeset 9125


Ignore:
Timestamp:
11/05/2014 03:22:56 PM (7 years ago)
Author:
boonebgorges
Message:

Don't extract() in bp_core_fetch_avatar(), and pass params to 'bp_core_fetch_avatar_no_grav' hook.

Passing the modified parameters to the hook required moving away from the use
of extract(). See #5698.

Props dcavins.
Fixes #5958.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-core/bp-core-avatars.php

    r9124 r9125  
    175175 */
    176176function bp_core_fetch_avatar( $args = '' ) {
     177    $bp = buddypress();
    177178
    178179    // If avatars are disabled for the root site, obey that request and bail
    179     if ( ! buddypress()->avatar->show_avatars )
     180    if ( ! $bp->avatar->show_avatars ) {
    180181        return;
     182    }
    181183
    182184    global $current_blog;
     
    198200        'title'      => '',
    199201    ) );
    200     extract( $params, EXTR_SKIP );
    201202
    202203    /** Set item_id ***********************************************************/
    203204
    204     if ( empty( $item_id ) ) {
    205 
    206         switch ( $object ) {
     205    if ( empty( $params['item_id'] ) ) {
     206
     207        switch ( $params['object'] ) {
    207208
    208209            case 'blog'  :
    209                 $item_id = $current_blog->id;
     210                $params['item_id'] = $current_blog->id;
    210211                break;
    211212
    212213            case 'group' :
    213214                if ( bp_is_active( 'groups' ) ) {
    214                     $item_id = $bp->groups->current_group->id;
     215                    $params['item_id'] = $bp->groups->current_group->id;
    215216                } else {
    216                     $item_id = false;
     217                    $params['item_id'] = false;
    217218                }
    218219
     
    221222            case 'user'  :
    222223            default      :
    223                 $item_id = bp_displayed_user_id();
     224                $params['item_id'] = bp_displayed_user_id();
    224225                break;
    225226        }
    226227
    227         $item_id = apply_filters( 'bp_core_avatar_item_id', $item_id, $object, $params );
    228 
    229         if ( empty( $item_id ) ) {
     228        $params['item_id'] = apply_filters( 'bp_core_avatar_item_id', $params['item_id'], $params['object'], $params );
     229
     230        if ( empty( $params['item_id'] ) ) {
    230231            return false;
    231232        }
    232233    }
    233234
    234     $class = apply_filters( 'bp_core_avatar_class', $class, $item_id, $object, $params );
    235 
    236235    /** Set avatar_dir ********************************************************/
    237236
    238     if ( empty( $avatar_dir ) ) {
    239 
    240         switch ( $object ) {
     237    if ( empty( $params['avatar_dir'] ) ) {
     238
     239        switch ( $params['object'] ) {
    241240
    242241            case 'blog'  :
    243                 $avatar_dir = 'blog-avatars';
     242                $params['avatar_dir'] = 'blog-avatars';
    244243                break;
    245244
    246245            case 'group' :
    247246                if ( bp_is_active( 'groups' ) ) {
    248                     $avatar_dir = 'group-avatars';
     247                    $params['avatar_dir'] = 'group-avatars';
    249248                } else {
    250                     $avatar_dir = false;
     249                    $params['avatar_dir'] = false;
    251250                }
    252251
     
    255254            case 'user'  :
    256255            default      :
    257                 $avatar_dir = 'avatars';
     256                $params['avatar_dir'] = 'avatars';
    258257                break;
    259258        }
    260259
    261         $avatar_dir = apply_filters( 'bp_core_avatar_dir', $avatar_dir, $object, $params );
    262 
    263         if ( empty( $avatar_dir ) ) {
     260        $params['avatar_dir'] = apply_filters( 'bp_core_avatar_dir', $params['avatar_dir'], $params['object'], $params );
     261
     262        if ( empty( $params['avatar_dir'] ) ) {
    264263            return false;
    265264        }
     
    268267    /** <img> alt *************************************************************/
    269268
    270     if ( false !== strpos( $alt, '%s' ) || false !== strpos( $alt, '%1$s' ) ) {
    271 
    272         switch ( $object ) {
     269    if ( false !== strpos( $params['alt'], '%s' ) || false !== strpos( $params['alt'], '%1$s' ) ) {
     270
     271        switch ( $params['object'] ) {
    273272
    274273            case 'blog'  :
    275                 $item_name = get_blog_option( $item_id, 'blogname' );
     274                $item_name = get_blog_option( $params['item_id'], 'blogname' );
    276275                break;
    277276
    278277            case 'group' :
    279                 $item_name = bp_get_group_name( groups_get_group( array( 'group_id' => $item_id ) ) );
     278                $item_name = bp_get_group_name( groups_get_group( array( 'group_id' => $params['item_id'] ) ) );
    280279                break;
    281280
    282281            case 'user'  :
    283282            default :
    284                 $item_name = bp_core_get_user_displayname( $item_id );
     283                $item_name = bp_core_get_user_displayname( $params['item_id'] );
    285284                break;
    286285        }
    287286
    288         $item_name = apply_filters( 'bp_core_avatar_alt', $item_name, $item_id, $object, $params );
    289         $alt       = sprintf( $alt, $item_name );
     287        $item_name = apply_filters( 'bp_core_avatar_alt', $item_name, $params['item_id'], $params['object'], $params );
     288        $params['alt'] = sprintf( $params['alt'], $item_name );
    290289    }
    291290
    292291    /** Sanity Checks *********************************************************/
    293292
    294     // Get a fallback for the 'alt' parameter
    295     if ( empty( $alt ) )
    296         $alt = __( 'Profile Photo', 'buddypress' );
    297 
    298     $html_alt = ' alt="' . esc_attr( $alt ) . '"';
    299 
    300     // Set title tag, if it's been provided
    301     if ( !empty( $title ) ) {
    302         $title = " title='" . esc_attr( apply_filters( 'bp_core_avatar_title', $title, $item_id, $object, $params ) ) . "'";
    303     }
    304 
    305     // Set CSS ID if passed
    306     if ( !empty( $css_id ) ) {
    307         $css_id = ' id="' . esc_attr( $css_id ) . '"';
     293    // Get a fallback for the 'alt' parameter, create html output
     294    if ( empty( $params['alt'] ) ) {
     295        $params['alt'] = __( 'Profile Photo', 'buddypress' );
     296    }
     297    $html_alt = ' alt="' . esc_attr( $params['alt'] ) . '"';
     298
     299    // Filter image title and create html string
     300    $html_title = '';
     301    $params['title'] = apply_filters( 'bp_core_avatar_title', $params['title'], $params['item_id'], $params['object'], $params );
     302
     303    if ( ! empty( $params['title'] ) ) {
     304        $html_title = ' title="' . esc_attr( $params['title'] ) . '"';
     305    }
     306
     307    // Set CSS ID and create html string
     308    $html_css_id = '';
     309    $params['css_id'] = apply_filters( 'bp_core_css_id', $params['css_id'], $params['item_id'], $params['object'], $params );
     310
     311    if ( ! empty( $params['css_id'] ) ) {
     312        $html_css_id = ' id="' . esc_attr( $params['css_id'] ) . '"';
    308313    }
    309314
    310315    // Set image width
    311     if ( false !== $width ) {
    312         $html_width = ' width="' . $width . '"';
    313     } elseif ( 'thumb' == $type ) {
    314         $html_width = ' width="' . bp_core_avatar_thumb_width() . '"';
     316    if ( false !== $params['width'] ) {
     317        // Width has been specified. No modification necessary.
     318    } else if ( 'thumb' == $params['type'] ) {
     319        $params['width'] = bp_core_avatar_thumb_width();
    315320    } else {
    316         $html_width = ' width="' . bp_core_avatar_full_width() . '"';
    317     }
     321        $params['width'] = bp_core_avatar_full_width();
     322    }
     323    $html_width = ' width="' . $params['width'] . '"';
    318324
    319325    // Set image height
    320     if ( false !== $height ) {
    321         $html_height = ' height="' . $height . '"';
    322     } elseif ( 'thumb' == $type ) {
    323         $html_height = ' height="' . bp_core_avatar_thumb_height() . '"';
     326    if ( false !== $params['height'] ) {
     327        // Height has been specified. No modification necessary.
     328    } else if ( 'thumb' == $params['type'] ) {
     329        $params['height'] = bp_core_avatar_thumb_height();
    324330    } else {
    325         $html_height = ' height="' . bp_core_avatar_full_height() . '"';
    326     }
     331        $params['height'] = bp_core_avatar_full_height();
     332    }
     333    $html_height = ' height="' . $params['height'] . '"';
     334
     335    // Create CSS class html string
     336    $params['class'] = apply_filters( 'bp_core_avatar_class', $params['class'], $params['item_id'], $params['object'], $params );
     337    $html_class = ' class="' . sanitize_html_class( $params['class'] ) . ' ' . sanitize_html_class( $params['object'] . '-' . $params['item_id'] . '-avatar' ) . ' ' . sanitize_html_class( 'avatar-' . $params['width'] ) . ' photo"';
    327338
    328339    // Set img URL and DIR based on prepopulated constants
     
    331342    $avatar_loc->url   = trailingslashit( bp_core_avatar_url() );
    332343
    333     $avatar_loc->dir   = trailingslashit( $avatar_dir );
    334     $avatar_folder_url = apply_filters( 'bp_core_avatar_folder_url', ( $avatar_loc->url  . $avatar_loc->dir . $item_id ), $item_id, $object, $avatar_dir );
    335     $avatar_folder_dir = apply_filters( 'bp_core_avatar_folder_dir', ( $avatar_loc->path . $avatar_loc->dir . $item_id ), $item_id, $object, $avatar_dir );
    336 
    337     // Add an identifying class
    338     $class .= ' ' . $object . '-' . $item_id . '-avatar ' . sanitize_html_class( "avatar-$width" ) . ' photo';
     344    $avatar_loc->dir   = trailingslashit( $params['avatar_dir'] );
     345    $avatar_folder_url = apply_filters( 'bp_core_avatar_folder_url', ( $avatar_loc->url  . $avatar_loc->dir . $params['item_id'] ), $params['item_id'], $params['object'], $params['avatar_dir'] );
     346    $avatar_folder_dir = apply_filters( 'bp_core_avatar_folder_dir', ( $avatar_loc->path . $avatar_loc->dir . $params['item_id'] ), $params['item_id'], $params['object'], $params['avatar_dir'] );
    339347
    340348    /**
     
    343351     * or thumbnail image.
    344352     */
    345     $avatar_size              = ( 'full' == $type ) ? '-bpfull' : '-bpthumb';
    346     $legacy_user_avatar_name  = ( 'full' == $type ) ? '-avatar2' : '-avatar1';
    347     $legacy_group_avatar_name = ( 'full' == $type ) ? '-groupavatar-full' : '-groupavatar-thumb';
     353    $avatar_size              = ( 'full' == $params['type'] ) ? '-bpfull' : '-bpthumb';
     354    $legacy_user_avatar_name  = ( 'full' == $params['type'] ) ? '-avatar2' : '-avatar1';
     355    $legacy_group_avatar_name = ( 'full' == $params['type'] ) ? '-groupavatar-full' : '-groupavatar-thumb';
    348356
    349357    // Check for directory
     
    399407
    400408            // Return it wrapped in an <img> element
    401             if ( true === $html ) {
    402                 return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $avatar_url . '" class="' . esc_attr( $class ) . '"' . $css_id . $html_width . $html_height . $html_alt . $title . ' />', $params, $item_id, $avatar_dir, $css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
     409            if ( true === $params['html'] ) {
     410                return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $avatar_url . '"' . $html_class . $html_css_id  . $html_width . $html_height . $html_alt . $html_title . ' />', $params, $params['item_id'], $params['avatar_dir'], $html_css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
    403411
    404412            // ...or only the URL
     
    411419    // If no avatars could be found, try to display a gravatar
    412420
    413     // Skips gravatar check if $no_grav is passed
    414     if ( ! apply_filters( 'bp_core_fetch_avatar_no_grav', $no_grav ) ) {
    415 
    416         // Set gravatar size
    417         if ( false !== $width ) {
    418             $grav_size = $width;
    419         } else if ( 'full' == $type ) {
    420             $grav_size = bp_core_avatar_full_width();
    421         } else if ( 'thumb' == $type ) {
    422             $grav_size = bp_core_avatar_thumb_width();
    423         }
     421    // Skips gravatar check if $params['no_grav'] is passed
     422    if ( ! apply_filters( 'bp_core_fetch_avatar_no_grav', $params['no_grav'], $params ) ) {
    424423
    425424        // Set gravatar type
    426         if ( empty( $bp->grav_default->{$object} ) ) {
     425        if ( empty( $bp->grav_default->{$params['object']} ) ) {
    427426            $default_grav = 'wavatar';
    428         } else if ( 'mystery' == $bp->grav_default->{$object} ) {
    429             $default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $grav_size );
     427        } else if ( 'mystery' == $bp->grav_default->{$params['object']} ) {
     428            $default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $params['width'] );
    430429        } else {
    431             $default_grav = $bp->grav_default->{$object};
     430            $default_grav = $bp->grav_default->{$params['object']};
    432431        }
    433432
    434433        // Set gravatar object
    435         if ( empty( $email ) ) {
    436             if ( 'user' == $object ) {
    437                 $email = bp_core_get_user_email( $item_id );
    438             } else if ( 'group' == $object || 'blog' == $object ) {
    439                 $email = "{$item_id}-{$object}@{bp_get_root_domain()}";
     434        if ( empty( $params['email'] ) ) {
     435            if ( 'user' == $params['object'] ) {
     436                $params['email'] = bp_core_get_user_email( $params['item_id'] );
     437            } else if ( 'group' == $params['object'] || 'blog' == $params['object'] ) {
     438                $params['email'] = $params['item_id'] . '-' . $params['object'] . '@' . bp_get_root_domain();
    440439            }
    441440        }
     
    448447
    449448        // Filter gravatar vars
    450         $email    = apply_filters( 'bp_core_gravatar_email', $email, $item_id, $object );
    451         $gravatar = apply_filters( 'bp_gravatar_url', $host ) . md5( strtolower( $email ) ) . '?d=' . $default_grav . '&amp;s=' . $grav_size;
     449        $params['email'] = apply_filters( 'bp_core_gravatar_email', $params['email'], $params['item_id'], $params['object'] );
     450        $gravatar = apply_filters( 'bp_gravatar_url', $host ) . md5( strtolower( $params['email'] ) ) . '?d=' . $default_grav . '&amp;s=' . $params['width'];
    452451
    453452        // Gravatar rating; http://bit.ly/89QxZA
     
    459458    // No avatar was found, and we've been told not to use a gravatar.
    460459    } else {
    461         $gravatar = apply_filters( "bp_core_default_avatar_$object", bp_core_avatar_default( 'local' ), $params );
    462     }
    463 
    464     if ( true === $html ) {
    465         return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $gravatar . '" class="' . esc_attr( $class ) . '"' . $css_id . $html_width . $html_height . $html_alt . $title . ' />', $params, $item_id, $avatar_dir, $css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
     460        $gravatar = apply_filters( 'bp_core_default_avatar_' . $params['object'], bp_core_avatar_default( 'local' ), $params );
     461    }
     462
     463    if ( true === $params['html'] ) {
     464        return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $gravatar . '"' . $html_css_id . $html_class . $html_width . $html_height . $html_alt . $html_title . ' />', $params, $params['item_id'], $params['avatar_dir'], $html_css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
    466465    } else {
    467466        return apply_filters( 'bp_core_fetch_avatar_url', $gravatar, $params );
  • trunk/tests/phpunit/testcases/core/avatars.php

    r8958 r9125  
    66class BP_Tests_Avatars extends BP_UnitTestCase {
    77    protected $old_current_user = 0;
     8
     9    private $params = array();
    810
    911    public function setUp() {
     
    111113        return 'foo';
    112114    }
     115
     116    /**
     117     * @group bp_core_fetch_avatar
     118     */
     119    public function test_bp_core_fetch_avatar_parameter_conservation() {
     120        // First, run the check with custom parameters, specifying no gravatar.
     121        $this->params = array(
     122            'item_id'    => 1406,
     123            'object'     => 'custom_object',
     124            'type'       => 'full',
     125            'avatar_dir' => 'custom-dir',
     126            'width'      => 48,
     127            'height'     => 54,
     128            'class'      => 'custom-class',
     129            'css_id'     => 'custom-css-id',
     130            'alt'        => 'custom alt',
     131            'email'      => 'avatar@avatar.org',
     132            'no_grav'    => true,
     133            'html'       => true,
     134            'title'      => 'custom-title',
     135        );
     136
     137        // Check to make sure the custom parameters survived the function all the way up to output
     138        add_filter( 'bp_core_fetch_avatar', array( $this, 'bp_core_fetch_avatar_filter_check' ), 12, 2 );
     139        $avatar = bp_core_fetch_avatar( $this->params );
     140
     141        // Re-run check, allowing gravatars.
     142        $this->params['no_grav'] = false;
     143        $avatar = bp_core_fetch_avatar( $this->params );
     144
     145        remove_filter( 'bp_core_fetch_avatar', array( $this, 'bp_core_fetch_avatar_filter_check' ), 12, 2 );
     146
     147        unset( $this->params );
     148    }
     149
     150    public function bp_core_fetch_avatar_filter_check( $html, $params ) {
     151        // Check that the passed parameters match the original custom parameters.
     152        $this->assertEmpty( array_merge( array_diff( $params, $this->params ), array_diff( $this->params, $params ) ) );
     153
     154        // Check the returned html to see that it matches an expected value.
     155        // Get the correct default avatar, based on whether gravatars are allowed.
     156        if ( $params['no_grav'] ) {
     157            $avatar_url = bp_core_avatar_default( 'local' );
     158        } else {
     159            // This test has the slight odor of hokum since it recreates so much code that could be changed at any time.
     160            $bp = buddypress();
     161            // Set host based on if using ssl
     162            $host = 'http://gravatar.com/avatar/';
     163            if ( is_ssl() ) {
     164                $host = 'https://secure.gravatar.com/avatar/';
     165            }
     166            // Set expected gravatar type
     167            if ( empty( $bp->grav_default->{$this->params['object']} ) ) {
     168                $default_grav = 'wavatar';
     169            } else if ( 'mystery' == $bp->grav_default->{$this->params['object']} ) {
     170                $default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $this->params['width'] );
     171            } else {
     172                $default_grav = $bp->grav_default->{$this->params['object']};
     173            }
     174
     175            $avatar_url = $host . md5( strtolower( $this->params['email'] ) ) . '?d=' . $default_grav . '&amp;s=' . $this->params['width'];
     176
     177            // Gravatar rating; http://bit.ly/89QxZA
     178            $rating = get_option( 'avatar_rating' );
     179            if ( ! empty( $rating ) ) {
     180                $avatar_url .= "&amp;r={$rating}";
     181            }
     182        }
     183
     184        $expected_html = '<img src="' . $avatar_url . '" id="' . $this->params['css_id'] . '" class="' . $this->params['class'] . ' ' . $this->params['object'] . '-' . $this->params['item_id'] . '-avatar avatar-' . $this->params['width'] . ' photo" width="' . $this->params['width'] . '" height="' . $this->params['height'] . '" alt="' . $this->params['alt'] . '" title="' . $this->params['title'] . '" />';
     185
     186        $this->assertEquals( $html, $expected_html );
     187    }
    113188}
Note: See TracChangeset for help on using the changeset viewer.