mirror of
https://github.com/WordPress/WordPress.git
synced 2024-08-30 17:49:38 +02:00
* The way that the JS modules for media are currently set up turns the existing global `wp.media` namespace into a read-only API, this is bad. * For the existing module implementation to work with plugins, those looking to override or extend a class would have to modify their own plugin to use `browserify` - we can't expect this to happen * Because the general way that plugins override media classes is via machete (resetting them to something else), we cannot use `require( 'module' )` in the internal code for media modules We CAN continue to use `require( 'fun/js' )` in the manifests for media. Future code/projects should carefully consider what is made to be public API. In 3.5, EVERYTHING was made public, so everything shall remain public. See #31684, #28510. Built from https://develop.svn.wordpress.org/trunk@31935 git-svn-id: http://core.svn.wordpress.org/trunk@31914 1a063a9b-81f0-0310-95a4-ce76da25c4cd
155 lines
3.6 KiB
JavaScript
155 lines
3.6 KiB
JavaScript
/*globals Backbone */
|
|
|
|
/**
|
|
* wp.media.model.PostImage
|
|
*
|
|
* An instance of an image that's been embedded into a post.
|
|
*
|
|
* Used in the embedded image attachment display settings modal - @see wp.media.view.MediaFrame.ImageDetails.
|
|
*
|
|
* @class
|
|
* @augments Backbone.Model
|
|
*
|
|
* @param {int} [attributes] Initial model attributes.
|
|
* @param {int} [attributes.attachment_id] ID of the attachment.
|
|
**/
|
|
var PostImage = Backbone.Model.extend({
|
|
|
|
initialize: function( attributes ) {
|
|
var Attachment = wp.media.model.Attachment;
|
|
this.attachment = false;
|
|
|
|
if ( attributes.attachment_id ) {
|
|
this.attachment = Attachment.get( attributes.attachment_id );
|
|
if ( this.attachment.get( 'url' ) ) {
|
|
this.dfd = jQuery.Deferred();
|
|
this.dfd.resolve();
|
|
} else {
|
|
this.dfd = this.attachment.fetch();
|
|
}
|
|
this.bindAttachmentListeners();
|
|
}
|
|
|
|
// keep url in sync with changes to the type of link
|
|
this.on( 'change:link', this.updateLinkUrl, this );
|
|
this.on( 'change:size', this.updateSize, this );
|
|
|
|
this.setLinkTypeFromUrl();
|
|
this.setAspectRatio();
|
|
|
|
this.set( 'originalUrl', attributes.url );
|
|
},
|
|
|
|
bindAttachmentListeners: function() {
|
|
this.listenTo( this.attachment, 'sync', this.setLinkTypeFromUrl );
|
|
this.listenTo( this.attachment, 'sync', this.setAspectRatio );
|
|
this.listenTo( this.attachment, 'change', this.updateSize );
|
|
},
|
|
|
|
changeAttachment: function( attachment, props ) {
|
|
this.stopListening( this.attachment );
|
|
this.attachment = attachment;
|
|
this.bindAttachmentListeners();
|
|
|
|
this.set( 'attachment_id', this.attachment.get( 'id' ) );
|
|
this.set( 'caption', this.attachment.get( 'caption' ) );
|
|
this.set( 'alt', this.attachment.get( 'alt' ) );
|
|
this.set( 'size', props.get( 'size' ) );
|
|
this.set( 'align', props.get( 'align' ) );
|
|
this.set( 'link', props.get( 'link' ) );
|
|
this.updateLinkUrl();
|
|
this.updateSize();
|
|
},
|
|
|
|
setLinkTypeFromUrl: function() {
|
|
var linkUrl = this.get( 'linkUrl' ),
|
|
type;
|
|
|
|
if ( ! linkUrl ) {
|
|
this.set( 'link', 'none' );
|
|
return;
|
|
}
|
|
|
|
// default to custom if there is a linkUrl
|
|
type = 'custom';
|
|
|
|
if ( this.attachment ) {
|
|
if ( this.attachment.get( 'url' ) === linkUrl ) {
|
|
type = 'file';
|
|
} else if ( this.attachment.get( 'link' ) === linkUrl ) {
|
|
type = 'post';
|
|
}
|
|
} else {
|
|
if ( this.get( 'url' ) === linkUrl ) {
|
|
type = 'file';
|
|
}
|
|
}
|
|
|
|
this.set( 'link', type );
|
|
},
|
|
|
|
updateLinkUrl: function() {
|
|
var link = this.get( 'link' ),
|
|
url;
|
|
|
|
switch( link ) {
|
|
case 'file':
|
|
if ( this.attachment ) {
|
|
url = this.attachment.get( 'url' );
|
|
} else {
|
|
url = this.get( 'url' );
|
|
}
|
|
this.set( 'linkUrl', url );
|
|
break;
|
|
case 'post':
|
|
this.set( 'linkUrl', this.attachment.get( 'link' ) );
|
|
break;
|
|
case 'none':
|
|
this.set( 'linkUrl', '' );
|
|
break;
|
|
}
|
|
},
|
|
|
|
updateSize: function() {
|
|
var size;
|
|
|
|
if ( ! this.attachment ) {
|
|
return;
|
|
}
|
|
|
|
if ( this.get( 'size' ) === 'custom' ) {
|
|
this.set( 'width', this.get( 'customWidth' ) );
|
|
this.set( 'height', this.get( 'customHeight' ) );
|
|
this.set( 'url', this.get( 'originalUrl' ) );
|
|
return;
|
|
}
|
|
|
|
size = this.attachment.get( 'sizes' )[ this.get( 'size' ) ];
|
|
|
|
if ( ! size ) {
|
|
return;
|
|
}
|
|
|
|
this.set( 'url', size.url );
|
|
this.set( 'width', size.width );
|
|
this.set( 'height', size.height );
|
|
},
|
|
|
|
setAspectRatio: function() {
|
|
var full;
|
|
|
|
if ( this.attachment && this.attachment.get( 'sizes' ) ) {
|
|
full = this.attachment.get( 'sizes' ).full;
|
|
|
|
if ( full ) {
|
|
this.set( 'aspectRatio', full.width / full.height );
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.set( 'aspectRatio', this.get( 'customWidth' ) / this.get( 'customHeight' ) );
|
|
}
|
|
});
|
|
|
|
module.exports = PostImage;
|