Làm cách nào tôi có thể thêm Chèn chèn từ tab Thẻ URL vào Trình tải lên phương tiện tùy chỉnh 3.5?


17

Tôi đã chèn trình tải lên phương tiện WP 3.5 vào một tiện ích bằng cách chạy JavaScript này khi nhấp vào nút:

var frame = wp.media( {
    title       : 'Widget Uploader',
    multiple    : false,
    library     : { type : 'image' },
    button      : { text : 'Select Image' }
} );

frame.on( 'close', function() {
    var attachments = frame.state().get( 'selection' ).toJSON();
    imageWidget.render( widget_id, widget_id_string, attachments[0] );
} );

frame.open();
return false;

Điều đó mang lại cho tôi một phương thức có các tab "Tải lên tệp" và "Thư viện phương tiện", nhưng tôi cũng muốn nó có tab "Chèn từ URL" mà bạn nhận được khi nhấp vào nút "Thêm phương tiện" trong khi chỉnh sửa bài đăng /trang.

nhập mô tả hình ảnh ở đây

Tôi đã dành vài giờ để tìm hiểu trên web, đọc qua mã nguồn và xem bài thuyết trình của Daryl Koopersmith trên phần phụ trợ của người tải lên , nhưng không thể hiểu được.

Ai đó có thể chỉ cho tôi đi đúng hướng? Có một tham số nào tôi có thể chuyển đến wp.media () để đưa nó vào hay tôi nên sử dụng một trong các chế độ xem / mô hình tích hợp có chứa nó?


Có thể là một đầu mối vào một giải pháp hacky, nhưng khi bạn nhấp vào "chọn tệp", bạn có thể qua một url vào trình duyệt tệp mở ra, thay vì vị trí tệp.
Wyck

Bạn đang nói về phương thức Open File của hệ điều hành? Điều đó không phù hợp với tôi ở Fedora, vì vậy nó có thể phụ thuộc vào hệ điều hành. Đây cũng là một plugin phân tán, vì vậy UI cần phải trực quan.
Ian Dunn

đúng, nó hoạt động trên một số hệ điều hành.
Wyck

Câu trả lời:


10

Tôi đã đào qua mã nguồn vì một lý do tương tự; Tôi muốn thêm "Cài đặt hiển thị tệp đính kèm" vào khung "chọn" mặc định. Theo như tôi có thể nói, điều này không thể được thực hiện bằng cách chuyển tham số cho wp.media (), như tất cả chúng ta đều muốn. wp.media hiện có hai khung ("bài" và "chọn") và các chế độ xem đi kèm với chúng được đặt trước.

Cách tiếp cận tôi đang tìm kiếm bây giờ là mở rộng media.view.mediaFrame để tạo khung mới (dựa trên khung "chọn") bao gồm các phần của chế độ xem tôi cần. Nếu tôi làm việc này tôi sẽ đăng mã.

BIÊN TẬP:

Ian, tôi có tính năng tôi muốn làm việc và mất một thời gian để tìm ra tính năng của bạn. wp.media () không hoàn toàn như mô-đun như nó có thể. Nó chỉ chấp nhận các giá trị 'select' và 'post' cho khung, với 'select' là mặc định, vì vậy bạn không thể tạo một đối tượng khung mới. Thay vào đó, bạn cần mở rộng một trong hai đối tượng khung (tất cả điều này nằm trong /wp-includes/js/media-view.js), đây cũng là một loại khó hiểu. Thêm một phần của giao diện người dùng là một quá trình gồm nhiều bước. Bạn có thể bắt đầu với Chọn và thêm vào, nhưng đối với bạn, tôi đã chọn bắt đầu với mã trong khung Đăng và lấy đi các nội dung thư viện. Đây là mã của tôi, hoạt động nhưng không được kiểm tra nhiều. Có lẽ một số phòng để tinh giản, quá.

wp.media.view.MediaFrame.Select = wp.media.view.MediaFrame.Select.extend({

            initialize: function() {
                wp.media.view.MediaFrame.prototype.initialize.apply( this, arguments );

                _.defaults( this.options, {
                    multiple:  true,
                    editing:   false,
                    state:    'insert'
                });

                this.createSelection();
                this.createStates();
                this.bindHandlers();
                this.createIframeStates();
            },

            createStates: function() {
                var options = this.options;

                // Add the default states.
                this.states.add([
                    // Main states.
                    new wp.media.controller.Library({
                        id:         'insert',
                        title:      'Insert Media',
                        priority:   20,
                        toolbar:    'main-insert',
                        filterable: 'image',
                        library:    wp.media.query( options.library ),
                        multiple:   options.multiple ? 'reset' : false,
                        editable:   true,

                        // If the user isn't allowed to edit fields,
                        // can they still edit it locally?
                        allowLocalEdits: true,

                        // Show the attachment display settings.
                        displaySettings: true,
                        // Update user settings when users adjust the
                        // attachment display settings.
                        displayUserSettings: true
                    }),

                    // Embed states.
                    new wp.media.controller.Embed(),
                ]);


                if ( wp.media.view.settings.post.featuredImageId ) {
                    this.states.add( new wp.media.controller.FeaturedImage() );
                }
            },

            bindHandlers: function() {
                // from Select
                this.on( 'router:create:browse', this.createRouter, this );
                this.on( 'router:render:browse', this.browseRouter, this );
                this.on( 'content:create:browse', this.browseContent, this );
                this.on( 'content:render:upload', this.uploadContent, this );
                this.on( 'toolbar:create:select', this.createSelectToolbar, this );
                //

                this.on( 'menu:create:gallery', this.createMenu, this );
                this.on( 'toolbar:create:main-insert', this.createToolbar, this );
                this.on( 'toolbar:create:main-gallery', this.createToolbar, this );
                this.on( 'toolbar:create:featured-image', this.featuredImageToolbar, this );
                this.on( 'toolbar:create:main-embed', this.mainEmbedToolbar, this );

                var handlers = {
                        menu: {
                            'default': 'mainMenu'
                        },

                        content: {
                            'embed':          'embedContent',
                            'edit-selection': 'editSelectionContent'
                        },

                        toolbar: {
                            'main-insert':      'mainInsertToolbar'
                        }
                    };

                _.each( handlers, function( regionHandlers, region ) {
                    _.each( regionHandlers, function( callback, handler ) {
                        this.on( region + ':render:' + handler, this[ callback ], this );
                    }, this );
                }, this );
            },

            // Menus
            mainMenu: function( view ) {
                view.set({
                    'library-separator': new wp.media.View({
                        className: 'separator',
                        priority: 100
                    })
                });
            },

            // Content
            embedContent: function() {
                var view = new wp.media.view.Embed({
                    controller: this,
                    model:      this.state()
                }).render();

                this.content.set( view );
                view.url.focus();
            },

            editSelectionContent: function() {
                var state = this.state(),
                    selection = state.get('selection'),
                    view;

                view = new wp.media.view.AttachmentsBrowser({
                    controller: this,
                    collection: selection,
                    selection:  selection,
                    model:      state,
                    sortable:   true,
                    search:     false,
                    dragInfo:   true,

                    AttachmentView: wp.media.view.Attachment.EditSelection
                }).render();

                view.toolbar.set( 'backToLibrary', {
                    text:     'Return to Library',
                    priority: -100,

                    click: function() {
                        this.controller.content.mode('browse');
                    }
                });

                // Browse our library of attachments.
                this.content.set( view );
            },

            // Toolbars
            selectionStatusToolbar: function( view ) {
                var editable = this.state().get('editable');

                view.set( 'selection', new wp.media.view.Selection({
                    controller: this,
                    collection: this.state().get('selection'),
                    priority:   -40,

                    // If the selection is editable, pass the callback to
                    // switch the content mode.
                    editable: editable && function() {
                        this.controller.content.mode('edit-selection');
                    }
                }).render() );
            },

            mainInsertToolbar: function( view ) {
                var controller = this;

                this.selectionStatusToolbar( view );

                view.set( 'insert', {
                    style:    'primary',
                    priority: 80,
                    text:     'Select Image',
                    requires: { selection: true },

                    click: function() {
                        var state = controller.state(),
                            selection = state.get('selection');

                        controller.close();
                        state.trigger( 'insert', selection ).reset();
                    }
                });
            },

            featuredImageToolbar: function( toolbar ) {
                this.createSelectToolbar( toolbar, {
                    text:  'Set Featured Image',
                    state: this.options.state || 'upload'
                });
            },

            mainEmbedToolbar: function( toolbar ) {
                toolbar.view = new wp.media.view.Toolbar.Embed({
                    controller: this,
                    text: 'Insert Image'
                });
            }

    });

Điều này kết hợp mã từ wp.media.view.MediaFrame.Post với mã đó từ media.view.MediaFrame.Select, điều chỉnh cho thực tế rằng điều này được thực hiện bên ngoài phạm vi ban đầu. Các giá trị cho văn bản là các nút khác nhau và bạn có thể tham chiếu đối tượng bản địa hóa của riêng mình nếu muốn. Giá trị 'có thể lọc' trong hàm tạo Thư viện (trong createStates ()) xác định loại phương tiện nào sẽ được hỗ trợ.

Khi bạn đã mở rộng đối tượng Chọn theo cách tiếp cận này, chỉ cần khởi tạo nó giống như hiện tại của bạn và thêm trình xử lý tùy chỉnh của bạn khi hình ảnh được chọn. Chèn từ Url có thể kích hoạt một sự kiện khác với khi chọn từ phương tiện được tải lên. Trên thực tế, có lẽ tốt hơn là khởi tạo khung hình của bạn, sau đó mở rộng nó, để bất kỳ khung phương tiện nào khác trên trang sẽ không bị ảnh hưởng, nhưng tôi đã không thử điều này.

Hy vọng rằng sẽ giúp-


Cảm ơn Brendan, đó là kết luận tương tự mà tôi đã đưa ra. Tôi đã thử mở rộng khung Post, nhưng không thể làm cho nó hoạt động nhanh được và phải thực hiện một cách tiếp cận khác. Tuy nhiên, tôi rất muốn xem mã nếu bạn làm cho nó hoạt động.
Ian Dunn

@IanDunn Câu hỏi này đã được vài năm tuổi, nhưng tôi thấy rằng tôi cần một giải pháp tương tự. Bạn đã duy trì một giải pháp trong nhiều năm đã được thử nghiệm và trưởng thành? Hoặc tìm plugin hoặc giải pháp khác đáp ứng nhu cầu của bạn? Nếu bạn có mã hiện tại hoặc giải pháp, bạn có thể đăng nó dưới dạng câu trả lời cập nhật không? Cảm ơn!
dùng658182

1

Từ examinig mã nguồn, có vẻ như phương thức truyền thông chung không hỗ trợ "Chèn từ URL". Một cách tôi có thể nhận được tab đó là chỉ định loại khung "bài":

var frame = wp.media( {
                            title       : 'Widget Uploader',
                            multiple    : false,
                            library     : { type : 'image' },
                            button      : { text : 'Select Image' },
                            frame      : 'post'
                        } );

Nhược điểm là tiêu đề của phương thức được chỉ định bị bỏ qua.


Điều đó không hoạt động một phần, nhưng nút nói "Chèn vào bài viết" và thực sự không gửi bất cứ điều gì, có lẽ vì nó dự kiến ​​sẽ ở trên một bài đăng, thay vì bên trong một tiện ích. Nó cũng thêm tab Tạo thư viện mà tôi không muốn, vì chúng không thể được chèn vào tiện ích.
Ian Dunn

0

Vấn đề là tab đó trả về một URL bên ngoài được chèn trực tiếp vào bài đăng, trong khi tiện ích được cho là trả về ID phương tiện. Về cơ bản hình ảnh bên ngoài cần phải được tải lên máy chủ.

Xem cách / liệu plugin Grab & Save có làm những gì bạn muốn không. ( thông qua )


Có phải plugin này có hay không, tôi rất muốn xem nó hoạt động như thế nào , bạn có thể đánh dấu không?
Tom J Nowell

Không phải thư viện phương tiện xử lý tải hình ảnh bên ngoài về máy chủ cục bộ cho bạn? Ngay cả khi không, câu hỏi chính là: Làm thế nào để bạn có được tab để hiển thị ở vị trí đầu tiên?
Ian Dunn

Tôi đã kiểm tra và thư viện phương tiện không tải xuống / đính kèm hình ảnh được chèn từ URL; nó chỉ liên kết trực tiếp với họ Tuy nhiên, điều đó không thực sự liên quan đến câu hỏi, tôi chỉ quan tâm đến cách thêm tab Chèn Từ URL vào phương thức.
Ian Dunn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.