10

add image in create new product enter image description here

How to make an similar image upload in configuration instead of enter image description here

In add product, it uses phtml file. In configuration, it uses xml file.

1
  • J.John did you find the solution as mentioned in you question? Apr 27, 2018 at 10:04

3 Answers 3

17

In system.xml you should add this code below:

<field id="upload_image_id" translate="label comment" type="image" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">
    <label>Select Image</label>
    <backend_model>NameSpace\YourModule\Model\Config\Backend\Image</backend_model>
    <base_url type="media" scope_info="1">yourfolder</base_url>
</field>

And you should create custom model using in system.xml:

NameSpace\YourModule\Model\Config\Backend\Image.php

<?php

namespace NameSpace\YourModule\Model\Config\Backend;

class Image extends \Magento\Config\Model\Config\Backend\Image
{
    /**
     * The tail part of directory path for uploading
     *
     */
    const UPLOAD_DIR = 'yourfolder'; // Folder save image

    /**
     * Return path to directory for upload file
     *
     * @return string
     * @throw \Magento\Framework\Exception\LocalizedException
     */
    protected function _getUploadDir()
    {
        return $this->_mediaDirectory->getAbsolutePath($this->_appendScopeInfo(self::UPLOAD_DIR));
    }

    /**
     * Makes a decision about whether to add info about the scope.
     *
     * @return boolean
     */
    protected function _addWhetherScopeInfo()
    {
        return true;
    }

    /**
     * Getter for allowed extensions of uploaded files.
     *
     * @return string[]
     */
    protected function _getAllowedExtensions()
    {
        return ['jpg', 'jpeg', 'gif', 'png', 'svg'];
    }
}
8
  • Thank you for answer, but your answer is create default image upload as pure html. I want to use customize image button similar image upload in add product.
    – J. John
    Nov 28, 2015 at 9:49
  • My code use in Configuration, Are you understand ?
    – Lino
    Nov 28, 2015 at 9:54
  • Yes, I understand what you code. And I know what it does. I wonder there is a way create a image upload button similar in add product. Because I see default button is not beautiful.
    – J. John
    Nov 28, 2015 at 10:47
  • can this be used in admin form as well? if not what's the way to do it?
    – R T
    Dec 30, 2015 at 13:05
  • 1
    I need to add multiple images to system config. How it possible? Nov 13, 2017 at 13:55
1

Although the accepted answer worked for me. For some reason the validation does not work. I ended up using a custom Config\Backend\Image file.

In my system.xml I've added the image field below

<field id="my_image_field" translate="label" sortOrder="1" type="Magento\Config\Block\System\Config\Form\Field\Image" showInDefault="1" showInWebsite="1" showInStore="1">
    <label>My Image</label>
    <backend_model>Vendor\Package\Model\Config\Backend\Image</backend_model>
    <base_url type="media" scope_info="1">my_image_folder</base_url>
    <validate>required-entry</validate>
    <upload_dir config="system" scope_info="1">my_image_folder</upload_dir>
</field>

Then, as you can tell, I've created the file "Vendor\Package\Model\Config\Backend\Image" with the following content:

<?php

namespace Vendor\Package\Model\Config\Backend;

class Image extends \Magento\Config\Model\Config\Backend\File
{
    protected function _getAllowedExtensions()
    {
        return ['jpg', 'jpeg', 'gif', 'png', 'svg'];
    }
}

FIY, the image will be saved in magento_root/pub/media/my_image_folder.

I hope it helps.

2
  • how can i view the image in frontend? i have tried to call the helper with the correct path but the image never loads up Sep 7, 2020 at 15:06
  • @jibingeorge Just check the media directory and see what path is the image located at and refer the same in frontend. Dec 7, 2020 at 11:45
1

Maybe something too late but someone else can use it

You can use Magento\Ui\Component\Form\Element\DataType\Media\Image and binding this to your config form by hidden input.

Try the following code created by me.

Create a Vendor\Module\Block\Data\Form\Element\ImageUploader

<?php

namespace Vendor\Module\Block\Data\Form\Element;

use Magento\Framework\Data\Form\Element\Factory;
use Magento\Framework\Data\Form\Element\CollectionFactory;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\Escaper;
use Magento\Framework\Math\Random;
use Magento\Framework\View\Helper\SecureHtmlRenderer;

use Magento\Framework\View\Element\UiComponentInterface;
use Magento\Framework\App\Filesystem\DirectoryList;

class ImageUploader extends \Magento\Framework\Data\Form\Element\AbstractElement
{
    public function __construct(
        Factory $factoryElement,
        CollectionFactory $factoryCollection,
        Escaper $escaper,
        $data = [],
        ObjectManagerInterface $objectManager,
        \Magento\Framework\Filesystem $filesystem,
        \Magento\Framework\File\Mime $mime,
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ) {
        $this->_objectManager = $objectManager;
        parent::__construct(
            $factoryElement,
            $factoryCollection,
            $escaper,
            $data
        );
        $this->filesystem = $filesystem;
        $this->mime = $mime;
        $this->mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::ROOT);
    }

    public function getElementHtml(){
        
        $initData = [
            'config' => [
                'initialMediaGalleryOpenSubpath' => 'wysiwyg',
                'previewTmpl' => 'Magento_PageBuilder/form/element/uploader/preview',
                'uploaderConfig' => [
                    'url' => 'pagebuilder/contenttype/image_upload',
                ],
            ]
        ];

        $data = array_replace_recursive($initData, $this->getData());
        $uiComponent = $this->_objectManager->create(\Magento\Ui\Component\Form\Element\DataType\Media\Image::class);
        $uiComponent->setData($data);
        $uiComponent->prepare();
        $this->setData($uiComponent->getData());

        return '<div id="content_img_id" data-bind="scope:\'customImageUploader\'">' .
                    '<input type="hidden" name="'.$this->getName().'"data-bind="value: $data.value()[0] ? $data.value()[0][\'url\'] : \'\'" />' .
                    '<!-- ko template: $data.elementTmpl --><!-- /ko -->' .
                    '<script type="text/x-magento-init">'.
                        '{
                            "#content_img_id": {
                                "Magento_Ui/js/core/app": {
                                    "components": {
                                        "customImageUploader": {
                                            "component": "Magento_Ui/js/form/element/image-uploader",
                                            "elementTmpl": "ui/form/element/uploader/image",
                                            "config": '.json_encode($this->getConfig()).',
                                            "value": '.json_encode($this->getValue()).',
                                            "dataScope": "customImageUploader"
                                        }
                                    }
                                }
                            }
                        }'.
                    '</script>' .
                '</div>';
    }

    public function getValue(){
        $filePath = parent::getValue();
        $newfilePath = explode('/', $filePath);
        unset($newfilePath[0], $newfilePath[1]);
        $newfilePath = implode('/', $newfilePath);
        $image = [];
        if ($newfilePath && $this->mediaDirectory->isExist($newfilePath)) {
            $stat = $this->mediaDirectory->stat($newfilePath);
            $mime = $this->mime->getMimeType($this->mediaDirectory->getAbsolutePath($newfilePath));
            $image[0]['name'] = basename($newfilePath);
            $image[0]['url'] = $filePath;
            $image[0]['size'] = isset($stat) ? $stat['size'] : 0;
            $image[0]['type'] = $mime;
        }
        return $image;
    }
}

In your system.xml add this field like this:

<field id="field_name" translate="label" type="Vendor\Module\Block\Data\Form\Element\ImageUploader" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="0">
    <label>Image</label>
</field>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.