Magento2:在模板文件中获取媒体URL(没有直接调用对象管理器)


Answers:


25

您可以通过以下方法在模板文件中获取媒体URL,但无需使用objectmanager,您必须使用在construct方法中__construct()使用define storeManagerInterface的方法来定义Block文件。

在您的phtml阻止文件中创建__construct函数。

公共$ _storeManager;

public function __construct(\Magento\Store\Model\StoreManagerInterface $storeManager)
{
       $this->_storeManager = $storeManager;
}

在以下方法的phtml文件调用中获取mediaurl,

$mediaUrl = $this ->_storeManager-> getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA );

echo $ mediaUrl;

这是在Magento 2中获取媒体URL的正确方法。


4
我认为最好是对该变量进行保护,并创建一种用于获取媒体URL的getter方法
拉斐尔在Digital Pianism

如果您的代码块从扩展\Magento\Framework\View\Element\Template,则您已经有StoreManagerInterface$this->_storeManager)的实例。
Erfan

我得到了媒体网址。但是我需要显示与该URL对应的图像...如果您知道,请帮助我解决我的问题。请参考下面的链接 magento.stackexchange.com/questions/201961/…–
Jaisa

14

从2.1版本开始,没有任何一种获取媒体URL的直接方法:

  • 直接调用对象管理器(请不要这样做)
  • 覆盖块并添加新方法

Rakesh提到了一种方法。

另一种方法是使用受保护的变量$_urlBuilder被包括为每一个块中的定义,AbstractBlockhttps://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php #L186

因此,您不必修改块的构造函数,只需添加以下方法即可:

public function getMediaUrl() {
    return $this->_urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]);
}

然后,您可以在模板中调用:

$block->getMediaUrl();

4
我认为不能直接在.phtml中检索媒体路径是荒谬的。
LucScu '17

@LucScu可能会阻止它。引用已上载且不属于代码库的资产可能不是最好的主意。这样做有点令人讨厌。
Erfan

7

如果您不想麻烦扩展\ Magento \ Framework \ View \ Element \ Template,并且希望.phtml文件使用块\ Magento \ Framework \ View \ Element \ Template,则可以使用这个捷径:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()

不建议在PHTML文件中使用$ this-> helper()
Vishwas Bhatnagar

5

我将使用Raphael的答案并将其扩展-但是为什么不将方法添加到block类中,为什么不创建一个帮助器并将其添加到其中呢?

首先以通常的方式创建一个新模块,然后在根目录中创建一个名为“ Helper”的新文件夹,并在其中添加所需的代码:

namespace YourSite\YourModule\Helper;
use Magento\Framework\UrlInterface;
class Url extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function getMediaPath() {
        return $this->_urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }

}

激活并编译后,您将可以使用以下方法在模板文件中使用它:

<?php $url = $this->helper('\YourSite\YourModule\Helper\Url'); ?>
<img src="<?php echo $url->getMediaPath() ?>wysiwyg/image.jpg" />

希望您(还有可能其他人)发现它很有用!


不建议在PHTML文件中使用$ this-> helper()
Vishwas Bhatnagar

1

至少在2.2.6中,您可以使用 Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
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.