Magento 2 เครื่องมือใหม่ที่มีพารามิเตอร์ตัวเลือกรูปภาพไม่บันทึกรูปภาพ


18

ฉันจะสร้างเครื่องมือใหม่และเป็นหนึ่งในพารามิเตอร์ที่เป็นผู้เลือกภาพ, ฉันเพียงแค่ใช้นี้ รหัส ทุกอย่างดูดี ฉันสามารถเปิดโฟลเดอร์มีเดียและเลือกรูปภาพที่ฉันต้องการใช้ เมื่อฉันเลือกรูปภาพเขตข้อมูลรูปภาพในแบบฟอร์มจะเต็มไปด้วยค่านี้:

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

แต่เมื่อฉันบันทึกข้อมูลวิดเจ็ตแบบฟอร์มฟิลด์รูปภาพมีค่านี้: {{media url=

ไม่มีอะไรเพิ่มเติม ฉันจะแก้ปัญหานี้ได้อย่างไร


2
ปัญหาเกิดขึ้นกับการกำหนดค่า ในการกำหนดค่า> ทั่วไป> การจัดการเนื้อหา "ใช้ URL คงที่สำหรับเนื้อหาสื่อใน WYSIWYG สำหรับแคตตาล็อก" ควรเป็น "ใช่"
mvistas

1
ปัญหาเกี่ยวกับวิธีการนี้คือคุณจะพบปัญหาในการย้ายจาก env หนึ่งไปยังอีกเนื่องจากรูปภาพ hardcoded ไม่ทำงาน
open-ecommerce.org

คำตอบ:


1

หากคุณต้องการอัพโหลดภาพทำไมคุณไม่ใช้ปุ่มเลือกภาพ?
หากคุณชอบโปรแกรมแก้ไขให้ใช้ แต่ไม่ได้เป็นวิธีที่เหมาะสมในการอัปโหลดภาพโดยใช้โปรแกรมแก้ไขคุณสามารถใช้ปุ่มแทน หากคุณไม่ทราบวิธีการทำ ให้ฉันอธิบาย

นี่คือรหัสของฉัน รหัสด้านล่างเขียนในไฟล์บล็อกซึ่งสร้างปุ่ม

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

อิมเมจเป็นชื่อฟิลด์ฐานข้อมูล ในกรณีของคุณมันเป็นบรรณาธิการ wysiwyg ฉันไม่ทราบแน่นอน แต่เมื่อตรวจสอบในฐานข้อมูลของคุณ

รหัสด้านล่างใช้สำหรับบันทึกภาพในตารางของคุณ ตอนนี้ใส่รหัสนี้ลงในคอนโทรลเลอร์ของคุณ

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

}

หลังจากนั้นคุณต้องการเรียกมันใน phtml สำหรับผล .. ดังนั้นรหัสตะโกนเขียนในไฟล์ phtml
นี่คือรหัส

    $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 () เขียนใน block.so ของฉันตามนั้นคุณควรใช้เป็นไฟล์บล็อกของคุณ
ฉันหวังว่านี่จะเป็นประโยชน์กับคุณ หากคุณมีข้อสงสัยใด ๆ แจ้งให้เราทราบ


ฉันเรียกว่าผลลัพธ์ในไฟล์ phtml โดยใช้ object manager.it จะไม่ใช่วิธีที่เหมาะสม แต่ฉันไม่ต้องการเขียนรหัสเพิ่มเติมที่นี่ดังนั้นฉันจึงใช้มันถ้าคุณต้องการใช้วิธีการจากโรงงานก็จะใช้ได้
วิษณุ Salunke

0

ฉันตรวจสอบรหัสแล้วและพบว่าไม่มีการรวมรหัสเพื่อรับ URL ภาพจากไดเรกทอรี คุณต้องทำงานเพื่อแก้ไขปัญหานี้ รหัสที่จะรวม URL ภาพหายไป


0

ดูเหมือนว่านี่เป็นปัญหาที่รู้จักใน Magento 2.1 นี่คือลิงค์ไปยัง GitHub ของพวกเขาสำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อ https://github.com/magento/magento2/issues/6138 ดูเหมือนว่าอาจมีการแก้ไขต่าง ๆ ให้ลอง



0

โดยใช้ jquery เราสามารถบันทึกภาพไปยังโฟลเดอร์

ในสคริปต์เขียนรหัสนี้

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

จากนั้นในตัวควบคุมที่กำหนดเองของคุณ:

การอัปโหลดคลาสมีส่วนขยาย\ 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";
    }
}

}

โปรดอ้างอิงวิธีการบันทึกการอัพโหลดภาพไปยังโฟลเดอร์ใน magento2?

และโดยการใช้ผู้สังเกตการณ์คุณสามารถรับค่าของภาพในโพสต์ .. ในแท็กฟิลด์อินพุตให้ใช้ data-form-part = "product_form"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.