Magento 2, tiện ích mới với tham số chọn hình ảnh, không lưu hình ảnh


18

Tôi tạo một widget mới và một trong các tham số là một trình chọn ảnh, tôi chỉ sử dụng mã này . Mọi thứ có vẻ tốt. Tôi có thể mở thư mục phương tiện và chọn hình ảnh tôi muốn sử dụng. Khi tôi chọn ảnh, trường ảnh trên biểu mẫu được điền với giá trị này:

http://local.magento

Nhưng khi tôi lưu dữ liệu tiện ích biểu mẫu, trường hình ảnh có giá trị này: {{media url=

chỉ có bấy nhiêu thôi. Làm sao tôi có thể giải quyết việc này?


2
Vấn đề là về cấu hình. Trên Cấu hình> Chung> Quản lý nội dung, "Sử dụng URL tĩnh cho nội dung đa phương tiện trong WYSIWYG cho danh mục" Nó phải là "có"
mvistas

1
Vấn đề với cách tiếp cận này là bạn sẽ gặp vấn đề khi chuyển từ env này sang env khác vì hình ảnh được mã hóa cứng sẽ không hoạt động
open

Câu trả lời:


1

Nếu bạn muốn tải lên một hình ảnh thì tại sao bạn không sử dụng nút chọn hình ảnh.?
Nếu bạn thích trình chỉnh sửa thì hãy sử dụng nó. Nhưng đó không phải là cách thích hợp để tải lên hình ảnh bằng trình chỉnh sửa. Bạn có thể sử dụng nút thay thế. Nếu bạn không biết làm thế nào để làm điều đó. Hãy để tôi giải thích.

Đây là mã của tôi. Mã dưới đây được viết trong tập tin khối tạo ra một nút.

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

Hình ảnh là tên trường cơ sở dữ liệu. Trong trường hợp của bạn, đó là trình soạn thảo wysiwyg. Tôi không biết chính xác nhưng một khi kiểm tra cơ sở dữ liệu của bạn.

Mã dưới đây được sử dụng để lưu hình ảnh trong bảng của bạn. Bây giờ đặt mã này vào Trình điều khiển của bạn.

<?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');
}

}

Sau đó, bạn muốn gọi nó trong phtml cho kết quả..như mã dưới đây ghi vào tệp phtml.
Đây là mã.

    $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 () được ghi trong block.so của tôi, theo đó, bạn nên áp dụng làm tệp khối của mình.
Tôi hy vọng điều này hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi cho tôi biết.


Tôi đã gọi một kết quả trong tệp phtml bằng cách sử dụng trình quản lý đối tượng. Nó sẽ không phải là một cách thích hợp nhưng tôi không muốn viết thêm mã ở đây. Vì vậy, tại sao tôi sử dụng nó. Nếu bạn muốn sử dụng phương thức xuất xưởng thì sẽ ổn thôi.
Vishnu Salunke

0

Tôi đã kiểm tra mã và thấy rằng mã để lấy URL hình ảnh từ thư mục không được bao gồm. Bạn phải làm việc với nó để giải quyết vấn đề này. Mã để bao gồm URL hình ảnh bị thiếu.


0

Có vẻ như đây là một vấn đề được biết đến trong Magento 2.1. Đây là một liên kết đến github của họ để biết thêm thông tin về chủ đề này. https://github.com/magento/magento2/issues/6138 Có vẻ như có một vài cách khắc phục khác nhau để thử.



0

Bằng cách sử dụng jquery, chúng ta có thể lưu hình ảnh vào một thư mục.

Trong kịch bản, viết mã này

<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>

Sau đó, trong bộ điều khiển tùy chỉnh của bạn:

Tải lên lớp mở rộng \ 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";
    }
}

}

vui lòng tham khảo Làm thế nào để lưu một hình ảnh tải lên vào một thư mục trong magento2?

Và bằng cách sử dụng trình quan sát, bạn có thể nhận được giá trị của hình ảnh trong bài..Trong thẻ trường đầu vào sử dụng data-form-part = "product_form".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.