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)
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.
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
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:
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:
\Magento\Framework\View\Element\Template
, haben Sie bereits eine Instanz vonStoreManagerInterface
($this->_storeManager
).Ab Version 2.1 gibt es keine direkte Möglichkeit, die Medien-URL abzurufen, ohne:
Rakesh erwähnte einen Weg, dies zu tun.
Ein anderer Weg ist die geschützte Variable zu verwenden ,
$_urlBuilder
die für jeden Block enthalten ist , wie definiert in denAbstractBlock
: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php # L186Sie müssen also den Konstruktor Ihres Blocks nicht ändern und können einfach die folgende Methode hinzufügen:
Dann können Sie in Ihrer Vorlage Folgendes aufrufen:
quelle
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:
quelle
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:
Einmal aktiviert und kompiliert, können Sie es mit der folgenden Methode in Ihrer Vorlagendatei verwenden:
Ich hoffe, Sie (und möglicherweise andere) finden dies von großem Nutzen!
quelle
Zumindest in 2.2.6 können Sie verwenden
Magento\Framework\UrlInterface::getDirectUrl()
quelle