Magento 2, widget baru dengan parameter pemilih gambar, tidak menyimpan gambar

18

Saya membuat widget baru dan salah satu parameternya adalah pemilih gambar, saya hanya menggunakan kode ini . Semuanya terlihat baik. Saya dapat membuka folder media dan memilih gambar yang ingin saya gunakan. Ketika saya memilih gambar, bidang gambar pada formulir diisi dengan nilai ini:

http://local.magento.com/admin/cms/wysiwyg/directive/___directive/e3ttZWRpYSB1cmw9Ind5c2l3eWcvcHVycGxlLmpwZyJ9fQ,,/key/4c150d984998702b74709bb8f48

Tetapi ketika saya menyimpan data widget bentuk, bidang gambar memiliki nilai ini: {{media url=

tidak ada lagi. Bagaimana saya bisa memecahkan masalah ini?

mvista
sumber
2
Masalahnya ada pada konfigurasi. Tentang Konfigurasi> Umum> Manajemen Konten, "Gunakan URL Statis untuk Konten Media di WYSIWYG untuk Katalog" Seharusnya "ya"
mvista
1
masalah dengan pendekatan ini adalah bahwa Anda akan mengalami masalah pindah dari satu env ke yang lain karena gambar hardcoded tidak akan berfungsi
open-ecommerce.org

Jawaban:

1

Jika Anda ingin mengunggah gambar, mengapa Anda tidak menggunakan tombol pemilihan gambar?
Jika Anda menyukai editor, maka gunakan. Tapi itu bukan cara yang tepat untuk mengunggah gambar menggunakan editor. Anda dapat menggunakan tombol sebagai gantinya. Jika Anda tidak tahu bagaimana cara melakukannya. Biarkan saya jelaskan.

Ini kode saya. Kode di bawah ini ditulis dalam file blokir yang menciptakan tombol.

$fieldset->addField(
        'image',
        'file',
        [
            'name' => 'image',
            'label' => __('Image'),
            'title' => __('Image'),
        ]
    );

Gambar adalah nama bidang basis data. Dalam kasus Anda itu adalah editor wysiwyg. Saya tidak tahu persis tetapi sekali memeriksa dalam database Anda.

Kode di bawah ini digunakan untuk menyimpan gambar di tabel Anda. Sekarang masukkan kode ini ke Controller Anda.

<?php
namespace Vendor\Module\Controller\Adminhtml\Slider;

use Magento\Framework\App\Filesystem\DirectoryList;

class Save extends \Magento\Backend\App\Action

{

protected $_mediaDirectory;
protected $_fileUploaderFactory;

public function __construct(
    \Magento\Backend\App\Action\Context $context,        
    \Magento\Framework\Filesystem $filesystem,
    \Magento\MediaStorage\Model\File\UploaderFactory $fileUploaderFactory
) 
{
    $this->_mediaDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);
    $this->_fileUploaderFactory = $fileUploaderFactory;
    parent::__construct($context);
}

public function execute()
{
    /*For Image Upload*/

    /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
    $resultRedirect = $this->resultRedirectFactory->create();

    try{
        $target = $this->_mediaDirectory->getAbsolutePath('imagefolder/');

        $targetOne = "imagefolder/";
        /** @var $uploader \Magento\MediaStorage\Model\File\Uploader */
        $uploader = $this->_fileUploaderFactory->create(['fileId' => 'image']);
        /** Allowed extension types */
        $uploader->setAllowedExtensions(['jpg', 'jpeg', 'gif', 'png', 'zip', 'doc']);
        /** rename file name if already exists */
        $uploader->setAllowRenameFiles(true);
        /** upload file in folder "mycustomfolder" */
        $result = $uploader->save($target);
        /*If file found then display message*/
        if ($result['file']) 
        {
            $this->messageManager->addSuccess(__('File has been successfully uploaded')); 
        }
    }
    catch (Exception $e) 
    {
        $this->messageManager->addError($e->getMessage());
    }
    /*For Image Upload Finished*/ 

    $data = $this->getRequest()->getPostValue();

    $data['image'] = $targetOne.$result['file'];

    if (!$data) {
        $this->_redirect('*/*/filenaem');
        return;
    }
    try {

        $rowData = $this->_objectManager->create('Vendor\Module\Model\Slider');

        $rowData->setData($data);

        if (isset($data['id'])) 
        {
            $rowData->setEntityId($data['id']);
        }
        $rowData->save();
        $this->messageManager->addSuccess(__('Row data has been successfully saved.'));
    } 
    catch (Exception $e) 
    {
        $this->messageManager->addError(__($e->getMessage()));
    }
    $this->_redirect('*/*/index');

    return $this->resultRedirectFactory->create()->setPath(
        '*/*/upload', ['_secure'=>$this->getRequest()->isSecure()]
    );
}

/**
 * Check Category Map permission.
 *
 * @return bool
 */
protected function _isAllowed()
{
    return $this->_authorization->isAllowed('Vendor_Module::Module_list');
}

}

Setelah itu Anda ingin memanggilnya dalam bentuk phtml untuk hasilnya..jadi kode di bawah ini tulis dalam file phtml.
Ini kode.

    $collection = $block->getCollectionFor();
    $_objectManager = \Magento\Framework\App\ObjectManager::getInstance(); //instance of\Magento\Framework\App\ObjectManager
    $storeManager = $_objectManager->get('Magento\Store\Model\StoreManagerInterface'); 
    $currentStore = $storeManager->getStore();
//Base URL for saving image into database.
    $mediaUrl = $currentStore->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);

getCollectionFor () ditulis di block.so saya sesuai dengan itu, Anda harus mendaftar sebagai file blok Anda.
Saya harap ini dapat membantu anda. Jika Anda memiliki pertanyaan, beri tahu saya.

Wisnu Salunke
sumber
Saya menyebut hasil dalam file phtml menggunakan object manager.it tidak akan cara yang tepat tetapi saya tidak ingin menulis kode lebih lanjut di sini.
Wisnu Salunke
0

Saya telah memeriksa kode dan menemukan bahwa kode untuk mendapatkan URL gambar dari direktori tidak termasuk. Anda harus mengusahakannya untuk menyelesaikan masalah ini. Kode untuk memasukkan URL gambar tidak ada.

Marc Feber
sumber
0

Sepertinya ini adalah masalah yang diketahui di Magento 2.1. Berikut ini tautan ke github mereka untuk info lebih lanjut tentang topik tersebut. https://github.com/magento/magento2/issues/6138 Tampaknya mungkin ada beberapa perbaikan berbeda untuk dicoba.

Cary Wolff
sumber
0

Dengan menggunakan jquery, kita dapat menyimpan gambar ke folder.

Dalam skrip, tulis kode ini

<script>
    function file_up(id)
    {
        var up_id = 'uploadfiles'+id;
        var upremv_id = 'upload'+id;
        var files = document.getElementById(up_id).files;
        for (var i = 0; i < files.length; i++)
        {
            uploadFile(files[i],up_id,upremv_id);
        }
    }
    function uploadFile(file,up_id,upremv_id){
        var url = "<?php echo $baseurl ?>helloworld/index/upload";
        var xhr = new XMLHttpRequest();
        var fd = new FormData();
        xhr.open("POST", url, true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                jQuery('#imgna'+up_id).val(xhr.responseText);
                console.log(xhr.responseText); // handle response.
                jQuery('#'+up_id).remove();
                jQuery('#'+upremv_id).remove();
                var img_va = '<img class="image" src="<?php echo $mediaUrl.'custom/'?>'+xhr.responseText+'">';
                jQuery('#pre'+up_id).html(img_va);
            }
        };
        fd.append('uploaded_file', file);

</script>

Kemudian, di pengontrol khusus Anda:

Unggahan Kelas meluas \ Magento \ Framework \ App \ Action \ Action {

public function __construct(\Magento\Framework\App\Action\Context $context)
{
    parent::__construct($context);
}

public function execute()
{
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

    $fileSystem = $objectManager->create('\Magento\Framework\Filesystem');
    $mediaPath = $fileSystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath();
    $media = $mediaPath . 'custom/';

    //  exit;


    $file_name = rand() . $_FILES['uploaded_file']['name'];
    $file_size = $_FILES['uploaded_file']['size'];
    $file_tmp = $_FILES['uploaded_file']['tmp_name'];
    $file_type = $_FILES['uploaded_file']['type'];

    if (move_uploaded_file($file_tmp, $media . $file_name)) {
        echo $file_name;
    } else {
        echo "File was not uploaded";
    }
}

}

silakan merujuk Bagaimana cara menyimpan unggahan gambar ke folder di magento2?

Dan dengan menggunakan pengamat, Anda bisa mendapatkan nilai gambar di pos .. Di tag bidang input gunakan data-form-part = "product_form".

Rita Jose
sumber