Hello, usign this blog you can create multiple insert image field like product media gallery
=> first of all add below code in you ui component form
<htmlContent name="admin_gallery" sortOrder="22"> <argument name="data" xsi:type="array"> <item name="wrapper" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Admin Gallery Images</item> <item name="collapsible" xsi:type="boolean">true</item> <item name="opened" xsi:type="boolean">false</item> </item> </argument> <settings> <wrapper> <canShow>true</canShow> <componentType>fieldset</componentType> </wrapper> </settings> <block name="admin_gallery" class="Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery"> <block class="Watchcentre\AdminImages\Block\Adminhtml\Gallery\Content" as="content"> <arguments> <argument name="config" xsi:type="array"> <item name="parentComponent" xsi:type="string">product_form.product_form.block_admin_gallery.block_admin_gallery</item> </argument> </arguments> </block> </block> </htmlContent>
=> now, create Content.php at Tridhya\AdminImages\Block\Adminhtml\Gallery\Content
namespace Tridhya\AdminImages\Block\Adminhtml\Gallery; use Magento\Backend\Block\Media\Uploader; use Magento\Framework\View\Element\AbstractBlock; use Magento\Framework\App\ObjectManager; use Magento\Framework\Json\Helper\Data as JsonHelper; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Exception\FileSystemException; use Magento\Backend\Block\DataProviders\ImageUploadConfig as ImageUploadConfigDataProvider; use Magento\MediaStorage\Helper\File\Storage\Database; use Magento\Framework\Serialize\Serializer\Json; class Content extends \Magento\Backend\Block\Widget { protected $_template = 'Tridhya_AdminImages::gallery.phtml'; protected $_mediaConfig; protected $_jsonEncoder; protected $imagesFactory; protected $_jsonFramework; protected $request; private $imageHelper; private $imageUploadConfigDataProvider; private $fileStorageDatabase; public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Framework\Json\EncoderInterface $jsonEncoder, \Tridhya\AdminImages\Model\Media\Config $mediaConfig, \Magento\Framework\Registry $coreRegister, \Magento\Framework\App\RequestInterface $request, \Magento\Framework\ObjectManagerInterface $objectManager, \Tridhya\AdminImages\Model\ImagesFactory $imagesFactory, Json $jsonFramework, array $data = [], ImageUploadConfigDataProvider $imageUploadConfigDataProvider = null, Database $fileStorageDatabase = null, ?JsonHelper $jsonHelper = null ) { $this->_jsonEncoder = $jsonEncoder; $this->_mediaConfig = $mediaConfig; $this->_coreRegister = $coreRegister; $this->imagesFactory = $imagesFactory; $this->request = $request; $this->_jsonFramework = $jsonFramework; $data['jsonHelper'] = $jsonHelper ?? ObjectManager::getInstance()->get(JsonHelper::class); $this->imageUploadConfigDataProvider = $imageUploadConfigDataProvider ?: ObjectManager::getInstance()->get(ImageUploadConfigDataProvider::class); $this->fileStorageDatabase = $fileStorageDatabase ?: ObjectManager::getInstance()->get(Database::class); parent::__construct($context, $data); } /** * @return AbstractBlock */ protected function _prepareLayout() { $this->addChild( 'uploader', \Magento\Backend\Block\Media\Uploader::class, ['image_upload_config_data' => $this->imageUploadConfigDataProvider] ); $this->getUploader()->getConfig()->setUrl( $this->_urlBuilder->getUrl('adminimages/image/upload') )->setFileField( 'internal_images' )->setFilters( [ 'images' => [ 'label' => __('Images (.gif, .jpg, .png)'), 'files' => ['*.gif', '*.jpg', '*.jpeg', '*.png'], ], ] ); return parent::_prepareLayout(); } public function getUploader() { return $this->getChildBlock('uploader'); } /** * Retrieve uploader block html * * @return string */ public function getUploaderHtml() { return $this->getChildHtml('uploader'); } /** * @return string */ public function getJsObjectName() { return $this->getHtmlId() . 'JsObject'; } /** * @return string */ public function getAddImagesButton() { return $this->getButtonHtml( __('Add New Images'), $this->getJsObjectName() . '.showUploader()', 'add', $this->getHtmlId() . '_add_images_button' ); } public function getImagesJson() { $productId = $this->request->getParam('id'); $collection = $this->imagesFactory->create()->getCollection()->addFieldToFilter('product_id', $productId); $item = $collection->getFirstItem(); $internalImages = $item->getInternalImages(); if ($internalImages) { $imgArray = $this->_jsonFramework->unserialize($internalImages); $mediaDir = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA); $images = $this->sortImagesByPosition($imgArray); foreach ($images as &$image) { $image['url'] = $this->_mediaConfig->getMediaUrl($image['file']); if ($this->fileStorageDatabase->checkDbUsage() && !$mediaDir->isFile($this->_mediaConfig->getMediaPath($image['file'])) ) { $this->fileStorageDatabase->saveFileToFilesystem( $this->_mediaConfig->getMediaPath($image['file']) ); } try { $fileHandler = $mediaDir->stat($this->_mediaConfig->getMediaPath($image['file'])); $image['size'] = $fileHandler['size']; $image['media_type'] = "image"; $image['entity_id'] = $productId; $image['label'] = "Image"; $image['label_default'] = "Image"; $image['position_default'] = $image['position']; } catch (FileSystemException $e) { $image['url'] = $this->getImageHelper()->getDefaultPlaceholderUrl('small_image'); $image['size'] = 0; $this->_logger->warning($e); } } return $this->_jsonEncoder->encode($images); } return '[]'; } private function sortImagesByPosition($images) { $nullPositions = []; foreach ($images as $index => $image) { if ($image['position'] === null) { $nullPositions[] = $image; unset($images[$index]); } } if (is_array($images) && !empty($images)) { usort( $images, function ($imageA, $imageB) { return ($imageA['position'] < $imageB['position']) ? -1 : 1; } ); } return array_merge($images, $nullPositions); } /** * Retrieve media attributes * * @return array */ public function getMediaAttributes() { return $this->getElement()->getDataObject()->getMediaAttributes(); } /** * @return string */ public function getImagesValuesJson() { $values = []; foreach ($this->getMediaAttributes() as $attribute) { /* @var $attribute \Magento\Eav\Model\Entity\Attribute */ $values[$attribute->getAttributeCode()] = $this->getElement()->getDataObject()->getData( $attribute->getAttributeCode() ); } return $this->_jsonEncoder->encode($values); } public function hasUseDefault() { foreach ($this->getMediaAttributes() as $attribute) { if ($this->getElement()->canDisplayUseDefault($attribute)) { return true; } } return false; } private function getImageHelper() { if ($this->imageHelper === null) { $this->imageHelper = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Catalog\Helper\Image::class); } return $this->imageHelper; } }
=> now create Config.php at Tridhya\AdminImages\Model\Media
namespace Tridhya\AdminImages\Model\Media; use Tridhya\AdminImages\Api\Data\ConfigInterface; class Config implements ConfigInterface { protected $storeManager; /** * @param \Magento\Store\Model\StoreManagerInterface $storeManager */ public function __construct(\Magento\Store\Model\StoreManagerInterface $storeManager) { $this->storeManager = $storeManager; } /** * Filesystem directory path of product images * relatively to media folder * * @return string */ public function getBaseMediaPathAddition() { return 'catalog/admin'; } /** * Web-based directory path of product images * relatively to media folder * * @return string */ public function getBaseMediaUrlAddition() { return 'catalog/admin'; } /** * @return string */ public function getBaseMediaPath() { return 'catalog/admin'; } /** * @return string */ public function getBaseMediaUrl() { return $this->storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/admin'; } /** * Filesystem directory path of temporary product images * relatively to media folder * * @return string */ public function getBaseTmpMediaPath() { return $this->getBaseMediaPathAddition(); } /** * @return string */ public function getBaseTmpMediaUrl() { return $this->storeManager->getStore()->getBaseUrl( \Magento\Framework\UrlInterface::URL_TYPE_MEDIA ) . $this->getBaseMediaUrlAddition(); } /** * @param string $file * @return string */ public function getMediaUrl($file) { return $this->getBaseMediaUrl() . '/' . $this->_prepareFile($file); } /** * @param string $file * @return string */ public function getMediaPath($file) { return $this->getBaseMediaPath() . '/' . $this->_prepareFile($file); } /** * @param string $file * @return string */ public function getTmpMediaUrl($file) { return $this->getBaseTmpMediaUrl() . '/' . $this->_prepareFile($file); } /** * Part of URL of temporary product images * relatively to media folder * * @param string $file * @return string */ public function getTmpMediaShortUrl($file) { return $this->getBaseMediaUrlAddition() . '/' . $this->_prepareFile($file); } /** * Part of URL of product images relatively to media folder * * @param string $file * @return string */ public function getMediaShortUrl($file) { return $this->getBaseMediaUrlAddition() . '/' . $this->_prepareFile($file); } /** * @param string $file * @return string */ public function getTmpMediaPath($file) { return $this->getBaseTmpMediaPath() . '/' . $this->_prepareFile($file); } /** * @param string $file * @return string */ protected function _prepareFile($file) { return ltrim(str_replace('\\', '/', $file), '/'); } }
=> create ConfigInterface.php at Tridhya\AdminImages\Api\Data
namespace Tridhya\AdminImages\Api\Data; interface ConfigInterface { /** * Retrieve base url for media files * * @return string */ public function getBaseMediaUrl(); /** * Retrieve base path for media files * * @return string */ public function getBaseMediaPath(); /** * Retrieve url for media file * * @param string $file * @return string */ public function getMediaUrl($file); /** * Retrieve file system path for media file * * @param string $file * @return string */ public function getMediaPath($file); }
=> now, create di.xml at Tridhya\AdminImages\etc
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="Watchcentre\AdminImages\AdminImagesUpload" type="Watchcentre\AdminImages\Model\ImageUploader"> <arguments> <argument name="baseTmpPath" xsi:type="string">catalog/admin/tmp</argument> <argument name="basePath" xsi:type="string">catalog/admin</argument> <argument name="allowedExtensions" xsi:type="array"> <item name="jpg" xsi:type="string">jpg</item> <item name="jpeg" xsi:type="string">jpeg</item> <item name="gif" xsi:type="string">gif</item> <item name="png" xsi:type="string">png</item> </argument> <argument name="allowedMimeTypes" xsi:type="array"> <item name="jpg" xsi:type="string">image/jpg</item> <item name="jpeg" xsi:type="string">image/jpeg</item> <item name="gif" xsi:type="string">image/gif</item> <item name="png" xsi:type="string">image/png</item> </argument> </arguments> </virtualType> <type name="Watchcentre\AdminImages\Controller\Adminhtml\Image\Upload"> <arguments> <argument name="imageUploader" xsi:type="object">Watchcentre\AdminImages\AdminImagesUpload</argument> </arguments> </type> </config>
=> create ImageUploader.php at Tridhya\AdminImages\Model
namespace Tridhya\AdminImages\Model; class ImageUploader { protected $coreFileStorageDatabase; protected $mediaDirectory; private $uploaderFactory; protected $storeManager; protected $logger; protected $baseTmpPath; protected $basePath; protected $allowedExtensions; public function __construct( \Magento\MediaStorage\Helper\File\Storage\Database $coreFileStorageDatabase, \Magento\Framework\Filesystem $filesystem, \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Psr\Log\LoggerInterface $logger, $baseTmpPath, $basePath, $allowedExtensions ) { $this->coreFileStorageDatabase = $coreFileStorageDatabase; $this->mediaDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA); $this->uploaderFactory = $uploaderFactory; $this->storeManager = $storeManager; $this->logger = $logger; $this->baseTmpPath = $baseTmpPath; $this->basePath = $basePath; $this->allowedExtensions = $allowedExtensions; } public function setBaseTmpPath($baseTmpPath) { $this->baseTmpPath = $baseTmpPath; } public function setBasePath($basePath) { $this->basePath = $basePath; } public function setAllowedExtensions($allowedExtensions) { $this->allowedExtensions = $allowedExtensions; } public function getBaseTmpPath() { return $this->baseTmpPath; } public function getBasePath() { return $this->basePath; } public function getAllowedExtensions() { return $this->allowedExtensions; } public function getFilePath($path, $imageName) { return rtrim($path, '/') . '/' . ltrim($imageName, '/'); } public function moveFileFromTmp($imageName) { $baseTmpPath = $this->getBaseTmpPath(); $basePath = $this->getBasePath(); $baseImagePath = $this->getFilePath($basePath, $imageName); $baseTmpImagePath = $this->getFilePath($baseTmpPath, $imageName); try { $this->coreFileStorageDatabase->copyFile( $baseTmpImagePath, $baseImagePath ); $this->mediaDirectory->renameFile( $baseTmpImagePath, $baseImagePath ); } catch (\Exception $e) { throw new \Magento\Framework\Exception\LocalizedException( __('Something went wrong while saving the file(s).') ); } return $imageName; } public function saveFileToTmpDir($fileId) { $baseTmpPath = $this->getBaseTmpPath(); $uploader = $this->uploaderFactory->create(['fileId' => $fileId]); $uploader->setAllowedExtensions($this->getAllowedExtensions()); $uploader->setAllowRenameFiles(true); $result = $uploader->save($this->mediaDirectory->getAbsolutePath($baseTmpPath)); if (!$result) { throw new \Magento\Framework\Exception\LocalizedException( __('File can not be saved to the destination folder.') ); } $result['tmp_name'] = str_replace('\ ', '/', $result['tmp_name']); $result['path'] = str_replace('\ ', '/', $result['path']); $result['url'] = $this->storeManager ->getStore() ->getBaseUrl( \Magento\Framework\UrlInterface::URL_TYPE_MEDIA ) . $this->getFilePath($baseTmpPath, $result['file']); $result['name'] = $result['file']; if (isset($result['file'])) { try { $relativePath = rtrim($baseTmpPath, '/') . '/' . ltrim($result['file'], '/'); $this->coreFileStorageDatabase->saveFile($relativePath); } catch (\Exception $e) { $this->logger->critical($e); throw new \Magento\Framework\Exception\LocalizedException( __('Something went wrong while saving the file(s).') ); } } return $result; } }
=> for upload file at file path using ajax create Upload.php at Tridhya\AdminImages\Controller\Adminhtml\Image
namespace Tridhya\AdminImages\Controller\Adminhtml\Image; use Magento\Framework\Controller\ResultFactory; class Upload extends \Magento\Backend\App\Action { protected $imageUploader; protected $resultRawFactory; public function __construct( \Magento\Backend\App\Action\Context $context, \Magento\Framework\Controller\Result\RawFactory $resultRawFactory, \Tridhya\AdminImages\Model\ImageUploader $imageUploader ) { parent::__construct($context); $this->resultRawFactory = $resultRawFactory; $this->imageUploader = $imageUploader; } public function execute() { try { $imageId = $this->_request->getParam('param_name', 'internal_images'); $result = $this->imageUploader->saveFileToTmpDir($imageId); $result['cookie'] = [ 'name' => $this->_getSession()->getName(), 'value' => $this->_getSession()->getSessionId(), 'lifetime' => $this->_getSession()->getCookieLifetime(), 'path' => $this->_getSession()->getCookiePath(), 'domain' => $this->_getSession()->getCookieDomain(), ]; } catch (\Exception $e) { $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()]; } return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result); } }
=> create requirejs-config.js at Tridhya\AdminImages\view\adminhtml
var config = { map: { '*': { adminImageGallery: 'Tridhya_AdminImages/js/image-gallery' } } };
=> create gallery.phtml at Tridhya\AdminImages\view\adminhtml\templates
$elementName = $block->getElement()->getName() . '[internal_images]'; $formName = $block->getFormName(); /** @var \Magento\Framework\Json\Helper\Data $jsonHelper */ $jsonHelper = $block->getData('jsonHelper'); $null = null; ?> <div id="= $block->getHtmlId() ?>" class="gallery" data-mage-init='{"adminImageGallery":{"template":"#= $block->getHtmlId() ?>-template"}}' data-parent-component="= $block->escapeHtml($block->getData('config/parentComponent')) ?>" data-images="= $block->escapeHtml($block->getImagesJson()) ?>" data-types="= $block->escapeHtml($null) ?>"> getElement()->getReadonly()) {?> <div class="image image-placeholder"> = $block->getUploaderHtml() ?> <div class="product-image-wrapper"> <p class="image-placeholder-text"> = $block->escapeHtml(__('Browse to find or drag image here')) ?> </p> </div> </div> <script id="= $block->getHtmlId() ?>-template" type="text/x-magento-template"> <div class="image item<% if (data.disabled == 1) { %> hidden-for-front<% } %>" data-role="image"> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][position]" value="<%- data.position %>" data-form-part="= $block->escapeHtmlAttr($formName) ?>" class="position"/> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][file]" data-form-part="= $block->escapeHtmlAttr($formName) ?>" value="<%- data.file %>"/> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][value_id]" data-form-part="= $block->escapeHtmlAttr($formName) ?>" value="<%- data.value_id %>"/> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][label]" data-form-part="= $block->escapeHtmlAttr($formName) ?>" value="<%- data.label %>"/> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][disabled]" data-form-part="= $block->escapeHtmlAttr($formName) ?>" value="<%- data.disabled %>"/> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][media_type]" data-form-part="= $block->escapeHtmlAttr($formName) ?>" value="image"/> <input type="hidden" name="= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][removed]" data-form-part="= $block->escapeHtmlAttr($formName) ?>" value="" class="is-removed"/> <div class="product-image-wrapper"> <img class="product-image" data-role="image-element" src="<%- data.url %>" alt="<%- data.label %>"/> <div class="actions"> <button type="button" class="action-remove" data-role="delete-button" title="= $block->escapeHtmlAttr(__('Delete image')) ?>"> <span> = $block->escapeHtml(__('Delete image')) ?> </span> </button> <div class="draggable-handle"></div> </div> <div class="image-fade"><span>= $block->escapeHtml(__('Hidden')) ?></span></div> </div> <div class="item-description"> <div class="item-title" data-role="img-title"><%- data.label %></div> <div class="item-size"> <span data-role="image-dimens"></span>, <span data-role="image-size"><%- data.sizeLabel %></span> </div> </div> </div> </script> </div>
=> create image-gallery.js at Tridhya\AdminImages\view\adminhtml\web\js\
define([ 'jquery', 'underscore', 'mage/template', 'uiRegistry', 'jquery/ui', 'baseImage' ], function ($, _, mageTemplate, registry) { 'use strict'; /** * Formats incoming bytes value to a readable format. * * @param {Number} bytes * @returns {String} */ function bytesToSize(bytes) { var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'], i; if (bytes === 0) { return '0 Byte'; } i = window.parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; } /** * Product gallery widget */ $.widget('mage.adminImageGallery', { options: { imageSelector: '[data-role=image]', imageElementSelector: '[data-role=image-element]', template: '[data-template=image]', imageResolutionLabel: '[data-role=resolution]', imgTitleSelector: '[data-role=img-title]', imageSizeLabel: '[data-role=size]', types: null, initialized: false }, /** * Gallery creation * @protected */ _create: function () { this.options.types = this.options.types || this.element.data('types'); this.options.images = this.options.images || this.element.data('images'); this.options.parentComponent = this.options.parentComponent || this.element.data('parent-component'); this.imgTmpl = mageTemplate(this.element.find(this.options.template).html().trim()); this._bind(); $.each(this.options.images, $.proxy(function (index, imageData) { this.element.trigger('addItem', imageData); }, this)); this.options.initialized = true; }, /** * Bind handler to elements * @protected */ _bind: function () { this._on({ updateImageTitle: '_updateImageTitle', updateVisibility: '_updateVisibility', addItem: '_addItem', removeItem: '_removeItem', setPosition: '_setPosition', resort: '_resort', /** * @param {jQuery.Event} event */ 'mouseup [data-role=delete-button]': function (event) { var $imageContainer; event.preventDefault(); $imageContainer = $(event.currentTarget).closest(this.options.imageSelector); this.element.find('[data-role=dialog]').trigger('close'); this.element.trigger('removeItem', $imageContainer.data('imageData')); }, /** * @param {jQuery.Event} event */ 'mouseup [data-role=make-base-button]': function (event) { var $imageContainer, imageData; event.preventDefault(); event.stopImmediatePropagation(); $imageContainer = $(event.currentTarget).closest(this.options.imageSelector); imageData = $imageContainer.data('imageData'); // this.setBase(imageData); } }); this.element.sortable({ distance: 8, items: this.options.imageSelector, tolerance: 'pointer', cancel: 'input, button, .uploader', update: $.proxy(function () { this.element.trigger('resort'); }, this) }); }, /** * Find element by fileName * @param {Object} data * @returns {Element} */ findElement: function (data) { return this.element.find(this.options.imageSelector).filter(function () { return $(this).data('imageData').file === data.file; }).first(); }, /** * Mark parent fieldset that content was updated */ _contentUpdated: function () { if (this.options.initialized && this.options.parentComponent) { registry.async(this.options.parentComponent)( function (parentComponent) { parentComponent.bubble('update', true); } ); } }, /** * Add image * @param {jQuery.Event} event * @param {Object} imageData * @private */ _addItem: function (event, imageData) { var count = this.element.find(this.options.imageSelector).length, element, imgElement, position = count + 1, lastElement = this.element.find(this.options.imageSelector + ':last'); if (lastElement.length === 1) { position = parseInt(lastElement.data('imageData').position || count, 10) + 1; } imageData = $.extend({ 'file_id': imageData['value_id'] ? imageData['value_id'] : Math.random().toString(33).substr(2, 18), 'disabled': imageData.disabled ? imageData.disabled : 0, 'position': position, sizeLabel: bytesToSize(imageData.size) }, imageData); element = this.imgTmpl({ data: imageData }); element = $(element).data('imageData', imageData); if (count === 0) { element.prependTo(this.element); } else { element.insertAfter(lastElement); } if (!this.options.initialized && this.options.images.length === 0 || this.options.initialized && this.element.find(this.options.imageSelector + ':not(.removed)').length === 1 ) { // this.setBase(imageData); } imgElement = element.find(this.options.imageElementSelector); imgElement.on('load', this._updateImageDimesions.bind(this, element)); this._contentUpdated(); }, /** * Returns a list of current images. * * @returns {jQueryCollection} */ _getImages: function () { return this.element.find(this.options.imageSelector); }, _updateImageDimesions: function (imgContainer) { var $img = imgContainer.find(this.options.imageElementSelector)[0], $dimens = imgContainer.find('[data-role=image-dimens]'); $dimens.text($img.naturalWidth + 'x' + $img.naturalHeight + ' px'); }, /** * * @param {jQuery.Event} event * @param {Object} data */ _updateImageTitle: function (event, data) { var imageData = data.imageData, $imgContainer = this.findElement(imageData), $title = $imgContainer.find(this.options.imgTitleSelector), value; value = imageData['media_type'] === 'external-video' ? imageData['video_title'] : imageData.label; $title.text(value); this._contentUpdated(); }, /** * Remove Image * @param {jQuery.Event} event * @param {Object} imageData * @private */ _removeItem: function (event, imageData) { var $imageContainer = this.findElement(imageData); imageData.isRemoved = true; $imageContainer.addClass('removed').hide().find('.is-removed').val(1); this._contentUpdated(); }, /** * Set image type * @param {jQuery.Event} event * @param {Obejct} data * @private */ _setImageType: function (event, data) { if (data.type === 'image') { this.element.find('.base-image').removeClass('base-image'); } if (data.imageData) { this.options.types[data.type].value = data.imageData.file; if (data.type === 'image') { this.findElement(data.imageData).addClass('base-image'); } } else { this.options.types[data.type].value = 'no_selection'; } this.element.find('.image-' + data.type).val(this.options.types[data.type].value || 'no_selection'); // this._updateImagesRoles(); this._contentUpdated(); }, /** * Resort images * @private */ _resort: function () { this.element.find('.position').each($.proxy(function (index, element) { var value = $(element).val(); if (value != index) { //eslint-disable-line eqeqeq this.element.trigger('moveElement', { imageData: $(element).closest(this.options.imageSelector).data('imageData'), position: index }); $(element).val(index); } }, this)); this._contentUpdated(); }, /** * Set image position * @param {jQuery.Event} event * @param {Object} data * @private */ _setPosition: function (event, data) { var $element = this.findElement(data.imageData), curIndex = this.element.find(this.options.imageSelector).index($element), newPosition = data.position + (curIndex > data.position ? -1 : 0); if (data.position != curIndex) { //eslint-disable-line eqeqeq if (data.position === 0) { this.element.prepend($element); } else { $element.insertAfter( this.element.find(this.options.imageSelector).eq(newPosition) ); } this.element.trigger('resort'); } this._contentUpdated(); } }); // Extension for mage.adminImageGallery - Add advanced settings block $.widget('mage.adminImageGallery', $.mage.adminImageGallery, { options: { dialogTemplate: '[data-role=img-dialog-tmpl]', dialogContainerTmpl: '[data-role=img-dialog-container-tmpl]' }, /** @inheritdoc */ _create: function () { var template = this.element.find(this.options.dialogTemplate), containerTmpl = this.element.find(this.options.dialogContainerTmpl); this._super(); this.modalPopupInit = false; if (template.length) { this.dialogTmpl = mageTemplate(template.html().trim()); } if (containerTmpl.length) { this.dialogContainerTmpl = mageTemplate(containerTmpl.html().trim()); } else { this.dialogContainerTmpl = mageTemplate(''); } // this._initDialog(); }, /** * Bind handler to elements * @protected */ _bind: function () { var events = {}; this._super(); events['click [data-role=close-panel]'] = $.proxy(function () { this.element.find('[data-role=dialog]').trigger('close'); }, this); /** * @param {jQuery.Event} event */ events['click ' + this.options.imageSelector] = function (event) { var imageData, $imageContainer; if (!$(event.currentTarget).is('.ui-sortable-helper')) { $(event.currentTarget).addClass('active'); imageData = $(event.currentTarget).data('imageData'); $imageContainer = this.findElement(imageData); if ($imageContainer.is('.removed')) { return; } // this.element.trigger('openDialog', [imageData]); } }; this._on(events); this.element.on('sortstart', $.proxy(function () { this.element.find('[data-role=dialog]').trigger('close'); }, this)); }, _updateVisibility: function (event, data) { var imageData = data.imageData, disabled = +data.disabled, $imageContainer = this.findElement(imageData); !!disabled ? //eslint-disable-line no-extra-boolean-cast $imageContainer.addClass('hidden-for-front') : $imageContainer.removeClass('hidden-for-front'); $imageContainer.find('[name*="disabled"]').val(disabled); imageData.disabled = disabled; this._contentUpdated(); } }); return $.mage.adminImageGallery; });
=> for saving images data in your table
if(isset($data['internal_images'])){ $images = $data['internal_images']; $this->imageUploader = \Magento\Framework\App\ObjectManager::getInstance()->get( 'Tridhya\AdminImages\AdminImagesUpload'); if($images != null) { foreach($images as $key => $value){ if (isset($images[$key]['label']) && $images[$key]['label'] == null && $images[$key]['removed'] != 1) { $imgNames[$key]['file'] = $images[$key]['file']; $imgNames[$key]['position'] = $images[$key]['position']; $this->imageUploader->moveFileFromTmp($images[$key]['file']); } elseif (isset($images[$key]['file']) && $images[$key]['label'] != null && $images[$key]['removed'] != 1) { $imgNames[$key]['file'] = $images[$key]['file']; $imgNames[$key]['position'] = $images[$key]['position']; } elseif($images[$key]['removed'] != 1) { $imgNames[] = null; } } } } $jsonArray = $this->_jsonFramework->serialize($imgNames);