Skip to:
Content

BuddyPress.org

Ticket #5202: 5202.03.patch

File 5202.03.patch, 5.2 KB (added by imath, 5 years ago)
  • src/bp-core/bp-core-attachments.php

    diff --git src/bp-core/bp-core-attachments.php src/bp-core/bp-core-attachments.php
    index ff0b622..1fd6975 100644
    function bp_attachments_check_filetype( $file, $filename, $allowed_mimes ) { 
    216216}
    217217
    218218/**
     219 * Use the absolute path to an image to set an attachment type for a given item.
     220 *
     221 * @since 2.4.0
     222 *
     223 * @param  string $type        The attachment type to create (avatar or cover_image). Default: avatar.
     224 * @param  array  $args {
     225 *     @type int    $item_id   The ID of the object (Required). Default: 0.
     226 *     @type string $object    The object type (eg: group, user, blog) (Required). Default: 'user'.
     227 *     @type string $component The component for the object (eg: groups, xprofile, blogs). Default: ''.
     228 *     @type string $image     The absolute path to the image (Required). Default: ''.
     229 *     @type int    $crop_w    Crop width. Default: 0.
     230 *     @type int    $crop_h    Crop height. Default: 0.
     231 *     @type int    $crop_x    The horizontal starting point of the crop. Default: 0.
     232 *     @type int    $crop_y    The vertical starting point of the crop. Default: 0.
     233 * }
     234 * @return bool  True on success, false otherwise.
     235 */
     236function bp_attachments_create_item_type( $type = 'avatar', $args = array() ) {
     237        if ( empty( $type ) || ( $type !== 'avatar' && $type !== 'cover_image' ) ) {
     238                return false;
     239        }
     240
     241        $r = bp_parse_args( $args, array(
     242                'item_id'   => 0,
     243                'object'    => 'user',
     244                'component' => '',
     245                'image'     => '',
     246                'crop_w'    => 0,
     247                'crop_h'    => 0,
     248                'crop_x'    => 0,
     249                'crop_y'    => 0
     250        ), 'create_item_' . $type );
     251
     252        if ( empty( $r['item_id'] ) || empty( $r['object'] ) || ! file_exists( $r['image'] ) || ! @getimagesize( $r['image'] ) ) {
     253                return false;
     254        }
     255
     256        // Set the component if not already done
     257        if ( empty( $r['component'] ) ) {
     258                if ( 'user' === $r['object'] ) {
     259                        $r['component'] = 'xprofile';
     260                } else {
     261                        $r['component'] = $r['object'] . 's';
     262                }
     263        }
     264
     265        // Get allowed mimes for the Attachment type and check the image one is.
     266        $allowed_mimes = bp_attachments_get_allowed_mimes( $type );
     267        $is_allowed    = wp_check_filetype( $r['image'], $allowed_mimes );
     268
     269        // It's not an image.
     270        if ( ! $is_allowed['ext'] ) {
     271                return false;
     272        }
     273
     274        // Init the Attachment data
     275        $attachment_data = array();
     276
     277        if ( 'avatar' === $type ) {
     278                // Set crop width for the avatar if not given
     279                if ( empty( $r['crop_w'] ) ) {
     280                        $r['crop_w'] = bp_core_avatar_full_width();
     281                }
     282
     283                // Set crop height for the avatar if not given
     284                if ( empty( $r['crop_h'] ) ) {
     285                        $r['crop_h'] = bp_core_avatar_full_height();
     286                }
     287
     288                if ( is_callable( $r['component'] . '_avatar_upload_dir' ) ) {
     289                        $dir_args = array( $r['item_id'] );
     290
     291                        // In case  of xprofile, we need an extra argument
     292                        if ( 'xprofile' === $r['component'] ) {
     293                                $dir_args = array( false, $r['item_id'] );
     294                        }
     295
     296                        $attachment_data = call_user_func_array( $r['component'] . '_avatar_upload_dir', $dir_args );
     297                }
     298        } elseif ( 'cover_image' === $type ) {
     299                $attachment_data = bp_attachments_uploads_dir_get();
     300
     301                // Default to members for xProfile
     302                $object_subdir = 'members';
     303
     304                if ( 'xprofile' !== $r['component'] ) {
     305                        $object_subdir = sanitize_key( $r['component'] );
     306                }
     307
     308                // Set Subdir
     309                $attachment_data['subdir'] = $object_subdir . '/' . $r['item_id'] . '/cover-image';
     310
     311                // Set Path
     312                $attachment_data['path'] = trailingslashit( $attachment_data['basedir'] ) . $attachment_data['subdir'];
     313        }
     314
     315        if ( ! isset( $attachment_data['path'] ) || ! isset( $attachment_data['subdir'] ) ) {
     316                return false;
     317        }
     318
     319        // It's not a regular upload, we may need to create some folders
     320        if ( ! is_dir( $attachment_data['path'] ) ) {
     321                if ( ! wp_mkdir_p( $attachment_data['path'] ) ) {
     322                        return false;
     323                }
     324        }
     325
     326        // Set the image name and path
     327        $image_file_name = wp_unique_filename( $attachment_data['path'], basename( $r['image'] ) );
     328        $image_file_path = $attachment_data['path'] . '/' . $image_file_name;
     329
     330        // Copy the image file into the avatar dir
     331        if ( ! copy( $r['image'], $image_file_path ) ) {
     332                return false;
     333        }
     334
     335        // Init the response
     336        $created = false;
     337
     338        // It's an avatar, we need to crop it.
     339        if ( 'avatar' === $type ) {
     340                $created = bp_core_avatar_handle_crop( array(
     341                        'object'        => $r['object'],
     342                        'avatar_dir'    => trim( dirname( $attachment_data['subdir'] ), '/' ),
     343                        'item_id'       => (int) $r['item_id'],
     344                        'original_file' => trailingslashit( $attachment_data['subdir'] ) . $image_file_name,
     345                        'crop_w'        => $r['crop_w'],
     346                        'crop_h'        => $r['crop_h'],
     347                        'crop_x'        => $r['crop_x'],
     348                        'crop_y'        => $r['crop_y']
     349                ) );
     350
     351        // It's a cover image we need to fit it to feature's dimensions
     352        } elseif ( 'cover_image' === $type ) {
     353                $cover_image = bp_attachments_cover_image_generate_file( array(
     354                        'file'            => $image_file_path,
     355                        'component'       => $r['component'],
     356                        'cover_image_dir' => $attachment_data['path']
     357                ) );
     358
     359                $created = ! empty( $cover_image['cover_file'] );
     360        }
     361
     362        // Remove copied file if it fails
     363        if ( ! $created ) {
     364                @unlink( $image_file_path );
     365        }
     366
     367        // Return the response
     368        return $created;
     369}
     370
     371/**
    219372 * Get the url or the path for a type of attachment
    220373 *
    221374 * @since  2.4.0