Magento 2, nuovo widget con parametro di selezione immagine, non salva l'immagine


18

Creo un nuovo widget e uno dei parametri è un selettore di immagini, utilizzo solo questo codice. Sembra tutto a posto. Posso aprire la cartella media e scegliere l'immagine che voglio usare. Quando scelgo l'immagine, il campo immagine nel modulo viene riempito con questo valore:

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

Ma quando salvo i dati del widget del modulo, il campo immagine ha questo valore: {{media url=

niente di più. Come posso risolvere questo?


2
Il problema riguardava la configurazione. In Configurazione> Generale> Gestione contenuto, "Usa URL statici per contenuti multimediali in WYSIWYG per catalogo" Dovrebbe essere "sì"
mvistas

1
il problema con questo approccio è che ti imbatterai in problemi nel passaggio da un env a un altro perché l'immagine codificata non funzionerà
open-ecommerce.org

Risposte:


1

Se vuoi caricare un'immagine, perché non usi il pulsante di selezione delle immagini?
Se ti piace l'editor, allora usalo, ma non è un modo corretto di caricare un'immagine usando un editor. Puoi invece usare il pulsante. Se non sai come farlo. Lasciatemi spiegare.

Ecco il mio codice Il codice seguente è scritto in un file di blocco che crea un pulsante.

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

L'immagine è il nome del campo del database. Nel tuo caso è l'editor wysiwyg. Non conosco l'esatto ma una volta controllo nel tuo database.

Il codice seguente viene utilizzato per salvare l'immagine nella tabella. Ora inserisci questo codice nel tuo controller.

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

}

Dopo di che vuoi chiamarlo in phtml per il risultato..quindi il codice qui sotto scrivi nel file phtml.
Ecco il codice.

    $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 () è scrivere nel mio block.so in base a ciò, è necessario applicare come file di blocco.
Spero che questo ti sia di aiuto. Se hai qualche domanda fammi sapere.


Ho chiamato un risultato nel file phtml usando object manager.it non sarà un modo corretto ma non voglio scrivere un altro codice qui. Ecco perché lo uso.Se si desidera utilizzare il metodo di fabbrica, allora andrà bene.
Vishnu Salunke l'

0

Ho controllato il codice e ho scoperto che il codice per ottenere l'URL dell'immagine dalla directory non è incluso. Devi lavorarci su per risolvere questo problema. Manca il codice per includere l'URL dell'immagine.




0

Usando jquery, possiamo salvare l'immagine in una cartella.

Nello script, scrivi questo codice

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

Quindi, nel tuo controller personalizzato:

Caricamento classe estende \ Magento \ Framework \ App \ Azione \ Azione {

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";
    }
}

}

si prega di fare riferimento Come salvare un caricamento di immagini in una cartella in magento2?

E usando l'osservatore, puoi ottenere il valore dell'immagine in post..Nel tag del campo di input usa data-form-part = "product_form".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.