add image in create new product
How to make an similar image upload in configuration instead of
In add product, it uses phtml file. In configuration, it uses xml file.
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'];
}
}
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>
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.