Magento2: Dapatkan URL Media di File Templat (Tanpa Pengelola Obyek Panggilan langsung)

17

Bagaimana cara Mendapatkan Media URLdalam file Template? Semua solusi yang saya temukan adalah memanggil Object Manager secara langsung. Kekhawatiran saya yang lain, Bisakah Anda pernah memanggil manajer objek secara langsung sebagai praktik terbaik? (karena dalam sebagian besar solusi mereka menggunakan object manager)

Vishwas Bhatnagar
sumber

Jawaban:

25

Anda bisa mendapatkan url media dalam file templat menggunakan cara di bawah ini tetapi tanpa menggunakan objectmanager, Anda harus mendefinisikan file Block dengan __construct()metode dengan define storeManagerInterface dalam metode konstruk.

Dalam file Blok phtml Anda, buat fungsi __construct.

public $ _storeManager;

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

Dalam metode panggilan file phtml Anda di bawah ini untuk mendapatkan mediaurl,

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

echo $ mediaUrl;

Ini adalah cara yang tepat untuk mendapatkan url media di Magento 2.

Rakesh Jesadiya
sumber
4
Saya rasa itu akan menjadi cara yang lebih baik untuk membuat variabel itu terlindungi dan membuat metode pengambil untuk mengambil url media sebagai gantinya
Raphael di Digital Pianism
Jika blok Anda memanjang dari \Magento\Framework\View\Element\Template, Anda sudah memiliki instance dari StoreManagerInterface( $this->_storeManager).
Erfan
Saya mendapat url media. Tetapi saya perlu menampilkan gambar yang sesuai dengan url itu ... Jika Anda tahu bantu saya untuk menyelesaikan masalah saya. Silakan lihat tautan di bawah ini magento.stackexchange.com/questions/201961/…
Jaisa
14

Pada 2.1, tidak ada cara langsung untuk mendapatkan URL media tanpa:

  • memanggil pengelola objek secara langsung (tolong jangan lakukan itu)
  • timpa blok dan tambahkan metode baru

Rakesh menyebutkan satu cara untuk melakukannya.

Cara lain adalah dengan menggunakan variabel $_urlBuilderyang dilindungi yang disertakan untuk setiap blok seperti yang didefinisikan dalam AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/ApstractBlock.php. # L186

Dengan demikian Anda tidak perlu memodifikasi konstruktor blok Anda dan cukup menambahkan metode berikut:

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

Kemudian dalam templat Anda, Anda dapat menghubungi:

$block->getMediaUrl();
Raphael di Digital Pianism
sumber
4
saya pikir itu tidak masuk akal bahwa saya tidak bisa hanya mengambil jalur media di .phtml secara langsung.
LucScu
@LucScu mungkin berkecil hati, pasti. Mungkin bukan ide terbaik untuk merujuk aset yang telah diunggah dan bukan bagian dari basis kode. Rasanya agak tidak enak melakukannya.
Erfan
7

Jika Anda tidak ingin repot-repot memperluas \ Magento \ Framework \ View \ Element \ Template, dan Anda ingin file .phtml Anda menggunakan blok \ Magento \ Framework \ View \ Element \ Template, maka Anda dapat menggunakan pintasan ini:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()
kig
sumber
Menggunakan $ this-> helper () dalam file PHTML sudah ditinggalkan dan tidak disarankan
Vishwas Bhatnagar
5

Saya akan menggunakan jawaban Raphael dan memperluasnya - tetapi alih-alih menambahkan metode ke dalam kelas blok, mengapa tidak membuat pembantu dan menambahkannya di sana?

Mulailah dengan membuat modul baru dengan cara biasa, dan di dalam root, buat folder baru yang disebut "Helper" dan tambahkan kode yang diperlukan di sana:

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

}

Setelah diaktifkan dan dikompilasi, Anda akan dapat menggunakannya dalam file template Anda menggunakan metode berikut:

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

Saya harap Anda (dan berpotensi orang lain) menemukan ini sangat bermanfaat!

Smithee
sumber
Menggunakan $ this-> helper () dalam file PHTML sudah ditinggalkan dan tidak disarankan
Vishwas Bhatnagar
1

Paling tidak di 2.2.6, Anda bisa menggunakan Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
Vadim Kusakin
sumber