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)

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.


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();

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()

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!


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]);
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.