Magento 2 WYSIWYG媒体图片指令,使用管理员网址


15

为什么magento 2使用管理URL为媒体图像创建指令?

例如,当我在“所见即所得”类别页面上添加图片时,它会添加

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

但是,magento将其解析为前端,就像这样

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

因为它链接到admin的唯一方法是如果您登录到admin,它将在浏览器上加载。这也带来了安全问题,因为它在前端公开了管理员路径。

我查看了vendor / magento / module-cms / Helper // Wysiwyg / images.php,看起来像函数getImageHtmlDeclaration()生成了这个

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

我尝试对媒体使用静态网址,但仍然没有用,所以我能想到的唯一解决方法是编辑此功能以使用前端网址而不是后端/管理员

任何帮助,将不胜感激:)


当您在“编辑HTML源代码”窗口中查看标记时,所见即所得编辑器中的图像似乎使用了“ admin / cms / wysiwyg / directive” URL,但是在前端,您应该会看到“ pub / static / wysiwyg / '相同图像的URL。
亚伦·艾伦

在我的magento 2安装中,admin / cms / wysiwyg / directive位于前端
Steve B

我面临着同样的问题。Magento 2.1.2所见即所得也在为我创建图像的管理URL。
Ejaz

有什么消息吗?
simonthesorcerer

2
在昨晚经过多个小时之后,对此的最佳建议(肯定不是解决方案)是在保存之前单击“显示/隐藏编辑器”按钮。关闭WYSIWYG编辑器时,Magento会将指令URL转换为{{media url="wysiwyg/some-image.jpg"}}我们在Magento中所期望的格式
Darren Felton

Answers:


8

这是一个已知的错误,仍在CE 2.1.5中存在。

已知的修复方法是添加'add_directives' => true到的getConfig功能vendor/magento/module-cms/Model/Wysiwyg/Config.php

最好的方法是编写一个拦截器

  1. 在您自定义的Magento 2扩展名的etc/di.xml文件中:

    <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. 安装它 php bin/magento setup:upgrade

  4. 重要提示:安装后,您需要重新编辑受影响的类别描述并重新上传图像。

这个修复扩展的想法不是我的,而是这个家伙。他还将所有内容打包在github上供您下载

我自己在CE 2.1.4上进行了测试,并且效果很好。


3

最简单的解决方案是getImageHtmlDeclaration()vendor/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;
}

这可能不是最好的方法,但是可以。


1

我在CE 1.9上遇到了同样的问题,这是解决方案:这个想法试图更改变量$ html(您可以使用Di,Plugin或Patch packagist.org/packages

Magento \ Cms \ Helper \ Wysiwyg \ Images.php第180行

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

替换为

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

参考:github.com/PieterCappelle


0

在您自定义的Magento 2扩展的etc / di.xml文件中:

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

供应商\模块\插件\目录检查IsUsingStaticUrlsAllowedObserver.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();
    }
}

为我工作!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.