Пользовательская коллекция в менеджере медиа

Вопрос или проблема

Я работаю над плагином, который расширяет медиаменеджер, загружает данные на основе JSON для отображения своей собственной коллекции изображений и может загружать их в библиотеку медиа моего WordPress.

Пока у меня есть своя вкладка, я могу разместить свой контент в рамках, но единственный способ, который я нашел для добавления данных JSON в контент, был с помощью «базовых» функций jQuery.

В первую очередь, меня интересует возможность создания собственной коллекции вложений и в основном управление ею с помощью предоставленной функции, чтобы она выглядела, например, как во вкладке «галерея». Чтобы изображения были кликабельными, а выбранные можно было загружать в мою библиотеку.

Вот фрагмент моего расширенного представления контента на данный момент:

wp.media.view.CustomView = wp.media.View.extend({
className: 'media-fap',

initialize: function() {
    this.input = "asdf";
    var el = this.$el;

    jQuery.getJSON( "http://192.168.11.47/fap/wp-json/image", function( data ) {
        console.log("получить json");

        var output="<ul>";
        for(i in data) {
            var item = data[i];

            output += '<li><img src="' + item.thumbnail + '"></li>';
        }

        output += '</ul>';

        el.append(output);
    });

    // вставить в представление
    //this.$el.append("this.input");
    console.log("пользовательский контент");

    // перерисовать представление при изменении модели
    this.model.on( 'change:custom_data', this.render, this );
},

render: function(){
    this.input.value = this.model.get('custom_data');
    return this;
},

custom_update: function( event ) {
    this.model.set( 'custom_data', event.target.value );
}
});

Мы имеем фрагмент моего расширенного представления контента, который может расширить стандартный медиаменеджер для отображения пользовательской коллекции на основе входных данных JSON:

Пожалуйста, попробуйте эту логику:

initialize: function() {
    this.collection = new wp.media.model.Attachments();
    this.fetchJSONData();
},

Получить данные JSON и заполнить коллекцию

fetchJSONData: function() {
    var view = this;

    jQuery.getJSON("http://192.168.11.47/fap/wp-json/image", function(data) {
        var attachments = [];

        // Преобразовать данные JSON в модели вложений
        for (var i in data) {
            var item = data[i];
            attachments.push(new wp.media.model.Attachment({
                id: item.id, // Уникальный ID для каждого изображения
                url: item.thumbnail, // URL миниатюры
                title: item.title // Любые другие данные, которые вы хотите отслеживать
            }));
        }

        // Добавить полученные данные в коллекцию
        view.collection.reset(attachments);

        // Перерисовать представление коллекции
        view.render();
    });
},

Отрисовать коллекцию с использованием встроенного представления вложений

render: function() {
    var attachmentsView = new wp.media.view.Attachments({
        collection: this.collection
    });

    this.$el.empty().append(attachmentsView.render().el);

    // Обработать событие клика для выбора/снятия выбора изображений
    this.attachHandlers(attachmentsView);
    
    return this;
},

Обработка логики клика/выбора изображения

attachHandlers: function(attachmentsView) {
    attachmentsView.collection.each(function(attachment) {
        var attachmentView = new wp.media.view.Attachment({
            model: attachment
        });

        attachmentView.$el.on('click', function() {
            attachment.set('selected', !attachment.get('selected'));
            attachmentView.$el.toggleClass('selected', attachment.get('selected'));

            if (attachment.get('selected')) {
                console.log('Выбрано:', attachment.get('url'));
                // Добавьте логику загрузки здесь
            }
        });
    });
}

Ответ или решение

Для создания собственной коллекции в медиа-менеджере WordPress, которая будет основана на данных в формате JSON и позволит загружать выбранные изображения в медиабиблиотеку, вы можете использовать следующий подход. Ниже перечислены необходимые изменения и дополнительные функции для вашего кода.

1. Инициализация коллекции

Сначала мы создадим новую коллекцию для хранения ваших вложений. Мы также реализуем метод для загрузки данных из вашего JSON-источника.

wp.media.view.CustomView = wp.media.View.extend({
    className: 'media-fap',

    initialize: function() {
        this.collection = new wp.media.model.Attachments(); // Создаем коллекцию вложений
        this.fetchJSONData(); // Загружаем данные JSON
    },

    fetchJSONData: function() {
        var view = this;

        jQuery.getJSON("http://192.168.11.47/fap/wp-json/image", function(data) {
            var attachments = [];

            // Преобразуем данные JSON в модели вложений
            jQuery.each(data, function(index, item) {
                attachments.push(new wp.media.model.Attachment({
                    id: item.id, // Уникальный ID изображения
                    url: item.thumbnail, // URL миниатюры
                    title: item.title // Любые другие данные, которые хотите отслеживать
                }));
            });

            // Добавляем полученные данные в коллекцию
            view.collection.reset(attachments);

            // Перерисовываем представление коллекции
            view.render();
        });
    },

    render: function() {
        var attachmentsView = new wp.media.view.Attachments({
            collection: this.collection
        });

        this.$el.empty().append(attachmentsView.render().el);

        // Обрабатываем событие клика для выбора/снятия выбора изображений
        this.attachHandlers(attachmentsView);

        return this;
    },

    attachHandlers: function(attachmentsView) {
        attachmentsView.collection.each(function(attachment) {
            var attachmentView = new wp.media.view.Attachment({
                model: attachment
            });

            // Добавляем обработчик клика
            attachmentView.$el.on('click', function() {
                attachment.set('selected', !attachment.get('selected'));
                attachmentView.$el.toggleClass('selected', attachment.get('selected'));

                if (attachment.get('selected')) {
                    console.log('Выбрано:', attachment.get('url'));
                    // Логика загрузки здесь
                }
            });
        });
    }
});

2. Загрузка выбранных изображений в медиабиблиотеку

Для реализации функционала загрузки выбранных изображений в медиабиблиотеку вам нужно будет создать кнопку и обработчик событий для этого действия. Ниже представлен пример кода для этого:

wp.media.view.CustomView.prototype.renderUploadButton = function() {
    var uploadButton = jQuery('<button class="button upload-button">Загрузить выбранные изображения</button>');
    var view = this;

    uploadButton.on('click', function() {
        // Получаем выбранные изображения
        var selectedAttachments = view.collection.filter(function(attachment) {
            return attachment.get('selected');
        });

        // Логика загрузки изображений
        jQuery.each(selectedAttachments, function(index, attachment) {
            // Пример загрузки с использованием REST API
            console.log('Загрузка изображения:', attachment.get('url'));

            // Здесь должна быть логика загрузки в библиотеку
        });
    });

    this.$el.append(uploadButton);
};

// Вызов метода вставки кнопки при рендеринге
render: function() {
    var attachmentsView = new wp.media.view.Attachments({
        collection: this.collection
    });

    this.$el.empty().append(attachmentsView.render().el);
    this.attachHandlers(attachmentsView);

    // Вставляем кнопку загрузки
    this.renderUploadButton();

    return this;
}

Заключение

С помощью приведённого выше кода вы сможете создать собственную коллекцию изображений в медиа-менеджере WordPress, позволяя пользователям выбирать изображения и загружать их в медиабиблиотеку. Убедитесь, что в вашей среде WordPress включен REST API, чтобы избежать проблем с загрузкой данных.

Этот подход позволяет использовать мощные возможности WordPress медиа-менеджера, расширяя его функциональность под ваши нужды. Если у вас возникнут дополнительные вопросы или сложности, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...