Magento2:テンプレートファイルでメディアURLを取得(オブジェクトマネージャーを直接呼び出すことなく)


17

Media URLテンプレートファイルの取得方法 私が見つけた解決策はすべて、Object Managerを直接呼び出すことです。もう1つの懸念は、ベストプラクティスとしてオブジェクトマネージャーを直接呼び出すことはできますか?(ほとんどのソリューションでオブジェクトマネージャーを使用しているため)

回答:


25

以下の方法を使用してテンプレートファイルでメディアURLを取得できますが、objectmanagerを使用せずに、constructメソッドでstoreManagerInterface__construct()を定義するメソッドでブロックファイルを定義する必要があります。

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;

これは、Magento 2でメディアURLを取得する適切な方法です。


4
私はそれがその変数を保護しますし、代わりにメディアのURLを取得するために、getterメソッドを作成する方法良いだろう数える
デジタルPianismでラファエル

ブロックがから拡張され\Magento\Framework\View\Element\Templateている場合、既にStoreManagerInterface$this->_storeManager)のインスタンスがあります。
エルファン

メディアのURLを取得しました。しかし、私はそのURLに対応する画像を表示する必要があります...あなたが知っていれば私の問題を整理するのに役立ちます。リンクの下に参照してください magento.stackexchange.com/questions/201961/...
Jaisa

14

2.1の時点では、次のいずれかがなければメディアURLを直接取得する方法はありません。

  • オブジェクトマネージャを直接呼び出す(実行しないでください)
  • ブロックをオーバーライドし、新しいメソッドを追加します

ラケシュはそれを行う一つの方法に言及しました。

別の方法は$_urlBuilderhttpsAbstractBlock//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()

PHTMLファイルで$ this-> helper()を使用することは非推奨であり、推奨されません
Bhatnagar

5

Raphaelの答えを使用して拡張します-しかし、メソッドをブロッククラスに追加する代わりに、ヘルパーを作成してそこに追加してみませんか?

通常の方法で新しいモジュールを作成することから始め、ルート内で「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" />

あなた(そして潜在的には他の人)がこれを大いに役立つことを願っています!


PHTMLファイルで$ this-> helper()を使用することは非推奨であり、推奨されません
Bhatnagar

1

少なくとも2.2.6では、使用できます Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.