Magento 2, новый виджет с параметром выбора изображения, не сохраняет изображение

18

Я создаю новый виджет, и одним из параметров является средство выбора изображений, я просто использую этот код. Все выглядит хорошо. Я могу открыть папку мультимедиа и выбрать картинку, которую я хочу использовать. Когда я выбираю рисунок, поле изображения в форме заполняется этим значением:

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

Но когда я сохраняю данные виджета формы, поле изображения имеет это значение: {{media url=

ничего больше. Как я могу решить это?

mvistas
источник
2
Проблема была в конфигурации. На Конфигурация> Общие> Управление контентом, «Использовать статические URL для медиа-контента в WYSIWYG для каталога» Это должно быть «да»
mvistas
1
проблема с этим подходом состоит в том, что вы столкнетесь с проблемами при переходе от одного 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 для результата .. поэтому ниже код пишите в 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 не будет правильным способом, но я не хочу писать здесь больше кода. Поэтому я использую его. Если вы хотите использовать фабричный метод, тогда все будет хорошо.
Вишну Салунке
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?

А с помощью обозревателя вы можете получить значение изображения в post. В теге поля ввода используйте data-form-part = "product_form".

Рита Хосе
источник