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


18

Як потрапити Media URLу файл шаблону? Все знайдене нами рішення - безпосередньо викликати Менеджер об'єктів. Моя ще одна проблема: Чи можете ви коли-небудь безпосередньо називати менеджера об'єктів найкращою практикою? (тому що в більшості рішень вони використовують об’єкт-менеджер)

Відповіді:


26

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

У вашому файлі phtml Block створіть функцію __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
Я вважаю, що було б краще зробити цю змінну захищеною та створити метод getter для отримання URL-адреси медіа
Рафаель в Digital Pianism

Якщо ваш блок поширюється на \Magento\Framework\View\Element\Template, ви вже маєте примірник StoreManagerInterface( $this->_storeManager).
Ерфан

Я отримав URL-адресу медіа. Але мені потрібно показати зображення, відповідне цьому URL-адресу ... Якщо ви знаєте, допоможіть мені розібратися з моєю проблемою. Перейдіть за посиланням нижче magento.stackexchange.com/questions/201961/…
Jaisa

14

Станом на 2.1, немає прямого способу отримання медіа-адреси без будь-якого:

  • зателефонувавши безпосередньо до менеджера об'єктів (будь ласка, не робіть цього)
  • замініть блок і додайте новий метод

Ракеш згадав один із способів цього зробити.

Інший спосіб полягає у використанні захищеної змінної , $_urlBuilderяка включається для кожного блоку , як визначено в AbstractBlock: https://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

@LucScu це, безумовно, може не відштовхувати. Напевно, не найкраща ідея посилатися на завантажений ресурс і не є частиною кодової бази. Зробити це трохи неприємно.
Ерфан

7

Якщо ви не хочете піти на проблему з розширенням \ Magento \ Framework \ View \ Element \ Template, і ви хочете, щоб ваш файл .phtml використовував блок \ Magento \ Framework \ View \ Element \ Template, тоді ви можете використовувати ця ярлик:

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

Використання $ this-> помічник () в PHTML файлів є застарілим і НЕ рекомендується
Vishwas Бхатнагар

5

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

Почніть зі створення нового модуля звичайним способом, а в корені створіть нову папку під назвою "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" />

Я сподіваюся, що ви (і потенційно інші) знайдете це для великої користі!


Використання $ this-> помічник () в PHTML файлів є застарілим і НЕ рекомендується
Vishwas Бхатнагар

1

Принаймні в 2.2.6, ви можете використовувати Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.