Directive d'image Magento 2 WYSIWYG Media utilisant l'URL d'administration

15

Pourquoi magento 2 crée-t-il des directives pour les images multimédias à l'aide de l'URL d'administration?

par exemple, lorsque j'ajoute une image sur la page de catégorie WYSIWYG, elle ajoute

<img src="{{media url="wysiwyg/image.jpg"}}" alt="" />

mais magento analyse le frontend et est comme ça

<img src="https://domain.co.uk/admin/cms/wysiwyg/directive/___directive/e3ttZWRpYSB1cmw9Ind5c2l3eWcvQ29udmV5b3JfYmVsdHNfZmFzdF9kZWxpdmVyeS5qcGcifX0,/key/b67d0a8069ef28a8443e0bad6d912512704213d60e1d9021b1ec2b9dd34bf390/" alt="">

car sa liaison à l'administrateur ne se chargera sur le navigateur que si vous êtes connecté à l'administrateur. Cela pose également un problème de sécurité car il révèle le chemin d'administration sur le frontend.

J'ai regardé dans vendor / magento / module-cms / Helper // Wysiwyg / images.php et on dirait que la fonction getImageHtmlDeclaration () génère ceci

   public function getImageHtmlDeclaration($filename, $renderAsTag = false)
    {
        $fileurl = $this->getCurrentUrl() . $filename;
        $mediaUrl = $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);
        $mediaPath = str_replace($mediaUrl, '', $fileurl);
        $directive = sprintf('{{media url="%s"}}', $mediaPath);
        if ($renderAsTag) {
            $html = sprintf('<img src="%s" alt="" />', $this->isUsingStaticUrlsAllowed() ? $fileurl : $directive);
        } else {
            if ($this->isUsingStaticUrlsAllowed()) {
                $html = $fileurl; // $mediaPath;
            } else {
                $directive = $this->urlEncoder->encode($directive);
                $html = $this->_backendData->getUrl('cms/wysiwyg/directive', ['___directive' => $directive]);
            }
        }
        return $html;
    }

J'ai essayé d'utiliser des URL statiques pour les médias, mais toujours pas utile, donc le seul moyen de contourner ce problème est de modifier cette fonction pour utiliser l'URL frontend au lieu du backend / admin

toute aide à ce sujet serait très appréciée :)

Steve B
la source
Les images dans l'éditeur wysiwyg semblent utiliser les URL «admin / cms / wysiwyg / directive» lorsque vous regardez les balises dans la fenêtre «Modifier la source HTML», mais sur le frontend, vous devriez voir un «pub / static / wysiwyg / 'URL pour ces mêmes images.
Aaron Allen
la directive admin / cms / wysiwyg / est en frontend sur mon installation de magento 2
Steve B
Je fais face au même problème. Magento 2.1.2 WYSIWYG crée également pour moi des URL d'administration pour les images.
Ejaz
des nouvelles à ce sujet?
simonthesorcerer
2
Après plusieurs heures cette dernière nuit, la meilleure recommandation (certainement pas une solution) à ce sujet est de cliquer sur le bouton "Afficher / Masquer l'éditeur" avant d'enregistrer. En désactivant l'éditeur WYSIWYG, Magento convertira l'URL de la directive au {{media url="wysiwyg/some-image.jpg"}}format auquel nous nous attendions à Magento
Darren Felton

Réponses:

8

Il s'agit d'un bug connu qui est toujours présent dans CE 2.1.5.

Le correctif connu consiste à ajouter 'add_directives' => trueà la getConfigfonction de vendor/magento/module-cms/Model/Wysiwyg/Config.php.

La meilleure façon de le faire est d'écrire un intercepteur .

  1. Dans le etc/di.xmlfichier de votre extension Magento 2 personnalisée :

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
      <type name="Magento\Cms\Model\Wysiwyg\Config">
       <plugin name="add_wysiwyg_data" type="Vendor\Module\Plugin\WysiwygConfig" sortOrder="30" />
      </type>
    </config>
  2. Vendor\Module\Plugin\WysiwygConfig.php:

    namespace Vendor\Module\Plugin;
    
    class WysiwygConfig
    {
     public function afterGetConfig($subject, \Magento\Framework\DataObject $config)
     {
       $config->addData([
        'add_directives' => true,
       ]);
    
       return $config;
     }
    }
  3. Installez-le php bin/magento setup:upgrade

  4. Important: après l'installation, vous devez modifier à nouveau les descriptions des catégories concernées et télécharger à nouveau les images.

L'idée de cette extension de correctif n'est pas la mienne mais ce mec . Il a également tout emballé sur github pour que vous puissiez le télécharger .

Je l'ai testé moi-même sur CE 2.1.4 et cela fonctionne très bien.

Konstantin Gerasimov
la source
3

La solution la plus simple consiste à mettre à jour la getImageHtmlDeclaration()fonction dansvendor/magento/module-cms/Helper//Wysiwyg/images.php

public function getImageHtmlDeclaration($filename, $renderAsTag = false)
{
    $fileurl = $this->getCurrentUrl() . $filename;
    $mediaUrl = $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);
    $mediaPath = str_replace($mediaUrl, '', $fileurl);
    $directive = sprintf('{{media url="%s"}}', $mediaPath);
    if ($renderAsTag) {
        $html = sprintf('<img src="%s" alt="" />', $this->isUsingStaticUrlsAllowed() ? $fileurl : $directive);
    } else {
         $html = $fileurl;
        //if ($this->isUsingStaticUrlsAllowed()) {
        //    $html = $fileurl; // $mediaPath;
        //} else {
        //    $directive = $this->urlEncoder->encode($directive);
        //    $html = $this->_backendData->getUrl('cms/wysiwyg/directive', ['___directive' => $directive]);
        //}
    }
    return $html;
}

Ce n'est peut-être pas la meilleure approche, mais cela fonctionne.

Vainqueur
la source
1

J'ai le même problème avec CE 1.9 Et voici la solution: l'idée est d'essayer de changer la variable $ html (vous pouvez utiliser Di, Plugin ou Patch packagist.org/packages )

Magento \ Cms \ Helper \ Wysiwyg \ Images.php ligne 180

$html = $this->_backendData->getUrl('cms/wysiwyg/directive', ['___directive' => $directive]);

remplacer pour

$html = $this->_backendData->getUrl(
                'cms/wysiwyg/directive',
                [
                    '___directive' => $directive,
                    '_escape_params' => false,
                ]
            );

Référez: github.com/PieterCappelle

Junior
la source
0

Dans le fichier etc / di.xml de votre extension Magento 2 personnalisée:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Observer\CatalogCheckIsUsingStaticUrlsAllowedObserver">
        <plugin name="cms_wysiwyg_images_static_urls_allowed_plugin" type="Vendor\Module\Plugin\CatalogCheckIsUsingStaticUrlsAllowedObserver" sortOrder="10" disabled="false"  />
    </type>
</config>

Vendor \ Module \ Plugin \ CatalogCheckIsUsingStaticUrlsAllowedObserver.php

namespace Vendor\Module\Plugin;

class CatalogCheckIsUsingStaticUrlsAllowedObserver
{
    public function aroundExecute(
        \Magento\Catalog\Observer\CatalogCheckIsUsingStaticUrlsAllowedObserver $subject, 
        \Closure $proceed, 
        $observer)
    {
        $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();        
        $storeManager  = $objectManager->get('\Magento\Store\Model\StoreManagerInterface');
        $catalogData  = $objectManager->get('\Magento\Catalog\Helper\Data');
        $storeID = $storeManager->getStore()->getStoreId(); 
        $result = $observer->getEvent()->getData('result');
        $result->isAllowed = $catalogData->setStoreId($storeID)->isUsingStaticUrlsAllowed();
    }
}

Travailler pour moi!

Développeur Magento
la source