Magento2: Medien-URL in Vorlagendatei abrufen (ohne direkten Aufruf von Object Manager)

15

Wie komme Media URLich in eine Vorlagendatei? Alles, was ich gefunden habe, ist, den Objekt-Manager direkt aufzurufen. Mein weiteres Anliegen: Können Sie den Objektmanager jemals direkt als Best Practice bezeichnen? (weil sie in den meisten Fällen den Objekt-Manager verwenden)

Vishwas Bhatnagar
quelle

Antworten:

23

Sie können die Medien-URL in Ihrer Vorlagendatei wie folgt abrufen. Ohne Verwendung von objectmanager müssen Sie jedoch Block file with __construct()method mit define storeManagerInterface in construct method definieren.

Erstellen Sie in Ihrer HTML-Blockdatei die Funktion __construct.

public $ _storeManager;

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

Rufen Sie in Ihrer HTML-Datei die folgende Methode auf, um mediaurl abzurufen:

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

echo $ mediaUrl;

Dies ist die richtige Methode, um die Medien-URL in Magento 2 abzurufen.

Rakesh Jesadiya
quelle
4
Ich denke, es wäre viel besser, diese Variable geschützt zu machen und stattdessen eine Getter-Methode zu erstellen, um die Medien-URL abzurufen
Raphael bei Digital Pianism,
Wenn sich Ihr Block von erstreckt \Magento\Framework\View\Element\Template, haben Sie bereits eine Instanz von StoreManagerInterface( $this->_storeManager).
Erfan,
Ich habe eine Medien-URL. Aber ich muss das Bild anzeigen, das dieser URL entspricht ... Wenn Sie wissen, helfen Sie mir, mein Problem zu lösen. Bitte beziehen Sie sich auf den folgenden Link: magento.stackexchange.com/questions/201961/…
Jaisa
14

Ab Version 2.1 gibt es keine direkte Möglichkeit, die Medien-URL abzurufen, ohne:

  • den Objektmanager direkt anrufen (bitte nicht tun)
  • Überschreiben Sie den Block und fügen Sie eine neue Methode hinzu

Rakesh erwähnte einen Weg, dies zu tun.

Ein anderer Weg ist die geschützte Variable zu verwenden , $_urlBuilderdie für jeden Block enthalten ist , wie definiert in den AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php # L186

Sie müssen also den Konstruktor Ihres Blocks nicht ändern und können einfach die folgende Methode hinzufügen:

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

Dann können Sie in Ihrer Vorlage Folgendes aufrufen:

$block->getMediaUrl();
Raphael bei Digital Pianism
quelle
4
Ich finde es absurd, dass ich nicht einfach den Medienpfad in .phtml direkt abrufen kann.
LucScu
@ LucScu es könnte sicher entmutigt sein. Wahrscheinlich nicht die beste Idee, auf ein hochgeladenes Asset zu verweisen, das nicht Teil der Codebasis ist. Es fühlt sich ein bisschen böse an.
Erfan
6

Wenn Sie nicht die Mühe machen möchten, \ Magento \ Framework \ View \ Element \ Template zu erweitern, und Ihre .phtml-Datei den Block \ Magento \ Framework \ View \ Element \ Template verwenden soll, können Sie verwenden diese Abkürzung:

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

Ich werde Raphaels Antwort verwenden und erweitern - aber anstatt die Methode in die Blockklasse einzufügen, warum nicht einen Helfer erstellen und ihn dort einfügen?

Beginnen Sie, indem Sie wie gewohnt ein neues Modul erstellen. Erstellen Sie im Stammverzeichnis einen neuen Ordner mit dem Namen "Helper" und fügen Sie den erforderlichen Code hinzu:

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

}

Einmal aktiviert und kompiliert, können Sie es mit der folgenden Methode in Ihrer Vorlagendatei verwenden:

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

Ich hoffe, Sie (und möglicherweise andere) finden dies von großem Nutzen!

Smithee
quelle
1

Zumindest in 2.2.6 können Sie verwenden Magento\Framework\UrlInterface::getDirectUrl()

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