/** * JS for handling the Site Logo Customizer control. */ (function( wp, $ ){ // nice shortcut var api = wp.customize; /** * The Customizer looks for wp.customizer.controlConstructor[type] functions * where type == the type member of a WP_Customize_Control */ api.controlConstructor.site_logo = api.Control.extend({ /** * This method is called when the control is ready to run. * Do all of your setup and event binding here. */ ready: function() { // this.container is a jQuery object of your container // grab the bits of data from the title for specifying this control var data = this.container.find( '.customize-control-title' ).data(); // Use specific l10n data for this control where available this.l10n = data.l10n; // Grab mime type this.mime = data.mime; // Set up image container and button elements. Cache for re-use. this.$imgContainer = $( '#customize-control-site_logo .current' ); this.$btnContainer = $( '#customize-control-site_logo .actions' ); this.$img = $( '' ).prependTo( this.$imgContainer ); this.$placeholder = $( '' + this.l10n.placeholder + '' ).prependTo( this.$imgContainer ); this.$btnAdd = $( '' ).prependTo( this.$btnContainer ); this.$btnChange = $( '' ).prependTo( this.$btnContainer ); this.$btnRemove = $( '' ).prependTo( this.$btnContainer ); // handy shortcut so we don't have to us _.bind every time we add a callback _.bindAll( this, 'removeImg', 'upload', 'render', 'pick' ); this.$btnAdd.on( 'click', this.upload ); this.$btnChange.on( 'click', this.upload ); this.$btnRemove.on( 'click', this.removeImg ); // Call render method whenever setting is changed. this.setting.bind( 'change', this.render ); // Do initial rendering. this.render(); }, /** * Remember that _.bind was used to maintain `this` as the control * object rather than the usual jQuery way of binding to the DOM element. */ upload: function( event ) { event.preventDefault(); if ( ! this.frame ) { this.initFrame(); } this.frame.open(); }, /** * Set the media frame so that it can be reused and accessed when needed. */ initFrame: function() { this.frame = wp.media({ // The title of the media modal title: this.l10n.choose, // restrict to specified mime type library: { type: this.mime }, // Customize the submit button. button: { // Set the text of the button. text: this.l10n.set }, // Just one, thanks. multiple: false }); // When an image is selected, run a callback. this.frame.on( 'select', this.pick ); }, /** * Fired when an image is selected in the media modal. Gets the selected * image information, and sets it within the control. */ pick: function() { // get the attachment from the modal frame var attachment = this.frame.state().get( 'selection' ).single(); if ( 'image' === attachment.get( 'type' ) ) { // set the setting - the callback will take care of rendering this.setting( this.reduceMembers( attachment.toJSON() ) ); } }, /** * Reduces the attachment object to just the few desired members. * @param {object} attachment An attachment object provided by the * medial modal. * @return {object} A reduced media object. */ reduceMembers: function( attachment ) { var desired = [ 'id', 'sizes', 'url' ], output = {}; $.each( desired, function( i, key ){ output[key] = attachment[key]; }); return output; }, /** * Called on init and whenever a setting is changed. Shows the thumbnail * when there is one or the upload button when there isn't. */ render: function() { var value = this.setting(); if ( value && value.url ) { this.$placeholder.hide(); if ( ! value.sizes || ! value.sizes.medium ) { this.$img.attr( 'src', value.url ); } else { this.$img.attr( 'src', value.sizes.medium.url ); } this.$img.show(); this.$btnRemove.show(); this.$btnChange.show(); this.$btnAdd.hide(); } else { this.$img.hide(); this.$placeholder.show(); this.$btnRemove.hide(); this.$btnChange.hide(); this.$btnAdd.show(); } }, /** * Called when the "Remove Image" link is clicked. Sets thes setting back * to its default state. * @param {object} event jQuery Event object from click event */ removeImg: function( event ) { event.preventDefault(); this.setting( { url: '', id: 0 } ); } }); })( this.wp, jQuery );