Magento 2, nowy widget z parametrem selektora obrazu, nie zapisuje obrazu

18

Tworzę nowy widżet, a jednym z parametrów jest selektor obrazu, po prostu używam tego kodu. Wszystko wygląda dobrze. Mogę otworzyć folder multimediów i wybrać zdjęcie, którego chcę użyć. Kiedy wybieram zdjęcie, pole obrazu w formularzu jest wypełniane następującą wartością:

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

Ale kiedy zapisuję dane widgetu formularza, pole obrazu ma następującą wartość: {{media url=

nic więcej. Jak mogę to rozwiązać?

mvistas
źródło
2
Problem dotyczył konfiguracji. W sekcji Konfiguracja> Ogólne> Zarządzanie treścią „Użyj statycznych adresów URL dla treści multimedialnych w WYSIWYG dla katalogu” Powinno być „tak”
mvistas
1
problem z tym podejściem polega na tym, że napotkasz problemy przy przenoszeniu z jednej env na drugą, ponieważ zakodowany obraz nie będzie działał
open-ecommerce.org

Odpowiedzi:

1

Jeśli chcesz załadować obraz, dlaczego nie użyć przycisku wyboru obrazu.?
Jeśli podoba Ci się edytor, użyj go, ale nie jest to właściwy sposób na przesłanie obrazu za pomocą edytora. Zamiast tego możesz użyć przycisku. Jeśli nie wiesz jak to zrobić. Pozwól mi wyjaśnić.

Oto mój kod. Poniższy kod jest zapisany w pliku bloku, który tworzy przycisk.

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

Obraz to nazwa pola bazy danych. W twoim przypadku jest to edytor wysiwyg. Nie znam dokładnego, ale po sprawdzeniu bazy danych.

Poniższy kod służy do zapisania obrazu w tabeli. Teraz umieść ten kod w swoim kontrolerze.

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

}

Następnie chcesz wywołać go w phtml dla wyniku .. więc poniżej wpisz kod w pliku phtml.
Oto kod.

    $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 () zapisuje w moim bloku. więc zgodnie z tym powinieneś zastosować jako plik bloku.
Mam nadzieję, że ci to pomoże. Jeśli masz jakieś zapytanie, daj mi znać.

Wisznu Salunke
źródło
Wywołałem wynik w pliku phtml przy użyciu menedżera obiektów. To nie jest właściwy sposób, ale nie chcę tutaj pisać więcej kodu. Dlatego właśnie go używam. Jeśli chcesz użyć metody fabrycznej, to będzie dobrze.
Wisznu Salunke,
0

Sprawdziłem kod i stwierdziłem, że kod do pobrania adresu URL obrazu z katalogu nie jest uwzględniony. Musisz nad tym popracować, aby rozwiązać ten problem. Brakuje kodu do dołączenia adresu URL obrazu.

Marc Feber
źródło
0

Za pomocą jquery możemy zapisać obraz w folderze.

W skrypcie napisz ten kod

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

Następnie w niestandardowym kontrolerze:

Przesyłanie klas rozszerza \ 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";
    }
}

}

zapoznaj się Jak zapisać przesyłany obraz do folderu w magento2?

Za pomocą obserwatora możesz uzyskać wartość obrazu w poście .. W polu wejściowym znacznik użyj data-form-part = "product_form".

Rita Jose
źródło