Make WordPress Core


Ignore:
Timestamp:
11/11/2014 11:51:48 PM (11 years ago)
Author:
ocean90
Message:

Customizer: Add support for the media library in Background Image controls.

WP_Customize_Upload_Control (PHP) and api.UploadControl (JS) can now open the media modal.

props celloexpressions, and ericlewis for docs.
see #21483.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-customize-control.php

    r30214 r30309  
    638638 */
    639639class WP_Customize_Upload_Control extends WP_Customize_Control {
    640     public $type    = 'upload';
    641     public $removed = '';
    642     public $context;
    643     public $extensions = array();
     640    public $type          = 'upload';
     641    public $mime_type     = '';
     642    public $button_labels = array();
     643    public $removed = ''; // unused
     644    public $context; // unused
     645    public $extensions = array(); // unused
     646
     647    /**
     648     * Constructor.
     649     *
     650     * @since 4.1.0
     651     * @uses WP_Customize_Control::__construct()
     652     *
     653     * @param WP_Customize_Manager $manager
     654     */
     655    public function __construct( $manager, $id, $args = array() ) {
     656        parent::__construct( $manager, $id, $args );
     657
     658        $this->button_labels = array(
     659            'select'       => __( 'Select File' ),
     660            'change'       => __( 'Change File' ),
     661            'default'      => __( 'Default' ),
     662            'remove'       => __( 'Remove' ),
     663            'placeholder'  => __( 'No file selected' ),
     664            'frame_title'  => __( 'Select File' ),
     665            'frame_button' => __( 'Choose File' ),
     666        );
     667    }
    644668
    645669    /**
     
    649673     */
    650674    public function enqueue() {
    651         wp_enqueue_script( 'wp-plupload' );
     675        wp_enqueue_media();
    652676    }
    653677
     
    660684    public function to_json() {
    661685        parent::to_json();
    662 
    663         $this->json['removed'] = $this->removed;
    664 
    665         if ( $this->context )
    666             $this->json['context'] = $this->context;
    667 
    668         if ( $this->extensions )
    669             $this->json['extensions'] = implode( ',', $this->extensions );
    670     }
    671 
    672     /**
    673      * Render the control's content.
    674      *
    675      * @since 3.4.0
    676      */
    677     public function render_content() {
     686        $this->json['mime_type'] = $this->mime_type;
     687        $this->json['button_labels'] = $this->button_labels;
     688
     689        if ( is_object( $this->setting ) ) {
     690            if ( $this->setting->default ) {
     691                // Fake an attachment model - needs all fields used by template.
     692                $type = in_array( substr( $this->setting->default, -3 ), array( 'jpg', 'png', 'gif', 'bmp' ) ) ? 'image' : 'document';
     693                $default_attachment = array(
     694                    'id' => 1,
     695                    'url' => $this->setting->default,
     696                    'type' => $type,
     697                    'sizes' => array(
     698                        'full' => array( 'url' => $this->setting->default ),
     699                    ),
     700                    'icon' => wp_mime_type_icon( $type ),
     701                    'title' => basename( $this->setting->default ),
     702                );
     703                $this->json['defaultAttachment'] = $default_attachment;
     704            }
     705
     706            // Get the attachment model for the existing file.
     707            if ( $this->value() ) {
     708                $attachment_id = attachment_url_to_postid( $this->value() );
     709                if ( $attachment_id ) {
     710                    $this->json['attachment'] = wp_prepare_attachment_for_js( $attachment_id);
     711                }
     712            } else if ( $this->setting->default ) {
     713                // Set the default as the attachment.
     714                $this->json['attachment'] = $default_attachment;
     715            }
     716        }
     717    }
     718
     719    /**
     720     * Don't render any content for this control from PHP.
     721     *
     722     * @see WP_Customize_Upload_Control::content_template()
     723     * @since 3.4.0
     724     */
     725    public function render_content() {}
     726
     727    /**
     728     * Render a JS template for the content of the upload control.
     729     *
     730     * @since 4.1.0
     731     */
     732    public function content_template() {
    678733        ?>
    679         <label>
    680             <?php if ( ! empty( $this->label ) ) : ?>
    681                 <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    682             <?php endif;
    683             if ( ! empty( $this->description ) ) : ?>
    684                 <span class="description customize-control-description"><?php echo $this->description; ?></span>
    685             <?php endif; ?>
    686             <div>
    687                 <a href="#" class="button-secondary upload"><?php _e( 'Upload' ); ?></a>
    688                 <a href="#" class="remove"><?php _e( 'Remove' ); ?></a>
     734        <label for="{{ data.settings.default }}-button">
     735            <# if ( data.label ) { #>
     736                <span class="customize-control-title">{{ data.label }}</span>
     737            <# } #>
     738            <# if ( data.description ) { #>
     739                <span class="description customize-control-description">{{ data.description }}</span>
     740            <# } #>
     741        </label>
     742
     743        <# // Ensure that the default attachment is used if it exists.
     744        if ( _.isEmpty( data.attachment ) && data.defaultAttachment ) {
     745            data.attachment = data.defaultAttachment;
     746        }
     747
     748        if ( data.attachment && data.attachment.id ) { #>
     749            <div class="attachment-media-view {{ data.attachment.orientation }}">
     750                <div class="thumbnail thumbnail-{{ data.attachment.type }}">
     751                    <# if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #>
     752                        <img class="attachment-thumb" src="{{ data.attachment.sizes.medium.url }}" draggable="false" />
     753                    <# } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #>
     754                        <img class="attachment-thumb" src="{{ data.attachment.sizes.full.url }}" draggable="false" />
     755                    <# } else if ( -1 === jQuery.inArray( data.attachment.type, [ 'audio', 'video' ] ) ) { #>
     756                        <img class="attachment-thumb type-icon" src="{{ data.attachment.icon }}" class="icon" draggable="false" />
     757                        <p class="attachment-title">{{ data.attachment.title }}</p>
     758                    <# } #>
     759
     760                    <# if ( 'audio' === data.attachment.type ) { #>
     761                    <div class="wp-media-wrapper">
     762                        <p class="attachment-title">{{ data.attachment.title }}</p>
     763                        <audio style="visibility: hidden" controls class="wp-audio-shortcode" width="100%" preload="none">
     764                            <source type="{{ data.attachment.mime }}" src="{{ data.attachment.url }}"/>
     765                        </audio>
     766                    </div>
     767                    <# } else if ( 'video' === data.attachment.type ) {
     768                        var w_rule = h_rule = '';
     769                        if ( data.attachment.width ) {
     770                            w_rule = 'width: ' + data.attachment.width + 'px;';
     771                        } else if ( wp.media.view.settings.contentWidth ) {
     772                            w_rule = 'width: ' + wp.media.view.settings.contentWidth + 'px;';
     773                        }
     774                        if ( data.attachment.height ) {
     775                            h_rule = 'height: ' + data.attachment.height + 'px;';
     776                        }
     777                        #>
     778                        <div style="{{ w_rule }}{{ h_rule }}" class="wp-media-wrapper wp-video">
     779                            <video controls="controls" class="wp-video-shortcode" preload="metadata"
     780                                <# if ( data.attachment.width ) { #>width="{{ data.attachment.width }}"<# } #>
     781                                <# if ( data.attachment.height ) { #>height="{{ data.attachment.height }}"<# } #>
     782                                <# if ( data.attachment.image && data.attachment.image.src !== data.attachment.icon ) { #>poster="{{ data.attachment.image.src }}"<# } #>>
     783                                <source type="{{ data.attachment.mime }}" src="{{ data.attachment.url }}"/>
     784                            </video>
     785                        </div>
     786                    <# } #>
     787                </div>
    689788            </div>
    690         </label>
     789            <a class="button upload-button" id="{{ data.settings.default }}-button" href="#"><?php echo $this->button_labels['change']; ?></a>
     790            <# if ( data.defaultAttachment && data.defaultAttachment.id !== data.attachment.id ) { #>
     791                <a class="default-button remove-button" href="#"><?php echo $this->button_labels['default']; ?></a>
     792            <# } else { #>
     793                <a class="remove-button" href="#"><?php echo $this->button_labels['remove']; ?></a>
     794            <# } #>
     795        <# } else { #>
     796            <p class="placeholder-text"><?php echo $this->button_labels['placeholder']; ?></p>
     797            <a class="button upload-button" id="{{ data.settings.default }}-button" href="#"><?php echo $this->button_labels['select']; ?></a>
     798            <# if ( ! data.defaultAttachment ) { #>
     799                <a class="default-button remove-button" href="#"><?php echo $this->button_labels['default']; ?></a>
     800            <# } #>
     801        <# } #>
    691802        <?php
    692803    }
     
    702813class WP_Customize_Image_Control extends WP_Customize_Upload_Control {
    703814    public $type = 'image';
    704     public $get_url;
    705     public $statuses;
    706     public $extensions = array( 'jpg', 'jpeg', 'gif', 'png' );
    707 
    708     protected $tabs = array();
     815    public $mime_type = 'image';
    709816
    710817    /**
     
    715822     *
    716823     * @param WP_Customize_Manager $manager
    717      * @param string $id
    718      * @param array $args
    719      */
    720     public function __construct( $manager, $id, $args ) {
    721         $this->statuses = array( '' => __('No Image') );
    722 
     824     */
     825    public function __construct( $manager, $id, $args = array() ) {
    723826        parent::__construct( $manager, $id, $args );
    724827
    725         $this->add_tab( 'upload-new', __('Upload New'), array( $this, 'tab_upload_new' ) );
    726         $this->add_tab( 'uploaded',   __('Uploaded'),   array( $this, 'tab_uploaded' ) );
    727 
    728         // Early priority to occur before $this->manager->prepare_controls();
    729         add_action( 'customize_controls_init', array( $this, 'prepare_control' ), 5 );
    730     }
    731 
    732     /**
    733      * Prepares the control.
    734      *
    735      * If no tabs exist, removes the control from the manager.
    736      *
     828        $this->button_labels = array(
     829            'select'       => __( 'Select Image' ),
     830            'change'       => __( 'Change Image' ),
     831            'remove'       => __( 'Remove' ),
     832            'default'      => __( 'Default' ),
     833            'placeholder'  => __( 'No image selected' ),
     834            'frame_title'  => __( 'Select Image' ),
     835            'frame_button' => __( 'Choose Image' ),
     836        );
     837    }
     838
     839    /**
    737840     * @since 3.4.2
    738      */
    739     public function prepare_control() {
    740         if ( ! $this->tabs )
    741             $this->manager->remove_control( $this->id );
    742     }
    743 
    744     /**
    745      * Refresh the parameters passed to the JavaScript via JSON.
    746      *
    747      * @since 3.4.0
    748      * @uses WP_Customize_Upload_Control::to_json()
    749      */
    750     public function to_json() {
    751         parent::to_json();
    752         $this->json['statuses'] = $this->statuses;
    753     }
    754 
    755     /**
    756      * Render the control's content.
    757      *
    758      * @since 3.4.0
    759      */
    760     public function render_content() {
    761         $src = $this->value();
    762         if ( isset( $this->get_url ) )
    763             $src = call_user_func( $this->get_url, $src );
    764 
    765         ?>
    766         <div class="customize-image-picker">
    767             <?php if ( ! empty( $this->label ) ) : ?>
    768                 <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
    769             <?php endif;
    770             if ( ! empty( $this->description ) ) : ?>
    771                 <span class="description customize-control-description"><?php echo $this->description; ?></span>
    772             <?php endif; ?>
    773 
    774             <div class="customize-control-content">
    775                 <div class="dropdown preview-thumbnail" tabindex="0">
    776                     <div class="dropdown-content">
    777                         <?php if ( empty( $src ) ): ?>
    778                             <img style="display:none;" />
    779                         <?php else: ?>
    780                             <img src="<?php echo esc_url( set_url_scheme( $src ) ); ?>" />
    781                         <?php endif; ?>
    782                         <div class="dropdown-status"></div>
    783                     </div>
    784                     <div class="dropdown-arrow"></div>
    785                 </div>
    786             </div>
    787 
    788             <div class="library">
    789                 <ul>
    790                     <?php foreach ( $this->tabs as $id => $tab ): ?>
    791                         <li data-customize-tab='<?php echo esc_attr( $id ); ?>' tabindex='0'>
    792                             <?php echo esc_html( $tab['label'] ); ?>
    793                         </li>
    794                     <?php endforeach; ?>
    795                 </ul>
    796                 <?php foreach ( $this->tabs as $id => $tab ): ?>
    797                     <div class="library-content" data-customize-tab='<?php echo esc_attr( $id ); ?>'>
    798                         <?php call_user_func( $tab['callback'] ); ?>
    799                     </div>
    800                 <?php endforeach; ?>
    801             </div>
    802 
    803             <div class="actions">
    804                 <a href="#" class="remove"><?php _e( 'Remove Image' ); ?></a>
    805             </div>
    806         </div>
    807         <?php
    808     }
    809 
    810     /**
    811      * Add a tab to the control.
    812      *
    813      * @since 3.4.0
     841     * @deprecated 4.1.0
     842     */
     843    public function prepare_control() {}
     844
     845    /**
     846     * @since 3.4.0
     847     * @deprecated 4.1.0
    814848     *
    815849     * @param string $id
     
    817851     * @param mixed $callback
    818852     */
    819     public function add_tab( $id, $label, $callback ) {
    820         $this->tabs[ $id ] = array(
    821             'label'    => $label,
    822             'callback' => $callback,
    823         );
    824     }
    825 
    826     /**
    827      * Remove a tab from the control.
    828      *
    829      * @since 3.4.0
     853    public function add_tab( $id, $label, $callback ) {}
     854
     855    /**
     856     * @since 3.4.0
     857     * @deprecated 4.1.0
    830858     *
    831859     * @param string $id
    832860     */
    833     public function remove_tab( $id ) {
    834         unset( $this->tabs[ $id ] );
    835     }
    836 
    837     /**
    838      * @since 3.4.0
    839      */
    840     public function tab_upload_new() {
    841         if ( ! _device_can_upload() ) {
    842             echo '<p>' . sprintf( __('The web browser on your device cannot be used to upload files. You may be able to use the <a href="%s">native app for your device</a> instead.'), 'https://apps.wordpress.org/' ) . '</p>';
    843         } else {
    844             ?>
    845             <div class="upload-dropzone">
    846                 <?php _e('Drop a file here or <a href="#" class="upload">select a file</a>.'); ?>
    847             </div>
    848             <div class="upload-fallback">
    849                 <span class="button-secondary"><?php _e('Select File'); ?></span>
    850             </div>
    851             <?php
    852         }
    853     }
    854 
    855     /**
    856      * @since 3.4.0
    857      */
    858     public function tab_uploaded() {
    859         ?>
    860         <div class="uploaded-target"></div>
    861         <?php
    862     }
    863 
    864     /**
    865      * @since 3.4.0
     861    public function remove_tab( $id ) {}
     862
     863    /**
     864     * @since 3.4.0
     865     * @deprecated 4.1.0
    866866     *
    867867     * @param string $url
    868868     * @param string $thumbnail_url
    869869     */
    870     public function print_tab_image( $url, $thumbnail_url = null ) {
    871         $url = set_url_scheme( $url );
    872         $thumbnail_url = ( $thumbnail_url ) ? set_url_scheme( $thumbnail_url ) : $url;
    873         ?>
    874         <a href="#" class="thumbnail" data-customize-image-value="<?php echo esc_url( $url ); ?>">
    875             <img src="<?php echo esc_url( $thumbnail_url ); ?>" />
    876         </a>
    877         <?php
    878     }
     870    public function print_tab_image( $url, $thumbnail_url = null ) {}
    879871}
    880872
     
    900892            'label'    => __( 'Background Image' ),
    901893            'section'  => 'background_image',
    902             'context'  => 'custom-background',
    903             'get_url'  => 'get_background_image',
    904894        ) );
    905 
    906         if ( $this->setting->default )
    907             $this->add_tab( 'default',  __('Default'),  array( $this, 'tab_default_background' ) );
    908     }
    909 
    910     /**
    911      * @since 3.4.0
    912      */
    913     public function tab_uploaded() {
    914         $backgrounds = get_posts( array(
    915             'post_type'  => 'attachment',
    916             'meta_key'   => '_wp_attachment_is_custom_background',
    917             'meta_value' => $this->manager->get_stylesheet(),
    918             'orderby'    => 'none',
    919             'nopaging'   => true,
    920         ) );
    921 
    922         ?><div class="uploaded-target"></div><?php
    923 
    924         if ( empty( $backgrounds ) )
    925             return;
    926 
    927         foreach ( (array) $backgrounds as $background )
    928             $this->print_tab_image( esc_url_raw( $background->guid ) );
    929     }
    930 
    931     /**
    932      * @since 3.4.0
    933      * @uses WP_Customize_Image_Control::print_tab_image()
    934      */
    935     public function tab_default_background() {
    936         $this->print_tab_image( $this->setting->default );
    937895    }
    938896}
Note: See TracChangeset for help on using the changeset viewer.