이미지 선택기 매개 변수가있는 새 위젯 인 Magento 2는 사진을 저장하지 않습니다


18

새 위젯을 만들고 매개 변수 중 하나가 그림 선택기 입니다. 코드 만 사용 합니다. 모든 것이 잘 보입니다. 미디어 폴더를 열고 사용하려는 사진을 선택할 수 있습니다. 그림을 선택하면 양식의 그림 필드가이 값으로 채워집니다.

http : //local.magento.com/admin/cms/wysiwyg/directive / ___ directive / e3ttZWRpYSB1cmw9Ind5c2l3eWcvcHVycGxlLmpwZyJ9fQ``

그러나 양식 위젯 데이터를 저장할 때 그림 필드의 값은 다음과 같습니다. {{media url=

더 이상 없습니다. 이 문제를 어떻게 해결할 수 있습니까?


2
구성에 문제가있었습니다. 설정> 일반> 콘텐츠 관리에서 "사용 정적 URL은 카탈로그에 대한 WYSIWYG에서 미디어 컨텐츠에 대해"그것은 "예"해야
mvistas

1
이 approache의 문제는 당신이 하드 코딩 이미지로 한 ENV에서 다른하지 않습니다 일 이동 문제로 실행하는 것입니다
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로 호출하려고합니다. pso 파일에 plowow 코드를 작성하십시오.
코드는 다음과 같습니다.

    $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 ()는 내 블록에 작성됩니다. 따라서 블록 파일로 적용해야합니다.
이것이 도움이되기를 바랍니다. 질문이 있으시면 알려주십시오.


객체 manager.it를 사용하여 phtml 파일에 결과를 호출했지만 적절한 방법은 아니지만 여기에 더 많은 코드를 작성하고 싶지 않습니다. 그래서 내가 사용하는 이유입니다. 공장 방법을 사용하려면 괜찮습니다.
Vishnu Salunke

0

코드를 확인한 결과 디렉토리에서 이미지 URL을 가져 오는 코드가 포함되어 있지 않습니다. 이 문제를 해결하려면 작업해야합니다. 이미지 URL을 포함하는 코드가 없습니다.




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의 폴더에 이미지 업로드를 저장하는 방법을 참조하십시오 .

그리고 옵저버를 사용하여 post에서 이미지의 값을 얻을 수 있습니다. 입력 필드 태그에서 data-form-part = "product_form"을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.