Come posso aggiungere la scheda "Inserisci da URL" a un Uploader multimediale personalizzato 3.5?


17

Ho inserito un uploader multimediale WP 3.5 in un widget eseguendo questo JavaScript quando si fa clic su un pulsante:

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;

Questo mi dà un modale che ha le schede "Carica file" e "Libreria multimediale", ma voglio anche che abbia la scheda "Inserisci da URL" che ottieni quando fai clic sul pulsante "Aggiungi file multimediali" durante la modifica di un post /pagina.

inserisci qui la descrizione dell'immagine

Ho trascorso un paio d'ore a cercare sul web, a leggere il codice sorgente e a guardare la presentazione di Daryl Koopersmith sul backend del caricatore , ma non sono riuscito a capirlo.

Qualcuno può indicarmi la giusta direzione? Esiste un parametro che posso passare a wp.media () per includerlo o dovrei usare una delle viste / modelli incorporati che lo include?


Forse un indizio in una soluzione caotica, ma quando fai clic su "seleziona i file" puoi incollare un URL in Esplora file che si apre, anziché in un percorso di file.
Wyck,

Stai parlando del modale Open File del sistema operativo? Questo non funziona per me in Fedora, quindi potrebbe dipendere dal sistema operativo. Questo vale anche per un plug-in distribuito, quindi l'interfaccia utente deve essere intuitiva.
Ian Dunn,

sì, funziona bene su alcuni sistemi operativi.
Wyck,

Risposte:


10

Ho cercato il codice sorgente per un motivo simile; Vorrei aggiungere le "Impostazioni di visualizzazione degli allegati" al frame "select" predefinito. Per quanto ne so, questo non può essere fatto passando i parametri a wp.media (), come vorremmo tutti. wp.media attualmente ha i due frame ("post" e "select") e le viste che li accompagnano sono preimpostate.

L'approccio che sto guardando ora è quello di estendere media.view.mediaFrame per creare un nuovo frame (basato sul frame "select") che includa le parti della vista di cui ho bisogno. Se riesco a farlo funzionare, posterò il codice.

MODIFICARE:

Ian, ho ottenuto la funzione che volevo lavorare e ho impiegato del tempo per capire il tuo. wp.media () non è così modulare come potrebbe essere. Accetta solo i valori 'select' e 'post' per frame, con 'select' come predefinito, quindi non puoi creare un nuovo oggetto frame. Invece, è necessario estendere uno dei due oggetti frame (tutto ciò è in /wp-includes/js/media-views.js), che è anche un po 'goffo. L'aggiunta di parte dell'interfaccia utente è un processo in più passaggi. Potresti iniziare con Seleziona e aggiungi, ma per il tuo ho scelto di iniziare con il codice nel frame Post e portare via la galleria. Ecco il mio codice, funzionante ma non pesantemente testato. Probabilmente anche un po 'di spazio per razionalizzare.

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'
                });
            }

    });

Questo combina il codice di wp.media.view.MediaFrame.Post con quello di media.view.MediaFrame.Select, adattandosi al fatto che questo viene eseguito al di fuori dell'ambito originale. I valori per il testo sono i vari pulsanti e, se lo si desidera, è possibile fare riferimento al proprio oggetto di localizzazione. Il valore 'filtrabile' nel costruttore Libreria (in createStates ()) determina quali tipi di media saranno supportati.

Dopo aver esteso l'oggetto Seleziona con questo approccio, basta istanziarlo nello stesso modo in cui ci si trova attualmente e aggiungere il gestore personalizzato per quando si seleziona un'immagine. L'Insert from Url potrebbe generare un evento diverso rispetto a quando si preleva dal supporto caricato. Probabilmente sarebbe meglio istanziare prima il frame, in realtà, e quindi estenderlo, in modo che qualsiasi altro frame multimediale sulla pagina rimanga inalterato, ma non ho provato questo.

Spero possa aiutare-


Grazie Brendan, è la stessa conclusione a cui sono arrivato. Ho provato ad estendere il frame Post, ma non sono riuscito a farlo funzionare rapidamente e ho dovuto adottare un approccio diverso. Mi piacerebbe vedere il codice se lo fai funzionare, però.
Ian Dunn,

@IanDunn Questa domanda ha diversi anni, ma sto scoprendo che ho bisogno della stessa soluzione. Negli anni hai mantenuto una soluzione testata e matura? O trovi plugin o altre soluzioni che soddisfino le tue esigenze? Se si dispone del codice corrente o di una soluzione, è possibile pubblicarlo come risposta aggiornata? Grazie!
user658182

1

Dall'esame del codice sorgente sembra che il modale multimediale generico non supporti "Inserisci da URL". L'unico modo in cui sono stato in grado di ottenere quella scheda era specificare il tipo di frame "post":

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

Il rovescio della medaglia è il titolo modale specificato viene ignorato.


Funziona in parte, ma il pulsante dice "Inserisci in un post" e in realtà non invia nulla, probabilmente perché si aspetta di essere su un post, anziché all'interno di un widget. Aggiunge anche la scheda Crea galleria, che non desidero, poiché non è possibile inserirli nel widget.
Ian Dunn,

0

Il punto è che quella scheda restituisce un URL esterno da inserire direttamente nel post, mentre il widget dovrebbe restituire un ID media. Fondamentalmente l'immagine esterna deve essere trasferita sul server.

Scopri come / se il plugin Grab & Save fa quello che vuoi. ( via )


Se il plugin lo fa o no, sarei interessato a vedere come lo fa, puoi ellaborare?
Tom J Nowell

La libreria multimediale non gestisce il download dell'immagine esterna sul server locale per te? Anche se non lo è, la domanda principale è: come si fa a mostrare la scheda in primo luogo?
Ian Dunn,

Ho controllato e la libreria multimediale non scarica / allega immagini inserite da URL; si collega direttamente a loro. Questo non è molto rilevante per la domanda, tuttavia, mi occupo solo di come aggiungere la scheda Inserisci da URL al modale.
Ian Dunn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.