Magento2: получить медиа-URL в файле шаблона (без прямого вызова диспетчера объектов)

17

Как попасть Media URLв файл шаблона? Все, что я нашел, - это непосредственный вызов диспетчера объектов. Еще одна моя проблема. Можете ли вы когда-либо напрямую вызывать диспетчер объектов в качестве наилучшей практики? (потому что в большинстве решений они используют диспетчер объектов)

Вишвас Бхатнагар
источник

Ответы:

25

Вы можете получить URL-адрес мультимедиа в файле шаблона, используя следующий способ, но без использования objectmanager вы должны определить файл блока с помощью __construct()метода define storeManagerInterface в методе construct.

В вашем блочном файле phtml создайте функцию __construct.

public $ _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;

Это правильный способ получить медиа-URL в Magento 2.

Ракеш Джесадия
источник
4
Я считаю, что было бы лучше сделать эту переменную защищенной и создать метод получения, чтобы вместо этого получать URL-адрес мультимедиа
Рафаэль из Digital Pianism
Если ваш блок продолжается от \Magento\Framework\View\Element\Template, у вас уже есть экземпляр StoreManagerInterface( $this->_storeManager).
Эрфан
Я получил медиа-адрес. Но мне нужно отобразить изображение, соответствующее этому URL ... Если вы знаете, помогите мне разобраться в моей проблеме. Пожалуйста, обратитесь по ссылке ниже magento.stackexchange.com/questions/201961/…
Jaisa
14

Начиная с версии 2.1, нет прямого способа получить медиа-URL без:

  • вызов менеджера объектов напрямую (пожалуйста, не делайте этого)
  • переопределить блок и добавить новый метод

Ракеш упомянул один из способов сделать это.

Другой способ - использовать защищенную переменную, $_urlBuilderкоторая включена для каждого блока, как определено в AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock. # L186

Таким образом, вам не нужно изменять конструктор вашего блока, и вы можете просто добавить следующий метод:

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

Тогда в вашем шаблоне вы можете позвонить:

$block->getMediaUrl();
Рафаэль в цифровом пианизме
источник
4
Я думаю, что абсурдно, что я не могу просто получить путь к медиа в .phtml напрямую.
LucScu
@LucScu, это может быть обескуражен, конечно. Вероятно, не лучшая идея ссылаться на актив, который был загружен и не является частью кодовой базы. Это немного неприятно.
Эрфан
7

Если вы не хотите заниматься расширением \ Magento \ Framework \ View \ Element \ Template и хотите, чтобы ваш файл .phtml использовал блок \ Magento \ Framework \ View \ Element \ Template, тогда вы можете использовать этот ярлык:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()
ИГК
источник
Использование $ this-> helper () в файлах PHTML не рекомендуется и не рекомендуется
Вишвас Бхатнагар
5

Я собираюсь использовать ответ Рафаэля и расширить его - но вместо добавления метода в класс блока, почему бы не создать помощника и добавить его туда?

Начните с создания нового модуля обычным способом, а в корне создайте новую папку с именем «Помощник» и добавьте туда необходимый код:

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

Я надеюсь, что вы (и, возможно, другие) найдете это полезным!

Smithee
источник
Использование $ this-> helper () в файлах PHTML не рекомендуется и не рекомендуется
Вишвас Бхатнагар
1

По крайней мере, в 2.2.6 вы можете использовать Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
Вадим Кусакин
источник