Feature request from razbakov, posted on GitHub Oct 14, 2016
As Administrator I want to be able to upload files for each products in order to show link on frontend.
Preconditions
Magento 2.1
Steps to reproduce
I created upgrade script to create attribute with this properties:
'type' => 'varchar',
'input' => 'file',
'label' => 'Datasheet',
'required' => false,
'visible_on_front' => true,
'backend' => 'My\Module\Model\Product\Attribute\Backend\Datasheet'
Here is my backend model:
<?php
namespace My\Module\Model\Product\Attribute\Backend;
use Magento\Framework\App\Filesystem\DirectoryList;
class Datasheet extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
{
const MEDIA_SUBFOLDER = 'datasheet';
protected $_uploaderFactory;
protected $_filesystem;
protected $_fileUploaderFactory;
protected $_logger;
/**
* Construct
*
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Framework\Filesystem $filesystem
* @param \Magento\Framework\File\UploaderFactory $uploaderFactory
*/
public function __construct(
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\File\UploaderFactory $uploaderFactory
) {
$this->_filesystem = $filesystem;
$this->_uploaderFactory = $uploaderFactory;
$this->_logger = $logger;
}
public function afterSave($object)
{
$attributeName = $this->getAttribute()->getName();
$fileName = $this->uploadFileAndGetName($attributeName, $this->_filesystem->getDirectoryWrite(DirectoryList::MEDIA)->getAbsolutePath(self::MEDIA_SUBFOLDER));
if ($fileName) {
$object->setData($attributeName, $fileName);
$this->getAttribute()->getEntity()->saveAttribute($object, $attributeName);
}
return $this;
}
public function uploadFileAndGetName($input, $destinationFolder)
{
try {
$uploader = $this->_uploaderFactory->create(array('fileId' => 'product['.$input.']'));
$uploader->setAllowedExtensions(['pdf']);
$uploader->setAllowRenameFiles(true);
$uploader->setFilesDispersion(true);
$uploader->setAllowCreateFolders(true);
$uploader->save($destinationFolder);
return $uploader->getUploadedFileName();
} catch (\Exception $e) {
if ($e->getCode() != \Magento\Framework\File\Uploader::TMP_NAME_EMPTY) {
throw new \FrameworkException($e->getMessage());
}
}
return '';
}
}
Question on Stackoverflow:
http://magento.stackexchange.com/questions/140347/show-value-of-product-attribute-of-type-file-in-ma...#
References:
Expected result
Attribute value is shown in backend.
Actual result
Attribute is shown in backend and saves value in database.
Attribute value is not shown in backend.