Magento 2, nouveau widget avec paramètre de sélection d'image, ne sauvegarde pas l'image


18

Je crée un nouveau widget et l'un des paramètres est un sélecteur d'image, j'utilise simplement ce code. Tout semble bien. Je peux ouvrir le dossier multimédia et choisir l'image que je souhaite utiliser. Lorsque je choisis l'image, le champ d'image du formulaire est rempli avec cette valeur:

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

Mais lorsque j'enregistre les données du widget de formulaire, le champ d'image a cette valeur: {{media url=

rien de plus. Comment puis-je résoudre ça?


2
Le problème était sur la configuration. Dans Configuration> Général> Gestion de contenu, "Utiliser des URL statiques pour le contenu multimédia dans WYSIWYG pour le catalogue" Cela devrait être "oui"
mvistas

1
le problème avec cette approche est que vous rencontrerez des problèmes pour passer d'un env à un autre car l'image codée en dur ne fonctionnera pas
open-ecommerce.org

Réponses:


1

Si vous souhaitez télécharger une image, alors pourquoi n'utilisez-vous pas le bouton de sélection d'image?
Si vous aimez l'éditeur, utilisez-le, mais ce n'est pas un bon moyen de télécharger une image à l'aide d'un éditeur.Vous pouvez utiliser le bouton à la place. Si vous ne savez pas comment faire. Laissez-moi expliquer.

Voici mon code. Le code ci-dessous est écrit dans un fichier bloc qui crée un bouton.

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

L'image est le nom du champ de la base de données. Dans votre cas, c'est l'éditeur wysiwyg. Je ne connais pas l'exacte mais vérifiez une fois dans votre base de données.

Le code ci-dessous est utilisé pour enregistrer l'image dans votre tableau. Maintenant, mettez ce code dans votre contrôleur.

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

}

Après cela, vous voulez l'appeler en phtml pour le résultat..donc ci-dessous écrire dans le fichier phtml.
Voici le code.

    $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 () est écrit dans mon block.so en fonction de cela, vous devez appliquer comme fichier de blocage.
J'espère que cela vous aide. Si vous avez des questions, faites-le moi savoir.


J'ai appelé un résultat dans un fichier phtml en utilisant object manager.it ne sera pas une bonne façon mais je ne veux pas écrire plus de code ici. C'est pourquoi je l'utilise.
Vishnu Salunke

0

J'ai vérifié le code et constaté que le code pour obtenir l'URL de l'image à partir du répertoire n'est pas inclus. Vous devez y travailler pour résoudre ce problème. Le code pour inclure l'URL de l'image est manquant.




0

En utilisant jquery, nous pouvons enregistrer l'image dans un dossier.

Dans le script, écrivez ce code

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

Ensuite, dans votre contrôleur personnalisé:

Le téléchargement de classe étend \ 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";
    }
}

}

veuillez vous reporter à Comment enregistrer un téléchargement d'image dans un dossier dans magento2?

Et en utilisant Observer, vous pouvez obtenir la valeur de l'image dans post..Dans la balise de champ de saisie, utilisez data-form-part = "product_form".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.